Вопрос-Ответ

How can I make a sprite move when a key is held down?

Как я могу заставить спрайт двигаться, когда нажата клавиша?

В настоящее время спрайт перемещается только на один пиксель при каждом нажатии клавиши. Как я могу заставить спрайт plumber постоянно перемещаться при нажатой левой или правой клавише?

while running:
setup_background()
spriteimg = plumberright

screen.blit(spriteimg,(x1, y1))

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
x1 = x1 + 0
y1 = y1 - 1
elif event.key == pygame.K_DOWN:
x1 = x1 + 0
y1 = y1 + 1
elif event.key == pygame.K_LEFT:
x1 = x1 - 1
y1 = y1 + 0
elif event.key == pygame.K_RIGHT:
x1 = x1 + 1
y1 = y1 + 0

pygame.display.flip()
clock.tick(120)
Переведено автоматически
Ответ 1

Для этого вы можете использовать pygame.key.get_pressed.

Пример:

while running:
keys = pygame.key.get_pressed() # Checking pressed keys
if keys[pygame.K_UP]:
y1 -= 1
if keys[pygame.K_DOWN]:
y1 += 1
Ответ 2

События клавиатуры (см. Модуль pygame.event) происходят только один раз при изменении состояния клавиши. KEYDOWN Событие происходит один раз при каждом нажатии клавиши. KEYUP происходит один раз при каждом отпускании клавиши. Используйте события клавиатуры для одиночного действия или пошагового перемещения.

Если вы хотите добиться непрерывного перемещения, вы должны использовать pygame.key.get_pressed(). pygame.key.get_pressed() возвращает список с состоянием каждой клавиши. Если клавиша нажата, состояние клавиши равно True, в противном случае False. Это снимок клавиш, в этот самый момент новое состояние клавиш должно непрерывно восстанавливаться в каждом кадре. Используйте pygame.key.get_pressed() для оценки текущего состояния кнопки и получения непрерывного движения:

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

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x1 -= 1
if keys[pygame.K_RIGHT]:
x1 += 1
if keys[pygame.K_UP]:
y1 -= 1
if keys[pygame.K_DOWN]:
y1 += 1

setup_background()
spriteimg = plumberright
screen.blit(spriteimg, (x1, y1))

pygame.display.flip()
clock.tick(100)

Смотрите также Событие клавиши и клавиатуры

Минимальный пример: repl.it/@Rabbid76/PyGame-ContinuousMovement

import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

rect = pygame.Rect(0, 0, 20, 20)
rect.center = window.get_rect().center
vel = 5

run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
print(pygame.key.name(event.key))

keys = pygame.key.get_pressed()

rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * vel
rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * vel

rect.centerx = rect.centerx % window.get_width()
rect.centery = rect.centery % window.get_height()

window.fill(0)
pygame.draw.rect(window, (255, 0, 0), rect)
pygame.display.flip()

pygame.quit()
exit()
Ответ 3

Используйте это. Это будет хорошо работать. Поместите это в свой цикл for.

        if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
playerX_change = -0.1
if event.key == pygame.K_d:
playerX_change = 0.1
if event.type == pygame.KEYUP:
if event.key == pygame.K_a or event.key == pygame.K_d:
playerX_change = 0

playerX += playerX_change
player(playerX, playerY)
pygame.display.update()
Ответ 4

Более простой способ может быть:

Событие KEYDOWN для установки флага перемещения. Событие KEYUP для снятия флага. В процессе перемещения просто проверяйте флаг в каждом кадре. Если установлен, перемещайте, а если не установлен, то не перемещайте.

python pygame