黑洞漩涡的实现

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

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

首先要先实现一个圆周运动(由于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();
		}
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值