pygame - pygame中玩家的平滑移动

标签 pygame

我正在使用 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/

相关文章:

pygame - 什么是旗帜? pygame.SRCALPHA 标志的用途是什么(我在示例 aacircle.py 中遇到过该标志)?

python - 如何制作碰撞 mask ?

python - Pygame Snake - 苹果在蛇体内产卵

python - 使用 pyinstaller 在 pygame 脚本中包含声音文件

python - 制作 Python 批处理文件

python - Sprite 在一定距离限制内遵循另一种灵活的方式

python - 如何使 Pygame 零窗口全屏显示?

python - "Player2"无法执行与 "player"相同的操作

python - 当我的玩家在 pygame 中发生碰撞时,如何让他们穿过敌人?

python - Pygame 屏幕不会填充或绘制文本