i'm making 2-player maze runner game, , have come trouble keyboard events. if both players hit key @ same time, player 1 moves, because code tests player1's events first. there way in python , pygame check both events simultaneously? here's part of player1 class:
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
sorry block of code, necessary understand how works. have identical class player 2, different keyboard controls(wasd instead of arrow keys).
i define player1 , player2 classes:
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)
then update , draw them:
p1.update( current_level.object_list, event ) p2.update( current_level.object_list, event ) event = none player_object_list.draw( window )
to conclude: code, keyboard controlled movement works fine, doesn't check both players' keyboard events @ same time, if both press key @ same time, player1 detects event because updates before player2:
p1.update( current_level.object_list, event ) p2.update( current_level.object_list, event )
thanks in advance,
derek
keeping comments above in mind, let's take shot @ solution. first of all, want make code little more general, , perhaps easier on eyes: use look-up table move translation.
move_translate = { pygame.k_left: (-1, 0), pygame.k_right: (1, 0), pygame.k_up: (0, -1), pygame.k_down: (0, 1) } if event not none: if event.type == pygame.keydown: if event.key in move_translate: # dictionary.get() improve this, # if want advance 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, have retire event processed. # pass out of first check no event. # check in event queue, player 2. # after check, can update display.
does move toward solution? depending on queue , interactions you're using, may able put event checks loop handles events time tick.