在游戏开发中,状态机几乎是必不可少的,简单地说,状态机就是控制游戏对象在不同的状态下应该做什么事情的一个机制。
#ifndef __MUTOU_H__
#define __MUTOU_H__
#include "cocos2d.h"
USING_NS_CC;
enum EnumState{
enStateWriteCode, /* 状态:写代码 */
enStateWriteArticle, /* 状态:写教程 */
enStateRest, /* 状态:休息 */
};
class Mutou : public CCNode {
public:
CREATE_FUNC(Mutou);
virtual bool init();
/* 当前状态 */
EnumState enCurState;
/* 判断是否写代码写累了 */
bool isTire();
/* 是否想写教程 */
bool isWantToWriteArticle();
/* 写代码 */
void writeCode();
/* 写教程 */
void writeArticle();
/* 休息 */
void rest();
/* 切换状态 */
void changeState(EnumState enState);
virtual void update(float dt);
};
#endif
输出:
mutou is wirting Code.
mutou is resting.
mutou is wirting Code.
mutou is resting.
mutou is writing article.
mutou is resting.
mutou is wirting Code.
mutou is resting.
mutou is wirting Code.
有限状态机的运用可以极大的简化程序 让代码更加的清晰易懂 便于阅读 当游戏主角能根据当前状态进行动作自动切换执行的时候可以极大的减少代码量
bool HelloWorld::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init());
/* 新建木头角色 */
mMutou = Mutou::create();
/* 初始化木头的状态为休息 */
mMutou->changeState(enStateRest);
this->addChild(mMutou);
bRet = true;
} while (0);
return bRet;
}
#include "Mutou.h"
bool Mutou::init(){
this->scheduleUpdate();
return true;
}
void Mutou::changeState( EnumState enState ) {
this->enCurState = enState;
}
bool Mutou::isTire() {
/* 每次问木头累不累,他都会说:累~ */
return true;
}
bool Mutou::isWantToWriteArticle() {
/* 有10%的概率想写教程(好懒~!) */
float ran = CCRANDOM_0_1();
if(ran < 0.1f) {
return true;
}
return false;
}
void Mutou::writeCode() {
CCLOG("mutou is wirting Code.");
}
void Mutou::writeArticle() {
CCLOG("mutou is writing article.");
}
void Mutou::rest() {
CCLOG("mutou is resting.");
}
void Mutou::update( float dt ) {
/* 判断在每一种状态下应该做什么事情 */
switch(enCurState) {
case enStateWriteCode:
/* 如果累了就休息,并且切换到休息状态 */
if(isTire()) {
rest();
changeState(enStateRest);
}
break;
case enStateWriteArticle:
/* 如果累了就休息,并且切换到休息状态 */
if(isTire()) {
rest();
changeState(enStateRest);
}
break;
case enStateRest:
/* 一定的概率写代码,一定的概率写教程,并且切换到相应的状态 */
if(isWantToWriteArticle()) {
writeArticle();
changeState(enStateWriteArticle);
}
else {
writeCode();
changeState(enStateWriteCode);
}
break;
}
}
本文出自 “学习心得与笔记” 博客,请务必保留此出处http://cxdbk.blog.51cto.com/8808491/1625856
原文:http://cxdbk.blog.51cto.com/8808491/1625856