当按住某个键时,如何让精灵移动?
- 2024-11-22 08:47:00
- admin 原创
- 168
问题描述:
目前,每次按下按键时,精灵只会移动一个像素。如何才能让水管工精灵在按住左键或右键时不断移动?
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 事件清除标志。对于移动过程,只需每帧检查标志。如果设置,则移动,如果未设置,则不移动。
解决方案 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 events and the 'for' loop will be executed only once
解决方案 6:
我建议使用“时钟”功能。
while running:
spriteimg = plumberright
screen.blit(spriteimg,(x1, y1))
spriteimg_x = 0
spriteimg_y = 0
spriteimg_speed = 0.2
dt = clock.tick(120)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
x1 = x1 + 0
spriteimg_y -= spriteimg_speed
elif event.key == pygame.K_DOWN:
x1 = x1 + 0
spriteimg_y += spriteimg_speed
elif event.key == pygame.K_LEFT:
spriteimg_x -= spriteimg_speed
y1 = y1 + 0
elif event.key == pygame.K_RIGHT:
spriteimg_y -= spriteimg_speed
y1 = y1 + 0
x1 += spriteimg_speed * dt
y1 += spriteimg_speed * dt
这样怎么样?还有...我觉得 ticks 的值好高啊...
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD