StarLord
StarLord

Reputation: 35

Pygame Key Hold Down

while True:

    pencere = pygame.display.set_mode((800,600))
    pygame.display.set_caption("Oyun")

    for olay in pygame.event.get():
        if olay.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()

    if keys[pygame.K_UP]:
        y -= 3
    if keys[pygame.K_DOWN]:
        y += 3
    if keys[pygame.K_LEFT]:
        x -= 3
    if keys[pygame.K_RIGHT]:
        x += 3

    pencere.fill(beyaz)
    pygame.draw.rect(pencere, mavi, (x, y, 40, 60))
    pygame.display.update()

When i press navigate buttons, the rectangle goes 3 pixel. But how would I make it so when I hold the keys down?

Upvotes: 0

Views: 409

Answers (3)

Weeble
Weeble

Reputation: 17930

You are reinitialising the pygame window every time round your loop with set_mode. Apparently this resets keyboard input too. (I'm actually surprised this doesn't make the whole window flicker or have other obvious effects.) You should only call set_mode once and you should do it before your main loop.

Upvotes: 2

James Huang
James Huang

Reputation: 876

I use a feature like this a lot in my pygame projects.

The basis of it is to set a variable to True if a key is pressed and false if it is released. When you call a function like move(), you will check if the movement variables are True or False.

If you pressed the right and left arrows at the same time, there would be no movement.

This is just some of the code I use. Since you are using up and down aswell, you should just add more event checks for up and down and the code should be good to go.

Code:

running = True
directions = {"right": False, "left": False}
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                directions['right'] = True
            elif event.key == pygame.K_LEFT:
                directions['left'] = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT:
                directions['right'] = False
            elif event.key == pygame.K_LEFT:
                directions['left'] = False
    if directions['right']:
        x += 3
    if directions['left']:
        x -= 3

Upvotes: 0

Henrique Andrade
Henrique Andrade

Reputation: 991

You can do

import time

key_1 = pygame.key.get_pressed()
time.sleep(0.5)
key_2 = pygame.key.get_pressed()

if key_1 == key_2:
    if key_1[pygame.K_UP]:
        y -= 3
    if key_1[pygame.K_DOWN]:
        y += 3
    if key_1[pygame.K_LEFT]:
        x -= 3
    if key_1[pygame.K_RIGHT]:
        x += 3

So x and y are updated only if one of the navigation keys is hold down

Upvotes: 0

Related Questions