1 Star 2 Fork 1

xyTuoren/cocos2.4Tool

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
BounceScaleTween.ts 2.74 KB
一键复制 编辑 原始数据 按行查看 历史
xyTuoren 提交于 2023-01-29 18:42 . 增加事件中心类
const { ccclass, property } = cc._decorator;
/**
* 弹性缩放效果
*/
@ccclass
export default class BounceScaleTween extends cc.Component {
@property({ tooltip: CC_DEV && '频率(弹跳次数)' })
public frequency: number = 4;
@property({ tooltip: CC_DEV && '衰退指数' })
public decay: number = 2;
@property({ tooltip: CC_DEV && '目标值' })
public targetScale: number = 1;
@property({ tooltip: CC_DEV && '效果总时长' })
public totalTime: number = 1;
@property({ tooltip: CC_DEV && '播放间隔' })
public interval: number = 1;
@property({ tooltip: CC_DEV && '自动播放' })
public playOnLoad: boolean = false;
/** 原始缩放值 */
private originalScale: number = 1;
private tween: cc.Tween = null;
protected start() {
// 记录缩放值
this.originalScale = this.node.scale;
// 播放
if (this.playOnLoad) this.play(this.targetScale);
}
/**
* 播放
* @param targetScale 目标缩放
* @param repeatTimes 重复次数
*/
public play(targetScale: number, callbacks?: Function, repeatTimes?: number) {
// 重复次数
const times = (repeatTimes != undefined && repeatTimes > 0) ? repeatTimes : 1;
// 时长
const scalingTime = this.totalTime * 0.25; // 缩放时长
const bouncingTime = this.totalTime * 0.75; // 弹跳时长
// 振幅
const amplitude = (targetScale - this.originalScale) / scalingTime;
// 播放
this.tween = cc.tween(this.node)
.repeat(times,
cc.tween()
.set({ scale: this.originalScale })
.to(scalingTime, { scale: targetScale })
.to(bouncingTime, {
scale: {
value: targetScale,
progress: (start: number, end: number, current: number, t: number) => {
return end + this.getDifference(amplitude, t);
}
}
})
.delay(this.interval)
).call(() => {
callbacks && callbacks()
}).start();
}
/**
* 停止
*/
public stop() {
this.tween && this.tween.stop();
this.node.setScale(this.originalScale);
}
/**
* 获取目标时刻弹性幅度
* @param amplitude 幅度
* @param time 时间
*/
private getDifference(amplitude: number, time: number) {
// 角速度(ω=2nπ)
const angularVelocity = this.frequency * Math.PI * 2;
return amplitude * (Math.sin(time * angularVelocity) / Math.exp(this.decay * time) / angularVelocity);
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/xytuoren/cocos2.4-tool.git
git@gitee.com:xytuoren/cocos2.4-tool.git
xytuoren
cocos2.4-tool
cocos2.4Tool
master

搜索帮助