pygame中玩家的流畅移动

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

我正在使用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():

这意味着我每帧只处理一次每个相关关键点。鼠标可以按照我下面描述的方式阅读

如果游戏没有固定的帧速率,请记住在移动向量计算中使用增量时间


也许更好的办法是在每个过程中,首先处理所有键盘事件,并构建自己的键状态表示,即一个结构,告诉您哪些键对您重要(例如WSAD)是上键还是下键。在该帧中处理完所有事件后,使用关键点状态数据运行移动代码

不要使用mousemotion事件跟踪鼠标,而是直接使用pygame.mouse.get_pos()和pygame.mouse.get_pressed()读取位置和按钮


您的移动代码还应考虑到您的游戏以可变帧速率运行的事实(除非您强制pygame保持帧速率不变),并在移动向量计算中使用时间增量。

我使用以下方法

我初始化cooridinate变量

x = 300
y = 300
pX = 0
pY = 0
在本例中,x和y是播放器精灵使用的实际坐标,pX和pY由事件处理程序使用

然后我在事件处理程序中使用以下代码

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
        sys.exit(0)

    if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
        pX -= 2
    if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
        pX += 2
    if event.type == pygame.KEYDOWN and event.key == pygame.K_UP:
        pY -= 2
    if event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN:
        pY += 2       

    if event.type == pygame.KEYUP and event.key == pygame.K_LEFT:
        pX += 2
    if event.type == pygame.KEYUP and event.key == pygame.K_RIGHT:
        pX -= 2
    if event.type == pygame.KEYUP and event.key == pygame.K_UP:
        pY += 2
    if event.type == pygame.KEYUP and event.key == pygame.K_DOWN:
        pY -= 2
最后,在处理玩家坐标的主游戏循环中,我将

x += pX
y += pY

我不会使用pygame.event.get()

在我看来,玩家移动的最佳输入是pygame.key.get_pressed()

我会将其格式化如下:

while True:
    keys = pygame.key.get_pressed()
    if keys[K_a]:
        player.pos.x -= 10
    if keys[K_d]:
        player.pos.x += 10
    if keys[K_w]:
        player.pos.y -= 10
    if keys[K_s]:
        player.pos.y += 10

这样,系统将在每一帧上检查按下的键。

即使我在每一帧上轮询一次,在我移动鼠标之前,它工作正常。当我开始移动鼠标并同时按下按键时,播放器会卡在同一位置。4-5秒后,它开始根据我之前按下的键再次移动OK,部分解决。我通过usng pygame.event.set_blocked从事件队列中删除了mousemotion。但是现在我想用鼠标点击来射击(这是一个射击游戏)。这导致了同样的问题,尽管在这种情况下,由于鼠标点击导致的事件数量很小,玩家会跳一小段距离
while True:
    keys = pygame.key.get_pressed()
    if keys[K_a]:
        player.pos.x -= 10
    if keys[K_d]:
        player.pos.x += 10
    if keys[K_w]:
        player.pos.y -= 10
    if keys[K_s]:
        player.pos.y += 10