1
votes

earlier my sprite wouldn't move at all so i posted the code and i got it fixed for the most part but now my up/down arrows work fine but my right key doesn't work. (Also, when you press two keys, and then let go of one, the walk animation doesn't work, but I'm not desperate right now to get that fixed.) Also i would prefer not to use user made classes. thanks in advance. Here is the code:

from pygame.locals import *
import pygame._view

pygame.init()
clock = pygame.time.Clock()

height = 500
width = 500
screen = pygame.display.set_mode((width, height), 0, 32)
pygame.display.set_caption('placeholder text')

photo = 'grassbackground.png'
background = pygame.image.load(photo).convert()

rectexist = False

photo1 = 1

user = pygame.sprite.Sprite()

change = False

up = False
down = False
left = False
right = False

speed = 5

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_UP:
                up = True
                change = True
            if event.key == K_DOWN:
                down = True
                change = True
            if event.key == K_LEFT:
                left = True
                change = True
            if event.type == K_RIGHT:
                right = True
                change = True

        if event.type == KEYUP:
            if event.key == K_UP:
                up = False
                change = False
            if event.key == K_DOWN:
                down = False
                change = False
            if event.key == K_LEFT:
                left = False
                change = False
            if event.key == K_RIGHT:
                right = False
                change = False

    if down and user.rect.bottom < height:
        user.rect.top += speed
    if up and user.rect.top > 0:
        user.rect.top -= speed
    if left and user.rect.left > 0:
        user.rect.left -= speed
    if right and user.rect.right < width:
        user.rect.right += speed

   if change == True:
        pygame.time.wait(110)
        photo1 += 1

    if change == False:
        photo1 = 1

    if photo1 == 1:
        user.image = pygame.image.load("1.png").convert()
        if rectexist == False:
            user.rect = user.image.get_rect()
        rectexist = True
        screen.blit(user.image, user.rect)

    if photo1 == 2:
        user.image = pygame.image.load("2.png").convert()
        screen.blit(user.image, user.rect)

    if photo1 == 3:
        user.image = pygame.image.load("3.png").convert()
        screen.blit(user.image, user.rect)

    if photo1 >= 4:
        photo1 = 1

    thesprites = pygame.sprite.RenderPlain((user))
    thesprites.update()

    screen.blit(background, (0, 0))
    thesprites.draw(screen)

    pygame.display.update()
    clock.tick(60)
2

2 Answers

2
votes

In your code it says:

if event.type == K_RIGHT:

it should be:

if event.key == K_RIGHT:

To keep animating you'd need to change the code a little more, add a:

key_pressed = []

in the beginning. Then for each key-press block do:

key_pressed.append(event.key)

and key-release do:

key_pressed = [k for k in key_pressed if k != event.key]

instead of the change=True and change=False respectively. Then after the two segments of checking what was pressed and released have add these lines:

if len(key_pressed) > 0:
    change = True
else:
    change = False

That should fix most of your issues...

0
votes

Use pressed = pygame.key.get_pressed() to get a dictionary (a tuple, actually, but the way things are structured you can think of it as a dictionary) of all keys that are currently pressed. You'd use it like this:

pressed = pygame.key.get_pressed()
if pressed[K_LEFT]:
    # move left
elif pressed[K_RIGHT]:
    # move right
# etc