按住键时如何进行精灵移动
Posted
技术标签:
【中文标题】按住键时如何进行精灵移动【英文标题】:How can I make a sprite move when key is held down 【发布时间】:2021-11-30 00:30:59 【问题描述】:目前,每次按下一个键,精灵只会移动 1 个像素。按住左键或右键时,如何使水管工精灵不断移动?
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()
x1 += keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
y1 += keys[pygame.K_DOWN] - keys[pygame.K_UP]
x1 = x1 % window.get_width()
y1 = y1 % window.get_height()
setup_background()
spriteimg = plumberright
screen.blit(spriteimg, (x1, y1))
pygame.display.flip()
clock.tick(120)
另见Key and Keyboard event
最小示例: 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 事件清除标志。 移动过程只需检查每一帧的标志。如果设置则移动,如果未设置则不移动。
【讨论】:
这比使用pygame.key.get_pressed
要复杂得多,需要更多的代码
欢迎来到 SO!请尽您所能回答所提出的问题。例如,通过为代码示例提供一些上下文。有关更多提示,请参阅***.com/help/how-to-answer【参考方案5】:
您可以使用 KEYUP 和 KEYDOWN 事件。 您可以在按键按下时连续执行任务,当按键向上时停止该任务
for event in pygame.event.get():
if event.type == pygame.KEYUP:
if event.key==K_DOWN:
print("down key is not pressed")
elif event.type == pygame.KEYDOWN:
if event.key==K_DOWN:
print('down key is not pressed now')
pygame.event.clear() #optional only if your code requires
#this will clear all event and the for loop will executed only once
【讨论】:
以上是关于按住键时如何进行精灵移动的主要内容,如果未能解决你的问题,请参考以下文章