滚动吧,数字
创始人
2024-02-16 18:04:02

朋友有个需求关于金币滚动效果,网上也有很多教程;但多不太符合他的需求,所有利用空余时间帮他做了一个通用组件。

效果图如下:
1、按照次数和速度进行,对应的滚动效果。
2、缓动效果可以根据自己的情况进行修改。
项目地址:https://gitee.com/songhuiyuan/utility.git
在这里插入图片描述

一、节点视图如下:

在这里插入图片描述

二、思路

  • 减少控制参数,越少越好,这里有三种
    1、初始值
    2、控制参数(滚动次数和滚动速度)
    3、目标值
  • 滚动次数
    1、次数小于等于0的时候,只从初始值滚动到目标值(缓动值可以自己去跳这个)
    2、次数大于0的时候,分为加速阶段,匀速阶段、减速阶段;我们滚动的次数是控制匀速阶段的。(根据加速阶段最后两帧的位置计算出速度,匀速就按照这个速度进行滚动)。当然可以自动去改动一下达到自己的次数的效果。
  • Rolling接口
    1、initValue初始值
    2、setParam设置控制参数
    3、rollToValue滚动函数调用
    关于Test.ts中的代码仅仅测试用。没什么意义。

三、代码如下:

Rolling.ts


const { ccclass, property } = cc._decorator;@ccclass
export default class Rolling extends cc.Component {/**当前数字 */private m_curNum: number = 0;/**字体高度 */private m_fontHeight: number = 0;/**开始位置 */private m_startPoint: cc.Vec2 = cc.v2(0, 0);/**单个个数 */private m_singleNum: number = 0;/**双个个数 */åprivate m_doubleNum: number = 0;private m_isRollIng: boolean = false;/**轮训次数 */private m_rollCounts: number = 0;/**滚动速度 */private m_rollSpeed: number = 300;private roolNode: cc.Node = null;onLoad() {this.roolNode = this.node;}start() {this.roolNode.x = this.m_startPoint.x;this.roolNode.y = this.m_startPoint.y;this.m_singleNum = this.roolNode.childrenCount / 2;this.m_doubleNum = this.roolNode.childrenCount;this.m_fontHeight = this.roolNode.height / this.roolNode.childrenCount;}public initValue(num: number) {this.m_curNum = num;this.roolNode.y = num * this.m_fontHeight;}public setParam(rollCount: number, rollSpeed: number) {this.m_rollCounts = rollCount;this.m_rollSpeed = rollSpeed;}public async rollToValue(num: number) {let tempNum: number = num;if (this.m_isRollIng) { return };if (tempNum < 0 || tempNum > this.m_singleNum) { return };this.m_isRollIng = true;if (num < this.m_curNum) {num += 10;}//到目标值长度和单次轮训长度let distance1: number = (num - this.m_curNum) * this.m_fontHeight;let distance2: number = this.m_singleNum * this.m_fontHeight;let time: number;if (this.m_rollCounts > 0) {time = await this.rollAccelerateAction(distance2) as number;time = await this.rollUniformityAction(distance2, time) as number;time = await this.rollDecelerateAction(distance1, num, tempNum) as number;this.m_isRollIng = false;console.log('-----执行完毕----');}else {if (tempNum == this.m_curNum) { return };time = distance1 / this.m_rollSpeed;cc.tween(this.roolNode).by(time, { position: new cc.Vec3(0, distance1, 0) }, { easing: 'quartInOut' }).call(() => {this.initValue(tempNum);this.m_isRollIng = false;}).start();}}/**加速阶段 */private rollAccelerateAction(distance: number) {let array: number[] = [];let time: number = distance / this.m_rollSpeed;return new Promise((resolve, reject) => {cc.tween(this.roolNode).by(time, { position: new cc.Vec3(0, distance, 0), }, {easing: 'quartIn',onUpdate: (target: cc.Vec3, ratio: number) => {array.push(target.y);}}).call(() => {this.initValue(this.m_curNum);let value = array[array.length - 1] - array[array.length - 2];let speed = value / (1 / array.length);resolve(distance / speed);}).start();});}/**匀速阶段 */private rollUniformityAction(distance: number, time: number) {let count: number = 0;return new Promise((resolve, reject) => {cc.tween(this.roolNode).by(time, { position: new cc.Vec3(0, distance, 0), }).call(() => {this.initValue(this.m_curNum);count++;}).union().repeat(this.m_rollCounts).call(() => {resolve(null);console.log(count);}).start();});}/**减速阶段 */private rollDecelerateAction(distance: number, num: number, tempNum: number) {let time: number = distance / this.m_rollSpeed;return new Promise((resolve, reject) => {cc.tween(this.roolNode).by(time, { position: new cc.Vec3(0, distance, 0) }, {easing: 'quartOut'}).call(() => {this.initValue(tempNum);resolve(null);}).start();});}
}

Test.ts//测试代码

@ccclass
export default class NewClass extends cc.Component {private rollScrs: Rolling[] = null;start () {let newNode = cc.find('New Node', this.node);if(newNode) {this.rollScrs = newNode.getComponentsInChildren(Rolling) || [];}}callBack() {this.scheduleOnce(() => {this.rollScrs[0] && this.rollScrs[0].initValue(0);this.rollScrs[0] && this.rollScrs[0].setParam(0,380);this.rollScrs[0] && this.rollScrs[0].rollToValue(6);this.rollScrs[1] && this.rollScrs[1].initValue(2);this.rollScrs[1] && this.rollScrs[1].setParam(0,380);this.rollScrs[1] && this.rollScrs[1].rollToValue(0);this.rollScrs[2] && this.rollScrs[2].initValue(0);this.rollScrs[2] && this.rollScrs[2].setParam(2,380);this.rollScrs[2] && this.rollScrs[2].rollToValue(6);this.rollScrs[3] && this.rollScrs[3].initValue(2);this.rollScrs[3] && this.rollScrs[3].setParam(2,380);this.rollScrs[3] && this.rollScrs[3].rollToValue(0);}, 2)}// update (dt) {}
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...