Как вы разделяете экран от центра (по вертикали), чтобы сделать игру для двух игроков на питоне? - PullRequest
0 голосов
/ 30 декабря 2018

Итак, я программирую игру для двух игроков.Я пытаюсь сделать его разделенным экраном от центра (по вертикали), где у каждого игрока есть свой экран и работает его собственная игра.Это позволило бы им находиться на разных этапах игры.Например, если один выходит, другой не затрагивается.

В моей игре змея изначально имеет 5 шаров разных цветов и автоматически движется вверх.Пользователь должен переместить его вправо или влево, чтобы собрать правильный цветной шар, а затем столкнуться с правильным цветным блоком.Я хочу, чтобы это происходило на одном и том же экране, но два раза, что сделает игру для двух игроков.

Я не знаю, правильно ли я это объяснил.Пожалуйста, задавайте вопросы, если это не понятно.Любая помощь будет очень ценится.Спасибо!

1 Ответ

0 голосов
/ 02 января 2019

Во-первых, вы должны инкапсулировать состояние игры для каждой подигры.Затем, вместо того, чтобы рисовать сцены игры непосредственно на экране, нарисуйте их на отдельных поверхностях, а затем нарисуйте их на поверхности.

Вот простой пример:

import pygame
import pygame.freetype
import random

pygame.init()
FONT = pygame.freetype.SysFont(None, 32)

class Player(pygame.sprite.Sprite):
    def __init__(self, color, canvas, bindings):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.image.fill(color)
        self.rect = self.image.get_rect(center=canvas.get_rect().center)
        self.canvas = canvas
        self.bindings = bindings
        self.pos = pygame.Vector2(self.rect.topleft)

    def update(self):
        pressed = pygame.key.get_pressed()
        direction = pygame.Vector2()
        for key in self.bindings:
            if pressed[key]:
                direction += self.bindings[key]

        if direction.length() > 0: 
            direction.normalize_ip()
            self.pos += direction*4

        self.rect.topleft = self.pos
        self.rect.clamp_ip(self.canvas.get_rect())
        self.pos = self.rect.topleft

class Game(pygame.sprite.Sprite):
    def __init__(self, color, bg_color, bindings, left):
        super().__init__()
        self.bg_color = bg_color
        self.image = pygame.Surface((400, 600))
        self.image.fill(self.bg_color)
        self.rect = self.image.get_rect(left=0 if left else 400)
        self.player = Player(color, self.image, bindings)
        self.target = pygame.Vector2(random.randint(100, 300), random.randint(100, 500))
        self.stuff = pygame.sprite.Group(self.player)
        self.score = 0

    def update(self):
        self.stuff.update()
        self.image.fill(self.bg_color)
        self.stuff.draw(self.image)
        FONT.render_to(self.image, (190, 50), str(self.score), (200, 200, 200))
        pygame.draw.circle(self.image, (210, 210, 210), [int(v) for v in self.target], 5)
        if (self.player.rect.center - self.target).length() <= 20:
            self.score += 1
            self.target = pygame.Vector2(random.randint(100, 300), random.randint(100, 500))

def main():
    screen = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()
    player1_bindings = {
        pygame.K_w: pygame.Vector2(0, -1),
        pygame.K_a: pygame.Vector2(-1, 0),
        pygame.K_s: pygame.Vector2(0, 1),
        pygame.K_d: pygame.Vector2(1, 0)
    }
    player2_bindings = {
        pygame.K_UP: pygame.Vector2(0, -1),
        pygame.K_LEFT: pygame.Vector2(-1, 0),
        pygame.K_DOWN: pygame.Vector2(0, 1),
        pygame.K_RIGHT: pygame.Vector2(1, 0)
    }
    player1 = Game(pygame.Color('dodgerblue'), (30, 30, 30), player1_bindings, True)
    player2 = Game(pygame.Color('orange'), (80, 20, 30), player2_bindings, False)
    games = pygame.sprite.Group(player1, player2)

    while True:
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                return
        games.update()
        screen.fill((30, 30, 30))
        games.draw(screen)
        pygame.display.flip()
        clock.tick(60)


if __name__ == '__main__':
    main()

enter image description here

...