Ключевые задачи сопоставления для игры на двоих

Я делаю игру для 2-х игроков, и у меня возникли некоторые проблемы с клавиатурой. Если оба игрока нажимают клавишу одновременно, только игрок 1 перемещается, потому что мой код сначала проверяет события player 1. Есть ли способ в Python и Pygame для проверки обоих событий одновременно? Вот часть моего класса player 1:

class Player( pygame.sprite.Sprite ):
    def __init__( self ):
        super( Player, self ).__init__()
        self.size = self.w,self.h = 75,75
        self.image = pygame.Surface( ( self.size ) )
        self.image.fill( white )
        self.rect = self.image.get_rect()

        self.move_y = 0
        self.move_x = 0

        self.speed = 5

        self.player = True
        self.alive = True

        self.level = None



    def update( self, collidable = pygame.sprite.Group(), event = None ):

        self.rect.x += self.move_x
        self.rect.y += self.move_y

        if not ( event == None ):
            if ( event.type == pygame.KEYDOWN ):
                if ( event.key == pygame.K_LEFT ):
                    self.move_y = 0
                    self.move_x = -self.speed
                if ( event.key == pygame.K_RIGHT ):
                    self.move_y = 0
                    self.move_x = self.speed
                if ( event.key == pygame.K_UP ):
                    self.move_x = 0
                    self.move_y = -self.speed
                if ( event.key == pygame.K_DOWN ):
                    self.move_x = 0
                    self.move_y = self.speed

Извините за блок кода, но вам необходимо понять, как он работает. У меня есть почти идентичный класс для плеера 2, но с разными клавишами управления (WASD вместо клавиш со стрелками).

Я определяю свои классы player 1 и player2:

player_object_list = pygame.sprite.Group()

p1 = Player()
p1.set_position( 40, 725 )
p1.set_image(deadpool_icon)

p2 = Player2()
p2.set_position( 525, 725 )
p2.set_image(girl_bow)

Затем я обновляю и рисую их:

 p1.update( current_level.object_list, event )
 p2.update( current_level.object_list, event )
 event = None

 player_object_list.draw( window )

В заключение: с помощью этого кода, управляемое с клавиатуры движение работает нормально, но оно не проверяет события клавиатуры обоих игроков одновременно, поэтому, если оба нажимают клавишу одновременно, только player 1 обнаруживает событие, потому что оно обновляется до player2:

 p1.update( current_level.object_list, event )
 p2.update( current_level.object_list, event )

Заранее спасибо,

Дерек

1 ответ

Решение

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

move_translate = {
    pygame.K_LEFT: (-1, 0),
    pygame.K_RIGHT: (1, 0),
    pygame.K_UP: (0, -1),
    pygame.K_DOWN: (0, 1)
}

if event is not None:
    if event.type == pygame.KEYDOWN:
        if event.key in move_translate:
            # dictionary.get() will improve this, 
            #    if you want to advance that far in Python syntax
            self.move_x, self.move_y = move_translate[event.key]
            self.move_x *= self.speed
            self.move_y *= self.speed

    # Here, you have to retire the event you just processed.
    # Then pass out of the first check for no event.
    # Check for another in the event queue, for player 2.
    # After this check, you can update the display.

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

Другие вопросы по тегам