您的位置:首页 > 其它

黑洞漩涡的实现

2014-05-08 14:24 176 查看
实现目标:用粒子产生一个圆形黑洞漩涡,如果敌人是在圆形内则暂停移动和射击,并作往圆心移动的圆周运动,旋转方向指向圆心,并逐步变小,并产生伤害,如果漩涡结束,敌人还没有被摧毁,则还原移动和射击动作。

接来下就来实现上面的过程:

首先要先实现一个圆周运动(由于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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: