Спрайт Pygame не движется при нажатии клавиши

Я работаю над рождественской игрой 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()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть некоторые ошибки. Первая ошибка - опечатка. Это должно быть 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()

Другие вопросы по теме