【100个Cocos实例】通过重写源码实现循环PageView

新的一年,节目组继续勤俭节约

引言

Cocos中通过重写源码实现循环PageView

大家好,有小伙伴私信我:

问得好,下次还要

有没有办法实现循环的PageView列表的方法呢

本文将介绍一下Cocos中通过重写源码实现循环PageView

本文源工程可在文末阅读原文获取,小伙伴们自行前往。

1.什么是PageView

PageView 是一种页面视图容器.

我们接着来看看Cocos中的PageView

2.Cocos的PageView

PageView组件。

官方

我们仔细看下编辑器PageView主要有以下可视选项:

  • InertiaBrake,是否开启滚动惯性和开启惯性后、在用户停止触摸后滚动多快停止,0表示永不停止,1表示立刻停止。

  • ElasticBounce Duration,是否允许滚动内容超过边界,并在停止触摸后回弹、回弹持续的时间,0 表示将立即反弹。

  • ContentIndicator,可滚动展示内容的节点、页面视图指示器组件。

  • Direction,页面视图滚动类型,包括水平和垂直。

  • PageEvents,滚动视图的事件回调函数。

下面一起来看看循环PageView的实现原理

3.循环PageView的实现原理

我们直接来看效果:

  • 在最后一页向后翻页时回到第一页。

重头再来

  • 在第一页向前翻页时跳到最后一页。

直接结束

下面一起来看看如何通过重写源码实现循环PageView

4.实现循环PageView

1.环境

引擎版本:Cocos Creator 3.8.1

编程语言:TypeScript

2.资源准备

本次效果节目组直接使用官方提供的组件,效果虽然不好看,但是靠谱

还是比较贴心的

结构大概如下。

简洁但不简单

仔细翻了一下,官方组件没有支持循环滚动,我们来稍稍修改一下。

翻不过去了

3.编写代码

首先我们先找到官方的PageView源码。

笔者的目录在
C:\ProgramData\cocos\editors\Creator\3.8.1\resources\resources\3d\engine\cocos\ui

想看就看

小伙伴们可以通过CocosDashBoard,跳转到引擎目录后再寻找。

一步定位

通过源码可以看到PageView组件继承ScrollView组件。

妙啊

我们直接找到实现翻页的核心源码(为了方便大家阅读,加了一点点注释)。

/*** 自动滚动到页面的方法。* 如果存在弹性回弹效果,将启动弹性回弹并根据边界的情况调整当前页面索引。* 如果没有弹性回弹效果,根据触摸滑动的方向和速度来判断是否切换到相邻页面,并在合适的情况下执行页面切换。* 最终会根据计算得到的目标页面索引,使用 scrollToPage 方法滚动到相应的页面。*/
protected _autoScrollToPage(): void {// 检查是否启动弹性回弹效果const bounceBackStarted = this._startBounceBackIfNeeded();// 处理弹性回弹的情况if (bounceBackStarted) {// 获取弹性回弹的偏移量const bounceBackAmount = this._getHowMuchOutOfBoundary();// 根据边界情况调整当前页面索引this._clampDelta(bounceBackAmount);// 根据回弹方向调整当前页面索引if (bounceBackAmount.x > 0 || bounceBackAmount.y < 0) {this._curPageIdx = this._pages.length === 0 ? 0 : this._pages.length - 1;}if (bounceBackAmount.x < 0 || bounceBackAmount.y > 0) {this._curPageIdx = 0;}// 如果存在指示器,通知状态变化if (this.indicator) {this.indicator._changedState();}} else {// 没有弹性回弹效果,处理手势滑动的情况const moveOffset = new Vec2();Vec2.subtract(moveOffset, this._touchBeganPosition, this._touchEndPosition);// 获取当前页面索引const index = this._curPageIdx;// 计算下一个可能的页面索引const nextIndex = index + this._getDragDirection(moveOffset);// 计算页面切换所需的时间const timeInSecond = this.pageTurningSpeed * Math.abs(index - nextIndex);// 判断是否可以切换到相邻页面if (nextIndex < this._pages.length) {if (this._isScrollable(moveOffset, index, nextIndex)) {// 执行页面切换this.scrollToPage(nextIndex, timeInSecond);return;} else {// 判断是否可以快速滚动到相邻页面const touchMoveVelocity = this._calculateTouchMoveVelocity();if (this._isQuicklyScrollable(touchMoveVelocity)) {// 执行页面切换this.scrollToPage(nextIndex, timeInSecond);return;}}}// 如果无法切换页面,则滚动回当前页面this.scrollToPage(index, timeInSecond);}
}

