在游戏开发中,状态机几乎是必不可少的,简单地说,状态机就是控制游戏对象在不同的状态下应该做什么事情的一个机制。
#ifndef__MUTOU_H__
#define__MUTOU_H__
#include"cocos2d.h"
USING_NS_CC;
enumEnumState{
enStateWriteCode,/*状态:写代码*/
enStateWriteArticle,0);">/*状态:写教程*/
enStateRest,0);">/*状态:休息*/
};
classMutou:publicCCNode{
public:
CREATE_FUNC(Mutou);
virtualboolinit();
/*当前状态*/
EnumStateenCurState;
/*判断是否写代码写累了*/
boolisTire();
/*是否想写教程*/
boolisWantToWriteArticle();
/*写代码*/
voidwriteCode();
/*写教程*/
voidwriteArticle();
/*休息*/
voidrest();
/*切换状态*/
voidchangeState(EnumStateenState);
virtualvoidupdate(floatdt);
};
#endif
输出:
mutouiswirtingCode.
mutouisresting.
mutouiswritingarticle.
mutouiswirtingCode.
有限状态机的运用可以极大的简化程序 让代码更加的清晰易懂 便于阅读 当游戏主角能根据当前状态进行动作自动切换执行的时候可以极大的减少代码量
boolHelloWorld::init()
{
boolbRet=false;
do
{
CC_BREAK_IF(!CCLayer::init());
/*新建木头角色*/
mMutou=Mutou::create();
/*初始化木头的状态为休息*/
mMutou->changeState(enStateRest);
this->addChild(mMutou);
bRet=true;
}while(0);
returnbRet;
}
#include"Mutou.h"
boolMutou::init(){
this->scheduleUpdate();
returntrue;
}
voidMutou::changeState(EnumStateenState){
this->enCurState=enState;
}
boolMutou::isTire(){
/*每次问木头累不累,他都会说:累~*/
returntrue;
}
boolMutou::isWantToWriteArticle(){
/*有10%的概率想写教程(好懒~!)*/
floatran=CCRANDOM_0_1();
if(ran<0.1f){
returntrue;
}
returnfalse;
}
voidMutou::writeCode(){
CCLOG("mutouiswirtingCode.");
}
voidMutou::writeArticle(){
CCLOG("mutouiswritingarticle.");
}
voidMutou::rest(){
CCLOG("mutouisresting.");
}
voidMutou::update(floatdt){
/*判断在每一种状态下应该做什么事情*/
switch(enCurState){
caseenStateWriteCode:
/*如果累了就休息,并且切换到休息状态*/
if(isTire()){
rest();
changeState(enStateRest);
}
break;
caseenStateWriteArticle:
if(isTire()){
rest();
changeState(enStateRest);
}
break;
caseenStateRest:
/*一定的概率写代码,一定的概率写教程,并且切换到相应的状态*/
if(isWantToWriteArticle()){
writeArticle();
changeState(enStateWriteArticle);
}
else{
writeCode();
changeState(enStateWriteCode);
}
break;
}
}