最近在写一款塔防游戏,遇到一个麻烦的问题:怎样每隔几秒放出一个怪?
比如在其中一波(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 的代码高亮太烂了!!! 一个很简单的功能都做不好!格式好好的代码到了这里乱七八糟。懒得修改了,读这篇日志的人受苦了。