序列计数定时器在游戏中的运用

最近在写一款塔防游戏,遇到一个麻烦的问题:怎样每隔几秒放出一个怪?

比如在其中一波(wave)中放出5个怪A,每个间隔0.2秒,再放出3个怪B,每个0.3秒。

很容易想到用定时器,那么怎么解决每个N秒放出M个怪的问题?

于是我设计了一种特殊的定时器:序列计数定时器。

为什么叫“序列计数定时器”?

计数

以往的定时器都是每个N秒触发一次,无限循环,直到通知停止定时器。计数定时器很简单,就是指定定时器触发固定的次数后就自动停止。这就解决了每隔N秒出M个怪的问题。代码大致如下:

class CountTimer

{

private:

    Trigger* mTrigger;

    bool mRuning;

    int mCount;

    float mPerTime;

public:

    CountTimer(Trigger* trigger,int count,float time)

        :mTrigger(trigger),mRuning(false),mCount(count+1),mPerTime(time)

    void start()

    {

        mRuning = true;

    }

    bool isOver()

    {

        return !mRuning;

    }

    void update(float deltaTime)

    {

        if(mRuning)

        {

            static int trick = 0;

            static float esacpeTime = 0;

            esacpeTime += deltaTime;

            if(esacpeTime >= mPerTime)

            {

                esacpeTime = 0;       

                if(++trick >= mCount)

                {

                    mRuning = false;

                    return;

                }

                mTrigger->alert();

            }

        }

    }

};

 

使用起来非常简单,比如你要放出5个怪A,每个间隔0.2秒,然后放出3个怪B,每个间隔0.3秒。代码如下:

 

Trigger* trigger_a = new TriggerA();
CountTimer* monsterATimer = new CountTimer(0.2,5,trigger_a);
Trigger* trigger_b = new TriggerB();
CountTimer* monsterBTimer = new CountTimer(0.3,3,trigger_b);

 

TriggerA每alert一次放出一个怪A,TriggerB类似。

 

序列

序列是为了解决先放出M个怪A,再放出N个怪B的问题。怪A和怪B是在不同的定时器中控制触发的,而且只有M个怪A全部放出后才能放出怪B。所以定时器要按先后排序,后面的定时器要等前面的定时器停止后才能开始计时。于是还需要一个CountTimerManager来管理这些Timer.

 

 

游戏Update时调用CountTimerManager.update就可以了。

CountTimerManager每次只更新vector中的第一个定时器(调用Timer的update),vector的第一个Timer完成其任务后哦从vector删除。

 

这就是序列计数器的原理。目前解决了我的塔防游戏中出怪的问题。

 

PS: CSDN BLOG 的代码高亮太烂了!!! 一个很简单的功能都做不好!格式好好的代码到了这里乱七八糟。懒得修改了,读这篇日志的人受苦了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值