步骤一,我们新建一个CirculatePageView组件继承PageView组件用于重写核心源码实现循环滚动。

其中包含一个循环滚动的开关属性circulate

import { _decorator, CCBoolean, PageView, Vec2 } from 'cc';
const { ccclass, property } = _decorator;@ccclass('CirculatePageView')
export class CirculatePageView extends PageView {@property({ type: CCBoolean, displayName: 'Circulate', tooltip: "是否循环" })public circulate = true;
}

步骤二,把PageView组件替换成我们自定义的CirculatePageView组件,并勾选Circulate循环滚动。

步骤三,将_autoScrollToPage方法拷贝到我们的自定义组件CirculatePageView中去进行修改重写,通过circulate属性取消回弹。

肯臭CV

步骤四,插入自定义的代码,当开启循环滚动时,下一页nextIndex == -1时跳转到最后一页,下一页nextIndex == this._pages.length时跳转到第一页。(演示用,不做细节处理)

请在专业人士指导下进行

就这样我们就改写完成了,下面看看效果。

5.效果演示

你学废了吗?

结语

本文源工程可通过私信CirculatePageView获取。

在哪里可以看到如此清晰的思路,快跟上我的节奏!关注我,和我一起了解游戏行业最新动态,学习游戏开发技巧。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》大家可以自行点击搜索体验。

实不相瞒,想要个在看!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

知识付费专栏

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring实战】25 Spring Boot Admin 应用

文章目录 1. 查看健康信息2. 使用 Micrometer 和 "/metrics"3. 管理包和类的日志级别4. 其他功能总结 Spring Boot Admin 是一个功能强大的工具&#xff0c;用于监控和管理多个 Spring Boot 应用程序。通过上一篇文章 【Spring实战】24 使用 Spring Boot Admin 管理…

景联文科技GPT教育题库:AI教育大模型的强大数据引擎

GPT-4发布后&#xff0c;美国奥数队总教练、卡耐基梅隆大学数学系教授罗博认为&#xff0c;这个几乎是用“刷题”方式喂大的AI教育大模型的到来&#xff0c;意味着人类的刷题时代即将退出历史舞台。 未来教育将更加注重学生的个性化需求和多元化发展&#xff0c;借助GPT和AI教育…

工厂方法模式(Factory Method)

文章目录 定义与类型适用场景优点缺点工厂方法代码示例 定义与类型 定义&#xff1a;定义一个创建对象的接口&#xff0c;但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。 类型&#xff1a;创建型。 适用场景 创建对象需要大量重复的代码…

mysql视图和sql语句

mysql视图和sql语句 一.mysql视图1.数据的虚拟表示&#xff1a;2.简化复杂查询&#xff1a;3.安全性和权限控制&#xff1a;4.逻辑数据组织&#xff1a;5.更新限制&#xff1a;6.视图的创建&#xff1a; 二.mysq语句使用案列 MySQL的视图&#xff08;View&#xff09;是一个虚拟…

如何向嵌入式设备中添加tcpdump工具

说明&#xff1a;tcpdump是一个在网络设备调试中一个非常重要的工具&#xff0c;它并不像hexdump等工具集成在busybox里面&#xff0c;也不像其他的软件一样只需要依赖linux标准的库就可以实现&#xff0c;它需要pcap相关的库和加密的相关库。 本文主要是基于realtek 83系列的…

[VUE]5-TypeScript

目录 1 TypeScript 介绍2、安装3、快速上手4、TypeScript 常用类型4.1 类型标注的位置4.2 字符串、数字、布尔类型4.3 字面量类型4.4 ⭐interface 类型4.5 class 类型 ​&#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;…

三、Qt核心与Qt类库

