黑洞漩涡的实现
2014-05-08 14:24
176 查看
实现目标:用粒子产生一个圆形黑洞漩涡,如果敌人是在圆形内则暂停移动和射击,并作往圆心移动的圆周运动,旋转方向指向圆心,并逐步变小,并产生伤害,如果漩涡结束,敌人还没有被摧毁,则还原移动和射击动作。
接来下就来实现上面的过程:
首先要先实现一个圆周运动(由于cocos2d-x的自带例子中没有此类动作,就自己封装了一个)
其次要设置缩放,直接调用setScale即可
然后设置旋转,也是直接调用setRotation
实现都比较简单,直接上代码
接来下就来实现上面的过程:
首先要先实现一个圆周运动(由于cocos2d-x的自带例子中没有此类动作,就自己封装了一个)
其次要设置缩放,直接调用setScale即可
然后设置旋转,也是直接调用setRotation
实现都比较简单,直接上代码
class BlackHoleAction : public CCActionInterval { public: static BlackHoleAction* create(float dt, CCPoint circleCenter, float radius); bool init(float dt, CCPoint circleCenter, float radius); virtual void update(float dt); protected: CCPoint _circleCenter;//圆心 float _radius;//半径 float _radius_var;//半径的变化变量 float _radian;//每帧做圆周运动时旋转的弧度 float _moveTimes;//移到圆心所用的时间 float _scale;//缩放大小 float _min_scale;//最小缩放到几倍 float _scale_var;//缩放的变化变量 };
BlackHoleAction* BlackHoleAction::create(float dt, CCPoint circleCenter, float radius) { BlackHoleAction* blackHoleAction = new BlackHoleAction(); blackHoleAction->init(dt, circleCenter, radius); blackHoleAction->autorelease(); return blackHoleAction; } bool BlackHoleAction::init(float dt, CCPoint circleCenter, float radius) { bool result = false; if(CCActionInterval::initWithDuration(dt)) { _circleCenter = circleCenter; _radius = radius; _radius_var = CCDirector::sharedDirector()->getAnimationInterval() / dt * _radius; _moveTimes = 1; _radian = M_PI_2 / (dt / CCDirector::sharedDirector()->getAnimationInterval()); _scale = 1; _scale_var = CCDirector::sharedDirector()->getAnimationInterval() / dt; _min_scale = 0.2f; result = true; } return result; } void BlackHoleAction::update(float dt) { if(this->m_pTarget) { Enemy* enemy = (Enemy*)this->m_pTarget; if(enemy->getIsInBlackHole()) { float radian = _radian * _moveTimes * 5; this->m_pTarget->setRotation(CC_RADIANS_TO_DEGREES(radian)); float x = _radius * sin(radian); float y = _radius * cos(radian); CCPoint newPos = ccp(x + _circleCenter.x, y + _circleCenter.y); this->m_pTarget->setPosition(newPos); _moveTimes += 4; _scale = _scale - _scale_var; if(_scale > _min_scale) { this->m_pTarget->setScale(_scale); } if(_radius <= 0) { _radius = 0; }else { _radius = _radius - _radius_var; } }else { this->stop(); } } }
相关文章推荐
- (更新)knockout.js学习——1.3例子——绑定的详细语法
- linux 运维常用命令汇总
- 安装MSSQL2014
- 导入dom4j出现的问题
- JQuery中$.ajax()方法参数详解
- 晒晒自己电脑里的常用工具
- linux内核中关于字符判断的宏
- 成都网站优化公司告诉你百度快照更新频次和排名有什么关系?
- 84消毒液
- epoll完整实例
- DWR入门教程
- 仅复制备份(简单恢复模式)
- 查找文档(retrieving a document)
- bat实现打开共享不弹输入用户和密码
- 广州中大成考培训火热招生中
- 微信订阅号开发笔记(五)
- Leetcode_Longest_Valid_Parentheses
- 【原创】Ubuntu配置samba和windows共享文件(非虚拟机下的Ubuntu)
- Silverlight 登陆界面
- org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Persiste