我正在使用 pygame 库。以下是我为播放器处理事件的伪代码:
#generates multiple events for keys that are held down
pygame.key.set_repeat(30,30)
for event in pygame.event.get()
nextPos = currentPos
if(keyUp):
if event.key == w :
key_w = false
#do the same for s, a and d
if(keyDown):
if event.key == w:
key_w = true
#same for s,a and d
if(key_w):
#update nextPos
#do same for key_s, key_a and key_d
currentPos = nextPos
问题是有时当我在屏幕上移动鼠标时,同时按下一个键,在处理鼠标事件时,键的事件排队,并且这些多个按键一起执行,因此玩家似乎跳了很远的距离。
如果我根本不移动鼠标就不会出现这个问题。
最佳答案
更新我的回答:
我检查了我的游戏代码以查看我如何处理每一帧的键,似乎我没有从事件中获取键信息而是使用 pygame.key.get_pressed():
for event in pygame.event.get():
if event.type == pygame.QUIT:
gl.loop_main_loop = False # exit main loop and terminate
keys = pygame.key.get_pressed()
for key, state in enumerate(keys):
if (key in self.key_handlers) and state:
self.key_handlers[key]() # call key handler proc
这意味着我每帧只处理每个相关键一次。鼠标可以按照我下面描述的方式读取。
如果您的游戏没有固定帧速率,请记住在移动矢量计算中使用增量时间。
也许更好的想法是在每个过程中首先处理所有键盘事件并构建您自己的键状态表示,即告诉您哪些键对您很重要(例如 WSAD)是打开还是关闭的结构。当该帧中的所有事件都已处理后,使用您的关键状态数据运行您的移动代码。
不要使用 mousemotion 事件来跟踪鼠标,而是使用 pygame.mouse.get_pos() 和 pygame.mouse.get_pressed() 直接读取位置和按钮。
您的移动代码还应考虑到您的游戏以可变帧速率运行(除非您强制 pygame 保持帧速率恒定)并在移动矢量计算中使用时间增量。
关于pygame - pygame中玩家的平滑移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4429887/