作者mimjy (米其)
看板GameDesign
标题[转录][心得] 关於夏夜攻防战 - 其四
时间Wed Jun 14 23:09:45 2006
为了验证上面讲的那堆有限机到底能不能达到我要的效果,我随即开始写
简单的前置程式来测试。
我希望宣告一个物件,这个物件要内含上述的几种State。
而每个State有两个函式: Init() & runState()。
每当SEEKER从状态A进入状态B, 我就让状态A初始化。如此可以确保一些参数
回覆到一开始的状态。
既然每个State有一个必备的Init(),我们可以宣告一个State的原形
再让各个State继承之。
这样做最大的好处在於,我们可以用一个原形阵列去存取所有的State。
假如我想初始化SLEEP state, 我可以写 sleep.init();
想初始化FIRE state, 写 fire.init();
但是现在有一个问题在於PLAYER可以随时随地让SEEKER进入"GOT"状态
这意味着无论何时都有可能要初使化"某个"状态
如果缺少了继承的机制, 那麽写出来的code可能会变成这样:
switch (oldState){
case SLEEP:
sleep.init();
break;
case FIRE:
fire.init();
break;
.
.
.
}
明明可以很间单的事情却因为对程式不够了解的关系变成这样,
这实在是很不漂亮的一件事情
继承之後,我们只要宣告一个原形阵列,再把每个STATE的ptr塞进来就好
像这样:
class proto{
virtual void init();
virtual void runState();
};
class sleep: public proto{
void init();
void runState();
};
class fire: public proto{
void init();
void runState();
};
//////////////
proto *store[2];
store[0] = new fire();
store[1] = new sleep();
///////////////////////////////////////////////////////
这个问题,等到了之後要实作武器库的时候会再次碰到。
没有继承概念的程式码,如何去应对总计17种不同的武器的选取?
实在难以想像。
总而言之,言而总之,最後关於Seeker的状态机,写出来的结果变成这样:
seeker.loop(){
seeker.allState[this.state].runstate();
}
简化过的程式码变成这样。这个seeker.loop() 就是放在主程式的部分,
每秒执行30次的那个,每一次执行,确认目前的状态,然後执行此状态的运算
其中如果有符合更改状态的条件(如上篇文章的图表所示),则透过更改this.state
来达成跳离STATE & 初始化的动作。
至於每个State的runState function,这边就略过了。
大体就是把上篇文章的条件机制加以程式化而已。
毕竟讲解Code是件无聊的事情。我还是主要讲想法以及实作方式就好。
(续)
文章转自暨大霞蔚山城 ★ HenryBBS (henry.twbbs.org)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.22.18.97