游戏时间的一种思路

游戏时间本身实现来讲很容易搞定,无非两种方法
  1. 记录开始时间和时间流速比率,什么时候需要游戏时间,直接换算得到
  2. 每一帧都通过现实世界的时间流逝长度,来进行游戏世界时间的更新
这两种方法各有各的好处
  1. 第一种方法的好处是性能好,不进行额外的计算,什么时候用什么时候进行换算,但是不好的地方是,这样的游戏时间类不能基于游戏时间来进行定时任务的加入,因为本来就是被动计算的,主动去触发一些任务,当然不行了
  2. 第二种方法的好处是比较灵活,定时任务的加入也很方便,坏处当然就是会比较浪费性能,因为很多时候,进行一次循环是什么事情都没做的。
实现时候的难点

第一种方式实现起来没有什么难点,第二种方式实现起来有一个地方会比较麻烦,就是加入重复的定时任务时,比如我要让一个函数在游戏中每天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)

猜你喜欢

转载自blog.csdn.net/qq_40666620/article/details/109323423