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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |