实现目标:用粒子产生一个圆形黑洞漩涡,如果敌人是在圆形内则暂停移动和射击,并作往圆心移动的圆周运动,旋转方向指向圆心,并逐步变小,并产生伤害,如果漩涡结束,敌人还没有被摧毁,则还原移动和射击动作。
接来下就来实现上面的过程:
首先要先实现一个圆周运动(由于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();
}
}
}