我使用Python和Pyglet库组装了一个基于等轴测图块的RPG。但是,我遇到了以下问题:
我的玩家移动是基于由瓷砖组成的三维数组上的位置。为了限制移动速度,我使用了一个全局变量:TILE_To_TILE_DELAY=200。在
TILE_TO_TILE_DELAY应该是玩家从一个TILE移动到另一个TILE所需的时间(毫秒)。在这段时间里,他们不应该有新的运动。在
我一直使用的系统是我有一个计时器类,像这样:import time
def GetSystemTimeInMS(): #Return system time in milliseconds
systime = round((time.clock()*1000), 0)
return systime
class Timer:
def __init__(self,time):
#time = time for which the timer runs
self.time = time
self.start_time = 0
self.stop_time = 0
def StartTimer(self):
#start_time = time at which the timer was started
self.start_time = GetSystemTimeInMS()
self.stop_time = self.start_time + self.time
def TimerIsStopped(self):
if GetSystemTimeInMS() >= self.stop_time:
return True
else:
return False
player类有一个Timer对象:
^{pr2}$
当玩家按下W键时,会调用一个函数来检查player.MoveTimer.Timer停止(). 如果返回True,则调用player.MoveTimer.StartTimer()并开始新的移动到下一个位置。在
在偶数循环中,update(dt)函数设置为每秒发生30次:def update(dt):
if player.MoveTimer.TimerIsStopped()
player.UpdatePosition()
pyglet.clock.schedule_interval(update, 1/30)
现在,根据我的逻辑,更新(dt)应该每秒检查30次,是否有足够的时间来保证玩家有一个新的移动事件。然而,由于某些原因,玩家在较低的FPS下移动得更快。在
当我的FPS在30左右时,播放器的移动速度比在瓷砖精灵较少的区域快得多,将帧速率提升到60。在FPS很高的地方,根据我的测量,玩家移动的速度几乎是我的两倍。在
我就是搞不懂,找了一天也没在网上找到什么。如能提供帮助,我将不胜感激。在
编辑:启动MoveTimer的代码:def StartMovement(self, new_next_pos):
self.RequestedMovement = False
if self.GetCanMoveAgain():
self.SetNextPos(new_next_pos)
self.SetMoveDirection(self.GetDirection())
#Start the timer for the movement
self.MoveTimer.StartTimer()
self.SetIsMoving(True)
self.SetStartedMoving(True)
self.SetWalking(True)
self.SetNeedUpdate(True)
self.MOVE_EVENT_HANDLER.CreateMoveEvent()
GetCanMoveAgain()返回玩家。你能再次移动吗,由update(dt)中的UpdatePosition()设置回True