滚动吧,数字

news2025/7/18 20:12:14

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

效果图如下:
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) {}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows安装VMware虚拟机(附带CentOS7部署)

软件下载 链接&#xff1a;https://pan.baidu.com/s/1Vw2Bilf9uf-EYR6_MR86aA?pwdd2qr 提取码&#xff1a;d2qr VMware安装 通你上述链接下载VMware安装包&#xff0c;没有特别选项&#xff0c;选安装位置无脑下一步安装&#xff0c;安装完成后会提示你输入激活码&#xf…

Java中的OpenCV-图像处理

我们将在本文中介绍以下高级图像处理操作&#xff1a;Canny 边缘检测轮廓和形状识别Canny 边缘检测&#xff1a;Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年开发的。它是一个多阶段算法&#xff0c;我们将按如下方式经历每个阶段&#xff1a;噪声…

Java与GitLab OpenAPI交互

通过Gitlab Open api代码来操作代码的合并及关闭&#xff0c;项目的模板生成........ 方式一&#xff1a; 使用java-gitlab-api(推荐) 接口文档Java Gitlab API Documentation <dependency> <groupId>org.gitlab</groupId> <art…

49 多个 classloader 加载的同类限定名的Class 在 jhat 中显示不全

前言 呵呵 这是在之前 排查一个 flink 的相关问题的时候 发现的一个问题 flink 默认的 job 隔离是基于 Classloader 来进行隔离的 直到 最近才有时间来看一下 这个问题的原因, 究其代码 也还是比较容易找到 大致记录一下 以下内容, 截图 基于 jdk8 测试用例 /*** …

要闻 | 人大金仓重磅亮相2022南京软博会

“软件赋能 数智转型”&#xff0c;2022中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会&#xff08;下称“南京软博会”&#xff09;于11月23至25日顺利举行。人大金仓重磅亮相本次展会&#xff0c;并受邀出席同期召开的2022中国&#xff08;南京&#xff…

【LeetCode每日一题】——37.解数独

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数组 二【题目难度】 困难 三【题目编号】 37.解数独 四【题目描述】 编写一个程序&#xff…

抢先看!阿里发布2023最新版分布式核心小册,GitHub标星破已千万

什么是分布式 一个分布式系统你可以看做是一组计算机系统一起工作&#xff0c;而在终端用户的视角看过去&#xff0c;就像一台计算机在工作一样 。 这组一起工作的计算机&#xff0c;拥有共享的状态 &#xff0c;他们同时运行&#xff0c;独立机器的故障不会影响整个系统的正常…

1、认识时间复杂度和简单的排序算法

目录时间复杂度选择排序冒泡排序异或交换解释案例综上插入排序二分查找拓展对数器时间复杂度 如果一个操作时间和数据量没有关系&#xff0c;则是常数时间的操作 比如一个数组arr[n]这就是算一个偏移量&#xff0c;然后找到这个位置的值&#xff0c;这就是常数时间&#xff0c…

力扣(LeetCode)882. 细分图中的可到达节点(C++)

spfa 将边细分成节点&#xff0c;如果一条边细分出 nnn 个结点&#xff0c;那么边的两个端点距离 n1n1n1 &#xff0c;边长 n1n1n1。提示中给出&#xff0c;一共 300030003000 个初始结点&#xff0c;无向边的数目小于等于 100001000010000 &#xff0c;这是提示我们最多有 20…

服务器怎么远程连接控制

服务器怎么远程连接控制 我是艾西&#xff0c;还是有很多小白同学问我服务器怎么远程连接。那么今天我们重点来教教大家如何用电脑远程服务器配上图文教程&#xff0c;让不懂的新手小白一看就会&#xff0c;分分钟上手教程 远程服务器需要一台电脑俗称“PC”就是我们自己平时经…

红外遥控视力自动检测系统的设计与实现

红外线视力检测系统的设计与实现 实现方法 分为两部分 上位机-------------串口通讯-------------下位机 上位机&#xff1a;使用LabVIEW软件编写窗口软件。 串口通讯&#xff1a;USB线进行链接通讯。 下位机&#xff1a;AT89C52单片机开发板 说明&#xff1a;Labvi…

46-pytest-分布式插件pytest-xdist使用

分布式插件pytest-xdist使用前言安装插件分布式用例设计原则使用示例测试报告按一定顺序执行前言 本篇来学习下在pytest中分布式执行测试用例&#xff0c;以节省测试时间。 安装插件 pip install pytest-xdist分布式用例设计原则 用例之间是独立的&#xff0c;用例之间没有…

学生护眼台灯哪个牌子最好?2022双十二4款儿童护眼写字灯推荐

现在的孩子学业压力越来越大了&#xff0c;眼睛也是长期高强度使用&#xff0c;不堪重负&#xff0c;如果不注意保护&#xff0c;加上年龄偏小身体器官尚未发育完全&#xff0c;极易出现各种眼睛问题。所以对于经常晚上看书写字的学生群体来说&#xff0c;有一个健康护眼的照明…

OpenGL ES 学习(二) -- 渲染模式和GLSL

上一章&#xff0c;我们学习了 OpenGL 的基本知识&#xff0c;这一章&#xff0c;一起学习OpenGL的渲染模式和渲染语言GLSL。 一. 渲染流程 OpenGL的渲染流程如下图所示&#xff1a; 从这里看出&#xff0c;OpenGL 需要使用顶点着色器&#xff0c;先绘制好轮廓&#xff0c;再…

Java面向对象之——多态

文章目录一、多态的概念二、多态的条件三、重写四、向上转型和向下转型1、向上转型2、向下转型五、再谈多态六、多态的优缺点总结一、多态的概念 多态是同一个行为具有多个不同表现形式或形态的能力。就比如人吃饭&#xff0c;对于中国人使用筷子吃饭&#xff0c;美国人使用刀…

C. Almost All Multiples(贪心 + 思维)

Problem - C - Codeforces 给定两个整数n和x&#xff0c;如果pi是i的倍数&#xff0c;所有1≤i≤n-1&#xff0c;pn1&#xff0c;且p1x&#xff0c;则长度为n的排列组合† p被称为搞笑。 找出最小的有趣的排列组合&#xff0c;或报告说不存在这样的排列组合。 † 长度为n的排…

分布式学习必看:十年架构大佬带你从零开始学习分布式服务框架!

前言 最近在看《架构探险-从零开始写分布式服务框架》&#xff0c;对于分布式框架的入门级选手还是挺合适的&#xff0c;扫盲。对分布式服务框架中的基本概念&#xff1a;RPC、SOA、序列化、Spring集成RPC、ZooKeeper、I/O模型、Netty、软负载、服务治理做了系统介绍。手写了R…

【知识网络分析】引文网络(citation)

引文网络(citation) 1 读取本地文献并构建引文网络数据集2 网络数据集精简3 剔除孤立点方法封装4 网络图美化5 社团群体划分并结合色谱图显示6 网络节点中心度相关指标计算1 读取本地文献并构建引文网络数据集 新建一个notebook文件后,导入需要使用的包,本案例使用WOS数据…

进程、线程、 Thread类的基本用法 【javaee】

目录 一、什么是进程/任务&#xff08;Process/Task&#xff09; 二、什么是线程&#xff08;Thread&#xff09; 三、进程和线程的区别 四、创建线程的方法&#xff1a; 方法1 继承 Thread &#xff0c;重写run 方法2 实现 Runnable 接口 方法3 匿名内部类创建 Thread …

数据库的常用操作

数据库的分类 数据库大体可以分为 关系型数据库 和 非关系型数据库 关系型数据库&#xff1a;是指采用了关系模型来组织数据的数据库&#xff0c;关系模型指的就是二维表格模型&#xff0c;关系型数据库都基于标准的SQL&#xff0c;只是内部一些实现有区别 常见关系型数据库…