屏幕震动的效果实现

这是一个老外封装的一个自定义动作类,来分析下其实现

头文件:

class Shake : public cocos2d::CCActionInterval {
public:
	//构造
	Shake();

	//创建一个产生震动的持续时间和强度(x轴产生的和y轴产生的变化一样,x = y)
	static Shake* create(float d, float strength );
	//创建一个产生震动的持续时间和强度(x轴产生的和y轴产生的变化不一样,x != y)
	static Shake* createWithStrength(float d, float strengthX, float strengthY );
	//初始化动作
	bool initWithDuration(float d, float strengthX, float strengthY );
protected:
	//设定一个目标
	void startWithTarget(cocos2d::CCNode *pTarget);
	//刷新,改变目标的x轴和y轴,产生震动效果
	void update(float time);
	//停止震动
	void stop(void);

	//目标的原始坐标,用于震动结束后还原目标的坐标
	float _initialX, _initialY;
	//震动的强度,由目标x轴和y轴控制
	float _strengthX, _strengthY;
};
实现:

//初始化参数
Shake::Shake() : _strengthX(0), _strengthY(0), _initialX(0), _initialY(0){
}

Shake* Shake::create(float d, float strength) {
	//初始化,x和y都等于strength
	return createWithStrength(d, strength, strength);
}

Shake* Shake::createWithStrength(float duration, float strengthX, float strengthY) {
	Shake *pRet = new Shake();

	if (pRet && pRet->initWithDuration(duration, strengthX, strengthY)) {
		pRet->autorelease();
	}else {
		CC_SAFE_DELETE(pRet);
	}
	return pRet;
}

bool Shake::initWithDuration(float duration, float strengthX, float strengthY) {
	if (CCActionInterval::initWithDuration(duration)) {//初始化父类
		//初始化参数
		_strengthX = strengthX;
		_strengthY = strengthY;
		return true;
	}

	return false;
}

//帮助函数,返回一个包含最大最小值的随机值
static float fgRangeRand(float min, float max) {
	float rnd = ((float)rand() / (float)RAND_MAX);
	return rnd * (max - min) + min;
}

void Shake::update(float dt) {
	//随机产生一个震动范围
	float randX = fgRangeRand(-_strengthX, _strengthX) * dt;
	float randY = fgRangeRand(-_strengthY, _strengthY) * dt;

	//移动目标的坐标,产生震动
	m_pTarget->setPosition(ccpAdd(ccp(_initialX, _initialY), ccp(randX, randY)));
}

void Shake::startWithTarget(CCNode *pTarget) {
	//绑定目标
	CCActionInterval::startWithTarget(pTarget);

	//保存目标的出事坐标
	_initialX = pTarget->getPosition().x;
	_initialY = pTarget->getPosition().y;
}

void Shake::stop(void) {
	//动作结束,还原目标的初始位置
	this->getTarget()->setPosition(ccp(_initialX, _initialY));
	//结束动作
	CCActionInterval::stop();
}

接下来,就可以用任何想实现的节点调用runAction即可使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值