游戏时间本身实现来讲很容易搞定,无非两种方法
- 记录开始时间和时间流速比率,什么时候需要游戏时间,直接换算得到
- 每一帧都通过现实世界的时间流逝长度,来进行游戏世界时间的更新
这两种方法各有各的好处
- 第一种方法的好处是性能好,不进行额外的计算,什么时候用什么时候进行换算,但是不好的地方是,这样的游戏时间类不能基于游戏时间来进行定时任务的加入,因为本来就是被动计算的,主动去触发一些任务,当然不行了
- 第二种方法的好处是比较灵活,定时任务的加入也很方便,坏处当然就是会比较浪费性能,因为很多时候,进行一次循环是什么事情都没做的。
实现时候的难点
第一种方式实现起来没有什么难点,第二种方式实现起来有一个地方会比较麻烦,就是加入重复的定时任务时,比如我要让一个函数在游戏中每天10.00的时候执行,由于流速不一样,所以你只能根据当前的游戏时间来进行比较,当当前游戏时间晚于任务执行时间时,就执行任务,但是这样,10.01的实行会执行,但是10.02的时候也会执行啊,你也不能把这个任务删除掉,因为这个任务明天的同一时间也要执行,这怎么办呢?再引入一个变量,用来记录上次循环的游戏时间,这样只要任务时间夹在上次循环的时间和本次循环的时间之间,那么直接执行就完了
下面把任务类贴出来,至于时间管理类,那实现难度还不如leetcode上的简单题
class RoomTimeTask(object):
def __init__(self, target_time, is_repeat, method, *args, **kwargs):
super(RoomTimeTask, self).__init__()
self._target_time = target_time
self._is_repeat = is_repeat
self._method = method
self._args = args
self._kwargs = kwargs
def is_repeat(self):
return self._is_repeat
def can_execute(self, pre_game_seconds, current_game_seconds):
"""
根据时间来判断该任务是否能够执行
"""
today_task = pre_game_seconds <= self._target_time <= current_game_seconds
if today_task:
return True
yesterday_evening_not_execute_task = current_game_seconds < pre_game_seconds <= self._target_time
today_morning_not_execute_task = self._target_time <= current_game_seconds < pre_game_seconds
if yesterday_evening_not_execute_task or today_morning_not_execute_task:
return True
return False
def execute_task(self):
self._method(*self._args, **self._kwargs)