Я работаю над рождественской игрой pygame, и я пытаюсь заставить сумку двигаться и продолжать двигаться, когда я нажимаю клавиши со стрелками влево или вправо. Ошибки нет, но при нажатии клавиш ничего не происходит. Любая идея, что я делаю неправильно? Вот код спасибо!:
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()
Есть некоторые ошибки. Первая ошибка - опечатка. Это должно быть event.key
, а не pygame.key
.
Кроме того, вы должны blit
спрайт в цикле приложения, а не в цикле событий, в месте, сохраненном в rect
. Получите прямоугольник (rect
) перед петлей. Переместите прямоугольник в цикле событий и blit
спрайт в каждом кадре в 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()
Обратите внимание, что вы можете использовать move_ip() вместо move:
rect = rect.move((-1, 0))
rect.move_ip(-1, 0)
Однако используйте pygame.key.get_pressed()
для непрерывного движения:
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()
События клавиатуры (см. модуль pygame.event) происходят только один раз при изменении состояния клавиши. Событие KEYDOWN
происходит один раз при каждом нажатии клавиши. KEYUP
происходит один раз при каждом отпускании клавиши. Используйте события клавиатуры для одного действия или пошагового движения.
pygame.key.get_pressed() возвращает список с состоянием каждой клавиши. Если клавиша удерживается нажатой, клавиша находится в состоянии True
, в противном случае False
. Используйте pygame.key.get_pressed(), чтобы оценить текущее состояние кнопки и получить непрерывное движение.
Полный пример:
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()