【发布时间】:2015-08-01 01:02:51
【问题描述】:
我一直在使用 Python 和 Pyglet 库制作一个基于等距图块的 RPG。但是,我遇到了以下问题:
我的玩家移动基于由图块组成的 3 维数组上的位置。为了限制移动速度,我使用了一个全局变量:TILE_TO_TILE_DELAY = 200。
TILE_TO_TILE_DELAY 应该是玩家从一个图块移动到另一个图块所需的时间量(以毫秒为单位)。在此期间,他们应该无法进行新的运动。
我一直使用的系统是我有一个计时器类,像这样:
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
播放器类有一个 Timer 对象:
self.MoveTimer = Timer(TILE_TO_TILE_DELAY)
当玩家按下 W 键时,会调用一个函数来检查 player.MoveTimer.TimerIsStopped()。如果返回 True,则调用 player.MoveTimer.StartTimer() 并开始新的移动到下一个位置。
在偶数循环中,update(dt) 函数设置为每秒发生 30 次:
def update(dt):
if player.MoveTimer.TimerIsStopped()
player.UpdatePosition()
pyglet.clock.schedule_interval(update, 1/30)
现在,按照我的逻辑,update(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() 返回 player.can_move_again 的值,由 update(dt) 中的 UpdatePosition() 设置回 True
【问题讨论】:
-
能否包含调用 StartTimer() 的代码?
-
请将此代码添加到您的问题中
-
添加了启动计时器的代码。