一、Qt核心&#xff1a;元对象系统 1、Qt核心特点 Qt对标准C进行了扩展&#xff0c;引入了一些新的概念和功能元对象编译器&#xff08;MOC&#xff09;是一个预处理器&#xff0c;先将Qt的特性程序转为标准C程序&#xff0c;再由标准C编译器进行编译Qt为C语言增加的特性在Qt…

LeetCode第32题 : 最长有效括号

题目介绍 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()" 示例 2&#xf…

【Python机器学习】线性模型——用于多分类的线性模型

很多线性分类模型只使用与二分类问题&#xff0c;将二分类算法推广到多分类算法的一种常见方法是“一对其余”方法。在“一对其余”方法中&#xff0c;对每个类别都学习一个二分类模型&#xff0c;将这个类别和其他类别尽量区分&#xff0c;这样就生成了与类别数相同的二分类模…

设计模式——最全梳理,最好理解

新年献礼&#xff01; 设计模式呕心梳理 创建型模式 单例模式&#xff08;Singleton Pattern&#xff09;https://blog.csdn.net/qq_34869143/article/details/134874044 整理中... 结构型模式 代理模式&#xff08;Proxy Pattern&#xff09;https://blog.csdn.net/qq_34…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch&#xff1a;Serarch tutorial - 使用 Python 进行搜索 &#xff08;一&#xff09;” 的续篇。在今天的文章中&#xff0c;我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

css3 transform:scale

transform:scale 语法&#xff1a;transform:scale(x,y); <html> <head><style>.box1 {display: inline-block;width: 200px;height: 200px;background-color: pink;}.box2 {display: inline-block;width: 200px;height: 200px;background-color: red;tran…

电脑丢失dll文件怎么办,dll修复工具可一键修复dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法找到某某.dll文件”。这种情况通常是由于dll文件丢失或损坏导致的。那么&#xff0c;究竟是什么原因导致了dll文件的丢失呢&#xff1f;又该如何预防dll文件…

Linux vi/vim 教程

文章目录 【 1. vi/vim 的三种模式 】1.1 命令模式1.2 输入模式1.3 底线命令模式 【 2. 实例 】【 3. vim 的其他命令 】 所有的 Unix Like 系统都会内建 vi 文本编辑器&#xff0c;其他的文本编辑器则不一定会存在。目前我们使用比较多的是 vim 编辑器。vim 从 vi 发展出来&am…

transforms的操作

一、transforms的操作 1、transforms.RandomChoice transforms.RandomChoice 是一个数据转换操作&#xff0c;用于从一系列的转换方法中随机选择一个进行数据增强。 参数&#xff1a; transforms&#xff1a;一个包含多个转换方法的列表或元组。 示例&#xff1a; import …

[Javaweb/LayUI/上机考试作业/开源]学生/图书/课程/仓库等管理系统六合一基础功能通用模板

展示 考试要求 给定用户表和六张图书/教师/顾客/仓库....的表&#xff08;随机给每人抽选&#xff09;&#xff0c;要求实现用户登录注册&#xff0c;异步更新&#xff0c;对物品增删改查&#xff0c;精确/模糊查询等。 环境 tomcat 9 mysql 8 java 17 项目结构 项目类图 写前…

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CNN-LSTM-KDE多变量时间序列区…

JDK 11:崭新特性解析

JDK 11&#xff1a;崭新特性解析 JDK 11&#xff1a;崭新特性解析1. HTTP Client&#xff08;标准化&#xff09;示例代码 2. 局部变量类型推断的扩展示例代码 3. 新的字符串方法示例代码 4. 动态类文件常量示例代码 5. Epsilon 垃圾收集器使用方式 结语 JDK 11&#xff1a;崭新…

Redis(一)

1、redis Redis是一个完全开源免费的高性能&#xff08;NOSQL&#xff09;的key-value数据库。它遵守BSD协议&#xff0c;使用ANSI C语言编写&#xff0c;并支持网络和持久化。Redis拥有极高的性能&#xff0c;每秒可以进行11万次的读取操作和8.1万次的写入操作。它支持丰富的数…

el-select下拉框 change事件返回该项所有数据

主要代码 value-key <template><div><el-selectv-model"value"value-key"label"placeholder"请选择"change"selectChange"><el-optionv-for"item in options":key"item.label":label"…