忽略时间,以'帧'为概念的重力系统(通过updatePosition来更新位置代替MoveTo)

来源:互联网 发布:淘宝网管理团队 编辑:程序博客网 时间:2024/06/12 20:41

<1>BaseGravityClass.h

////  BaseGravityClass.h//  AdventureKing////  Created by jianan on 15/6/5.////#ifndef __AdventureKing__BaseGravityClass__#define __AdventureKing__BaseGravityClass__#include "BasicInclude.h"class BaseGravityClass : public Sprite{public:    virtual bool init();//    void initData();#pragma mark 精灵运动状态机 (6月-5日新增)    typedef enum ANI_SP_STATE{             /*运动状态机器*/        ANI_SP_STATE_IDLE,                 //空闲状态        ANI_SP_STATE_MOVEDOWN,             //下落状态        ANI_SP_STATE_HUITAN,               //回弹状态        ANI_SP_STATE_SETTOUCHENABLE        //设置为可点击状态    }ANI_SP_STATE;        ANI_SP_STATE _AniSpState;              //当前运动状态        void setState(ANI_SP_STATE aniSpState);    void idle();    void moveDown();    void huiTan(float dt);    void setTouchEnable();    #pragma mark 移动    void JNMoveTo(Vec2 ptSrc, Vec2 ptDes);    Vec2 _ptSrc;                           //移动起点    Vec2 _ptDes;                           //移动终点    float _fSpeed;                         //起始速度    float _fMinSpeed;    float _fAcc;                           //加速度    float _fMaxSpeed;                      //最大速度    #pragma mark 回调函数    Ref* _targetBack;    SEL_CallFuncN _selectorBack;    void addCallFuncNBack(Ref* target, SEL_CallFuncN selector);    void doCallFuncNBack();    #pragma mark 位置更新    virtual void updatePosition();                 /*更新*/};#endif /* defined(__AdventureKing__BaseGravityClass__) */

<2>BaseGravityClass.cpp

////  BaseGravityClass.cpp//  AdventureKing////  Created by jianan on 15/6/5.////#include "BaseGravityClass.h"bool BaseGravityClass::init(){    if(!Sprite::init()){        return false;    }    initData();    return true;}void BaseGravityClass::initData(){    //初始化位置更新的数据    _AniSpState = ANI_SP_STATE_IDLE;    _fMinSpeed = MinSpeed;    _fMaxSpeed = MaxSpeed;    _fSpeed = _fMinSpeed;    _fAcc = AccSpeed;    _targetBack = NULL;    _selectorBack = NULL;}#pragma mark 动物状态机void BaseGravityClass::JNMoveTo(Vec2 ptSrc, Vec2 ptDes){        _ptDes = ptDes;    setState(ANI_SP_STATE_MOVEDOWN);}void BaseGravityClass::setState(ANI_SP_STATE aniSpState){        if(_AniSpState == aniSpState){        return;    }        _AniSpState = aniSpState;}void BaseGravityClass::idle(){    log("精灵空闲");}void BaseGravityClass::moveDown(){    log("精灵下落, 当前位置:%f, 目标点:%f", this->getPositionY(), _ptDes.y);    if(this->getPositionY() >= _ptDes.y){        this->setPositionY(this->getPositionY() - _fSpeed);        _fSpeed += _fAcc;        if(_fSpeed >= _fMaxSpeed){            _fSpeed = _fMaxSpeed;        }    }else if(this->getPositionY() < this->_ptDes.y ){        this->setPositionY(_ptDes.y - 5);        scheduleOnce(schedule_selector(BaseGravityClass::huiTan), 0.05f);    }}void BaseGravityClass::huiTan(float dt){    log("精灵回弹");    this->setPositionY(_ptDes.y);    _fSpeed = _fMinSpeed;    setState(ANI_SP_STATE_SETTOUCHENABLE);}void BaseGravityClass::setTouchEnable(){    log("精灵设置可触摸状态");    doCallFuncNBack();}void BaseGravityClass::addCallFuncNBack(Ref* target, SEL_CallFuncN selector){    _targetBack = target;    _selectorBack = selector;}void BaseGravityClass::doCallFuncNBack(){    if(_targetBack && _selectorBack){        (_targetBack->*_selectorBack)(this);    }    _targetBack = NULL;    _selectorBack = NULL;    setState(ANI_SP_STATE_IDLE);}void BaseGravityClass::updatePosition(){        switch (_AniSpState) {        case ANI_SP_STATE_IDLE:            idle();            break;        case ANI_SP_STATE_MOVEDOWN:            moveDown();            break;        case ANI_SP_STATE_HUITAN:            //huiTan();            break;        case ANI_SP_STATE_SETTOUCHENABLE:            setTouchEnable();            break;        default:            break;    }}

<3>update

    for (int i = 0; i < m_height * m_width; i++){  //6月-5日 贾楠新增                AnimationSprite *sp = m_animalMatrix[i];        if (sp) {            sp->updatePosition();        }                RockSprite* rockSp = m_rockMatrix[i];        if (rockSp) {            rockSp->updatePosition();        }                BubbleSprite* bubbleSp = m_bubbleMatrix[i];        if (bubbleSp) {            bubbleSp->updatePosition();        }                IceSprite* iceSp = m_iceMatrix[i];        if (iceSp) {            iceSp->updatePosition();        }                CloudSprite* cloudSp = m_cloudMatrix[i];        if (cloudSp) {            cloudSp->updatePosition();        }    }


<4>

1,

animationSp->addCallFuncNBack(this, callfuncN_selector(GameScene::setSpIsTouchEnable));animationSp->JNMoveTo(startPosition, endPosition);

2,

rockSp->JNMoveTo(startPosition, endPosition);


0 0