1

I am working on a christmas pygame game and I'm trying to have a bag move and keep moving when I press the left or right arrow keys. There is no error but when I press the keys nothing happens. Any idea what I'm doing wrong? Heres the code thanks!:

import pygame
import sys

width = 1024
height = 768

left = (-1, 0)
right = (1, 0)

sprite1 = pygame.image.load("Firstpygamegame/santabag2.png")

icon1 = pygame.image.load("Firstpygamegame/santa-claus.png")
pygame.display.set_icon(icon1)

screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Gift Catcher")
background_image = pygame.image.load("Firstpygamegame/wintervillage.png")
running = True
while running:
    screen.blit(background_image, (0, 0))
    screen.blit(sprite1, (0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if pygame.key == pygame.K_RIGHT:
                rect = sprite1.get_rect()
                rect = rect.move((1, 0))
                screen.blit(sprite1, rect)
            elif pygame.key == pygame.K_LEFT:
                rect = sprite1.get_rect()
                rect = rect.move((-1, 0))
                screen.blit(sprite1, rect)
    pygame.display.flip()

1 Answers1

1

There are some mistakes. The first mistake is a typo. It has to be event.key rather than pygame.key.

Also, you must blit the sprite in the application loop, not the event loop, in the location stored in rect. Get the rectangle (rect) before the loop. Move the rectangle in the event loop and blit the sprite in every frame at rect:

rect = sprite1.get_rect()

running = True
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:
                rect = rect.move(1, 0)
            elif event.key == pygame.K_LEFT:
                rect = rect.move(-1, 0)
              
    screen.blit(background_image, (0, 0)) 
    screen.blit(sprite1, rect)
    pygame.display.flip()

pygame.quit()
exit()

Note, you can use move_ip() rather than move:

rect = rect.move((-1, 0))

rect.move_ip(-1, 0)

However, use pygame.key.get_pressed() for a continuous movement:

rect = sprite1.get_rect()
speed = 1

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    keys = pygame.key.get_pressed()
    rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * speed
    rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * speed
              
    screen.blit(background_image, (0, 0)) 
    screen.blit(sprite1, rect)
    pygame.display.flip()

pygame.quit()
exit()

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.


Complete example:

import pygame

icon1 = pygame.image.load("Firstpygamegame/santa-claus.png")
pygame.display.set_icon(icon1)

screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Gift Catcher")
clock = pygame.time.Clock()
background_image = pygame.image.load("Firstpygamegame/wintervillage.png")

sprite1 = pygame.image.load("Firstpygamegame/santabag2.png")
rect = sprite1.get_rect()
speed = 1

running = True
while running:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    keys = pygame.key.get_pressed()
    rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * speed
    rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * speed
              
    screen.blit(background_image, (0, 0)) 
    screen.blit(sprite1, rect)
    pygame.display.flip()

pygame.quit()
exit()
Rabbid76
  • 202,892
  • 27
  • 131
  • 174