Cocos2dx_有限状态机_2
发布时间:2020-12-14 16:31:06  所属栏目:百科  来源:网络整理 
            导读:#ifndef __STATE_H__#define __STATE_H__class Monkey;class State{public:virtual void execute(Monkey *mk) = 0;};#endif #ifndef __STOPSTATE_H__#define __STOPSTATE_H__#include "State.h"#include "Monkey.h"#include "TrunState.h"class StopState :
                
                
                
            
                        #ifndef __STATE_H__
#define __STATE_H__
class Monkey;
class State
{
public:
	virtual void execute(Monkey *mk) = 0;
};
#endif 
#ifndef __STOPSTATE_H__
#define __STOPSTATE_H__
#include "State.h"
#include "Monkey.h"
#include "TrunState.h"
class StopState : public State
{
public:
	virtual void execute(Monkey *mk);
};
#endif 
#include "StopState.h"
void StopState::execute(Monkey *mk)
{
	if (mk->isStopTimeOut())
	{
		mk->changeState(new TrunState());
		mk->walk();
	}
} 
#ifndef __TRUNSTATE_H__
#define __TRUNSTATE_H__
#include "State.h"
#include "Monkey.h"
#include "WalkState.h"
class TrunState : public State
{
	virtual void execute(Monkey *mk);
};
#endif 
#include "TrunState.h"
void TrunState::execute(Monkey *mk)
{
	mk->changeState(new WalkState());
	mk->walk();
} 
#ifndef __WALKSTATE_H__
#define __WALKSTATE_H__
#include "State.h"
#include "Monkey.h"
#include "StopState.h"
#include "TrunState.h"
class WalkState : public State
{
	virtual void execute(Monkey *mk);
};
#endif 
#include "WalkState.h"
void WalkState::execute(Monkey *mk)
{
	mk->walk();
	if (mk->isWalkOutBorder())
	{
		mk->changeState(new TrunState());
		mk->trun();
	}
	else if (mk->isWalkTimeOut())
	{
		mk->changeState(new StopState());
		mk->stop();
	}
} 
#ifndef __MONKEY_H__
#define __MONKEY_H__
#include "cocos2d.h"
#include <time.h>
#include "State.h"
#include "StopState.h"
#include "WalkState.h"
#include "TrunState.h"
using namespace std;
using namespace cocos2d;
#define MAX_STOP_TIME  10
#define MAX_WALK_TIME  20
#define MAX_WALK_DIST  100 
enum MonkeyState
{
	stStop,stWalk,stTrun,};
class Monkey : public Node
{
public:
	Monkey();
	CREATE_FUNC(Monkey);
	//override
	virtual bool init();
	virtual void update(float delta);
	void changeState(State *newState);
	void stop();
	void walk();
	void trun();
	bool isStopTimeOut();
	bool isWalkTimeOut();
	bool isWalkOutBorder();
private:
	Sprite* sp;
	State *_curState;
	time_t _curTime;
	int _curPos;
	int _curStep;
};
#endif 
#include "Monkey.h"
Monkey::Monkey()
{
}
bool Monkey::init()
{
	if (!Node::init())
	{
		return false;
	}
	this->_curPos = 0;
	this->_curStep = 1;
	this->_curState = NULL;
	this->changeState(new WalkState());
	this->scheduleUpdate();
	this->sp = Sprite::create("eraser.png");
	sp:setPosition(Vec2(0,0));
	this->addChild(this->sp);
	return true;
}
void Monkey::update(float delta)
{
	if (this->_curState)
	{
		this->_curState->execute(this);
	}
}
void Monkey::changeState(State *newState)
{
	State *oldState = this->_curState;
	this->_curState = newState;
	if (oldState)
	{
		delete oldState;
	}
	this->_curTime = time(0);
}
void Monkey::stop()
{
	log("stop()");
}
void Monkey::walk()
{
	this->_curPos += this->_curStep;
	this->sp->setPosition(Vec2(this->_curPos*0.5,0));
	log("walk(): pos=%d",this->_curPos);
}
void Monkey::trun()
{
	this->_curStep *= -1;
	log("turn(): step=%d",this->_curStep);
}
bool Monkey::isStopTimeOut()
{
	return (time(0) - this->_curTime > MAX_STOP_TIME);
}
bool Monkey::isWalkTimeOut()
{
	return (time(0) - this->_curTime > MAX_WALK_TIME);
}
bool Monkey::isWalkOutBorder()
{
	return (this->_curPos > MAX_WALK_DIST || this->_curPos < -MAX_WALK_DIST);
}                        (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
