Ключевые задачи сопоставления для игры на двоих
Я делаю игру для 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.
Приводит ли это вас к решению? В зависимости от очереди и взаимодействий, которые вы используете, вы можете поместить проверки событий в цикл, который обрабатывает все события для этого временного тика.