pygame中玩家的流畅移动
我正在使用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
#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