python 2.7 - Optimizing Keyboard Input in Pygame -


i creating simple game using pygame library in player moves square around screen arrow keys. unfortunately, response of controls proving problem.

the controls work fine until switch direction e.g. left right. when player switches direction, square player controlling jars halt.

the code controls looks in game:

def move(self, event):     speed = 6     if event.type == pygame.keydown:         if event.key == pygame.k_left:             self.rect.x -= speed         if event.key == pygame.k_right:             self.rect.x += speed         if event.key == pygame.k_down:             self.rect.y += speed         if event.key == pygame.k_up:             self.rect.y -= speed 

this method located in class called block (i stole block pygame docs) makes sprite player alongside providing movement.

the function move() called inside main.py file this:

while going:     clock.tick(60)      # event handling     event in pygame.event.get():         if event.type == quit:             going = false      # controller input     player.move(event) 

where player instance of block class , event item event queue of game.

i tried using pygame.key.get_pressed function (which did work better) rather use pygame.keydown locals alternatively because returns key presses events in event queue rather booleans returned list.

if more investigative average joe can take @ "full" game here: https://github.com/catmes/project_react

you need pygame 1.9.2 , python 2.7. keep in mind game more learning exercise don't surprised when see bad code (that fixed later of course ;) ).

thanks stopping , giving question peek, appreciate time.

i've tried out smooth way move around player works pretty well. keeps track of key presses in list , moves player based on last key pressed. when press key it'll add speed variable @ first position in list, , when release key it'll remove variable. in update method you'll add first speed variable of list corresponding x , y value.

import pygame pygame.init()  screen = pygame.display.set_mode((720, 480))  class player(pygame.sprite.sprite):      def __init__(self):         super(player, self).__init__()         self.rect = pygame.rect((0, 0), (32, 32))         self.image = pygame.surface((32, 32))         self.image.fill((255, 255, 255))         self.velocity = [0, 0]  # it's current velocity.         self.speed = 4  # speed player move.         self.dx = []  # keeps track of horizontal movement.         self.dy = []  # keeps track of vertical movement.      def update(self):         try:             self.rect.x += self.dx[0]  # index error if list empty.         except indexerror:             self.rect.x += 0         try:             self.rect.y += self.dy[0]  # index error if list empty.         except indexerror:             self.rect.y += 0  player = player() while true:     event in pygame.event.get():         if event.type == pygame.quit:             raise systemexit         elif event.type == pygame.keydown:             if event.key == pygame.k_a:                 player.dx.insert(0, -player.speed)             elif event.key == pygame.k_d:                 player.dx.insert(0, player.speed)             elif event.key == pygame.k_w:                 player.dy.insert(0, -player.speed)             elif event.key == pygame.k_s:                 player.dy.insert(0, player.speed)         elif event.type == pygame.keyup:             if event.key == pygame.k_a:                 player.dx.remove(-player.speed)             elif event.key == pygame.k_d:                 player.dx.remove(player.speed)             elif event.key == pygame.k_w:                 player.dy.remove(-player.speed)             elif event.key == pygame.k_s:                 player.dy.remove(player.speed)      player.update()     screen.fill((0, 0, 0))     screen.blit(player.image, player.rect)     pygame.display.update()      # print player.dx, player.dy  # uncomment see what's happening in action! 

Comments