[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] pygame.key.get_pressed() works unpredictably



Hello,

pygame.key.get_pressed() shouldn't be used at the same time as pygame.event.get().

Just use pygame.event.get() instead.


cheers,



On Fri, Apr 6, 2018 at 3:03 AM, gmail aprekates <aprekates@xxxxxxxxx> wrote:
Greeting to all from Greece.

Trying to learn pygame i started with a simple
rect moving with keys that i've read in :
https://nerdparadise.com/programming/pygame/part1

The problem i get with the following code is that 
the rect moves as if i pressed a key more than one 
times. 


import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
is_blue = True
x = 30
y = 30
n = 1
pygame.key.set_repeat()
while not done:
        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                        done = True
                if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                        is_blue = not is_blue
        pressed = pygame.key.get_pressed()
        if pressed[pygame.K_UP]: y -= 3
        if pressed[pygame.K_DOWN]: y += 3
        if pressed[pygame.K_LEFT]: x -= 3
        if pressed[pygame.K_RIGHT]: x += 3

        screen.fill((0, 0, 0))
        
        if is_blue: color = (0, 128, 255)
        else: color = (255, 100, 0)
        pygame.draw.rect(screen, color, pygame.Rect(x, y, 60, 60))
        
        pygame.display.flip()


after a lot of testing i think pygame.key.get_pressed() works like that. it read kbd's state but that state has inertia! i mean it will keep its values for some time so if you  call key.get.pressed() too soon you'll get again the same state . i tried to simulate same behavior in SDL2 but no lack. but if i looked correctly pygames's src it relies on    SDL1. i dont know if that's related.  

So i'd like some feedback. I could correct the program with controling the frame rate with pygame.clock.

But i'd like to understand why in a basic tutorial a function like key.get_pressed with
plain semantics works so unpredictable.
Ref pages say:

(

pygame.key.get_pressed()
get the state of all keyboard buttons
get_pressed() -> bools

Returns a sequence of boolean values representing the state of every key on the keyboard. Use the key constant values to index the array. A True value means the that button is pressed.

)
But is vague how that 'state' is created , accessed and how it's changed. It 'feels' low level
stuff that involves how keyboard driver works .

Thanks.


chomwitt