1

In my pygame movement system, how do i make it so when I press a key, then press another key so I go diagonally, and then release one of the keys, for it to continue in only that direction? I have tried multiple solutions and none have worked. code:

import pygame
screen = pygame.display.set_mode((1000,500))
pygame.display.set_caption("testing")
running=True
icon=pygame.image.load('example.png')
pygame.display.set_icon(icon)
pygame.init()
pygame.HWSURFACE
playerImg=pygame.image.load('player.png')
playerX=430
playerY=400
clock=pygame.time.Clock()
xchange=0
ychange=0 
def player ():
    screen.blit(playerImg,(playerX,playerY))
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_LEFT and event.type == pygame.KEYDOWN and not event.key==pygame.K_DOWN and not event.key==pygame.K_UP and not event.key==pygame.K_RIGHT:
                xchange=-0.1
            if event.key == pygame.K_LEFT and event.type == pygame.KEYDOWN and event.key == pygame.K_UP:
                xchange=-0.1
                ychange=-0.1
            if event.key == pygame.K_RIGHT and event.type == pygame.KEYDOWN and not event.key == pygame.K_DOWN and not event.key==pygame.K_UP and not event.key==pygame.K_LEFT:
                xchange=0.1
            if event.key == pygame.K_LEFT and event.type == pygame.KEYDOWN and event.key == pygame.K_UP:
                xchange=0.1
                ychange=-0.1
            if event.key == pygame.K_UP and event.type == pygame.KEYDOWN and not event.key == pygame.K_DOWN and not event.key==pygame.K_RIGHT and not event.key==pygame.K_RIGHT:
                ychange=-0.1
            if event.key == pygame.K_DOWN and event.type == pygame.KEYDOWN and not event.key == pygame.K_UP and not event.key==pygame.K_LEFT and not event.key==pygame.K_RIGHT:
                ychange=0.1
            if event.key == pygame.K_LEFT and event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN:
                xchange=-0.1
                ychange=0.1
            if event.key == pygame.K_RIGHT and event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN:
                xchange=0.1
                ychange=0.1           
        if event.type == pygame.KEYUP:
            xchange=0
            ychange=0
    clock.tick(500)
    screen.fill((0, 50, 90))
    player()
    playerY+=ychange
    playerX+=xchange
    pygame.key.get_pressed()
    pygame.display.update()

done in visual studio code

1 Answers1

1

Use pygame.key.get_pressed() rather than the keyboard events.

The keyboard events (see pygame.event module) occur only once when the state of a key changes. The KEYDOWN event occurs once every time a key is pressed. KEYUP occurs once every time a key is released. Use the keyboard events for a single action or a step-by-step movement.

pygame.key.get_pressed() returns a list with the state of each key. If a key is held down, the state for the key is True, otherwise False. Use pygame.key.get_pressed() to evaluate the current state of a button and get continuous movement:

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running=False

    keys = pygame.key.get_pressed()
    xchange = 0.0
    ychange = 0.0 
    if keys[pygame.K_LEFT]: 
        xchange -= 0.1 
    if keys[pygame.K_RIGHT]: 
        xchange += 0.1 
    if keys[pygame.K_UP]: 
        ychange -= 0.1 
    if keys[pygame.K_DOWN]: 
        ychange += 0.1 
    playerX += xchange
    playerY += ychange
    
    screen.fill((0, 50, 90))
    player()
    pygame.display.update()
    clock.tick(500)

This code can be further simplified:

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running=False

    keys = pygame.key.get_pressed()
    playerX += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * 0.1
    playerY += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * 0.1 
    
    screen.fill((0, 50, 90))
    player()
    pygame.display.update()
    clock.tick(500)
Rabbid76
  • 202,892
  • 27
  • 131
  • 174