忽略时间,以'帧'为概念的重力系统(通过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
- 忽略时间,以'帧'为概念的重力系统(通过updatePosition来更新位置代替MoveTo)
- 创建以系统时间为文件名的文件
- 通过重力感应小球移动位置
- Android通过应用来设置系统时间
- java事件机制之通过上下左右键来控制小球为位置的移动演示
- linux通过网络更新系统时间
- 以周一为一周的第一天来计算当前时间是本月的第几周
- 以补丁的方式来更新应用程序
- 如何通过反射来代替N多的if...else
- 如何通过反射来代替N多的if...else
- 通过OnScrollListener来监听RecyclerView的位置
- 以文件最后更新时间为依据,同步两个文件夹下的所有文件
- 研发管理不等于项目管理,为何不可以用普通的项目管理软件来代替研发管理系统
- echarts动态时间轴,以秒为单位更新
- java中按字节数的长度来截取字符串,并以...来忽略
- 时间操作(Java版)—获取给定时间与当前系统时间的差值(以毫秒为单位)
- MFC状态栏的编程(以显示系统当前时间为例)
- 以结果为导向的时间管理
- WPF中的几种处理线程的工作方式:
- 掌握选项特点--提高SAT阅读
- Mongodb在Linux下的安装和启动和配置
- iOS时间前后获取
- Spring 解决编码问题-CharacterEncodingFilter
- 忽略时间,以'帧'为概念的重力系统(通过updatePosition来更新位置代替MoveTo)
- UML之用例图
- 权限项目总结(四) shiro 授权
- HTML5 video 跨浏览器兼容的方法
- TaskTriggerType 根据事件类型来确定节点
- spring 的 AOP详解
- 生成表记录的SQL语句
- 测试博文测试博文测试博文
- 2015腾讯微博登陆解密基于httpclient抓包模拟登陆