【100个Cocos实例】环形ScrollView的实现方法

在这里插入图片描述

引言

Cocos中环形ScrollView的实现

大家好,今天是圣诞节,又是寒冷的一天。

在游戏开发中经常需要用到ScrollView去实现滚动的列表

他通常包括垂直方向水平方向两个选择。

本文将介绍一下ScrollView环形方向的实现

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

1.什么是ScrollView

ScrollView(滚动视图组件)是一种用户界面元素,用于显示超过屏幕尺寸的内容,并允许用户在内容中进行滚动浏览。在游戏开发中,ScrollView通常用于处理大量的游戏界面元素,比如角色列表、道具列表等,这些内容可能超出屏幕可见区域

我们接着来看看Cocos中的ScrollView

2.Cocos的ScrollView

滚动视图组件。

官方API文档

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

  • HorizontalVertical,水平和垂直方向的支持,勾选后可开启该方向的滚动。

  • ScrollBar,进度条,勾选了哪个方向的可以引用哪个方向的进度条。

  • IntertiaBrake,滚动惯性及系数,手停止滑动后,滚动列表继续滚动的惯性。

  • ElasticDuration,回弹,触顶、触底后的回弹和系数。

  • Content,可视内容的父节点。

  • CancelInnerEvents,滚动过程阻断子节点的事件,防止误操作。

  • Events,监听滚动相关的事件。

一目了然

下面一起来看看环形ScrollView的原理

2.环形ScrollView的原理

要实现环形滚动,即Item在圆周上运动,我们要先选择圆心半径

数学的有趣之处

然后根据以下向量的模的计算公式,利用圆上的点到圆心的距离相等得出每个Itemx坐标。

是不是很熟悉

设置的时机则是滚动事件的回调

时机的选择

下面一起来实现环形ScrollView。

3.环形ScrollView的实现

1.环境

引擎版本:Cocos Creator 3.8.1

编程语言:TypeScript

2.资源准备

为了有更好的节目效果,本期借用笔者游戏《填色之旅》中的资源(不吐槽节目组了)。

还是挺好看的不是

3.编写代码

首先创建一个CircularScrollView组件。

import { _decorator, CCFloat, Color, Component, Graphics, ScrollView, v3, Vec3 } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('CircularScrollView')
export class CircularScrollView extends Component {
}

然后确定一下圆心和半径。

  • radius,半径直接通过编辑器编辑,方便调整。
  • centerPos,圆心则是水平位移半径radius的长度,往右为正,往左为负。
@property({ type: CCFloat, tooltip: "环形半径" })
radius: number = 400;

scrollView: ScrollView;
centerPos: Vec3;

start() {
    this.scrollView = this.getComponent(ScrollView);
    if (this.scrollView) {
        this.centerPos = v3(this.scrollView.node.worldPosition.x + this.radius, this.scrollView.node.worldPosition.y, 0);
    }
}

根据监听ScrollView.EventType.SCROLLING事件,遍历所有子Item,通过公式计算出他们对应的x坐标并设置:

this.scrollView.node.on(ScrollView.EventType.SCROLLING, this.updateItemPos, this);

updateItemPos() {
    for (let i = 0; i < this.scrollView.content.children.length; i++) {
        var child = this.scrollView.content.children[i];
        var oldPos = child.worldPosition;
        var newX = this.centerPos.x - Math.sign(this.radius) * Math.sqrt(Math.abs(this.radius * this.radius - (this.centerPos.y - oldPos.y) * (this.centerPos.y - oldPos.y)));

        child.setWorldPosition(newX, oldPos.y, oldPos.z);
    }
}

为了更好地展示效果,添加2个临时按钮去控制ScrollView环形的方向和辅助线的显示隐藏


其中改变方向的核心代码,修改radius重新计算圆心,刷新

changeDir() {
    this.radius *= -1;
    this.centerPos = v3(this.scrollView.node.worldPosition.x + this.radius, this.scrollView.node.worldPosition.y, 0);
    this.updateItemPos();
    this.onShowCircle(true);
}

其中辅助线通过Graphics组件实现,包括圆心和圆周

onShowCircle(onlyRefresh) {
    var graphics = this.node.parent.getComponent(Graphics);
    if (!graphics) {
        graphics = this.node.parent.addComponent(Graphics);
        graphics.enabled = false;
    }
    if (!onlyRefresh) {
        graphics.enabled = !graphics.enabled;
    }
    graphics.clear();
    graphics.lineWidth = 5;
    graphics.strokeColor = Color.RED;
    graphics.circle(this.centerPos.x - 640, this.centerPos.y - 360, Math.abs(this.radius));
    graphics.stroke();

    graphics.fillColor = Color.RED;
    graphics.circle(this.centerPos.x - 640, this.centerPos.y - 360, 10);
    graphics.fill();
}

4.效果演示

向右环形滚动:

跟着我右手一起慢动作

向左环形滚动:

跟着我左手一起慢动作

辅助线:

双目了然

整体效果:

在这里插入图片描述

结语

本文源工程可通过私信CircularScrollView或者阅读原文付费获取。

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

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

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

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

推荐专栏:

100个Cocos实例

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

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

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

知识付费专栏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ServletContext对象和ServletConfig对象

Servlet几个重要的类的关系图 ServletContext对象 问题&#xff1a; Request解决了一次请求内的数据共享问题&#xff0c;session解决了用户不同请求的数据共享问题&#xff0c;那么不同的用户的数据共享该怎么办呢&#xff1f; 解决&#xff1a;使用ServletContext对象 作…

关键字:extends关键字

在 Java 中&#xff0c;extends 是一个关键字&#xff0c;用于表示继承关系。当一个类使用 extends 关键字时&#xff0c;它表示该类是一个子类&#xff0c;并且继承了父类的属性和方法。 以下是 extends 关键字的解析&#xff1a; 语法&#xff1a; 描述&#xff1a; ChildC…

二分查找——OJ题(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、点名1、题目讲解2、算法原理3、代码实现 二、搜索旋转排序数组中的最⼩值1、题目讲解2、算…

Unity向Web服务器上传和下载图片

Unity向Web服务器上传和下载图片 如果本片有看不懂的请查看我上篇文章&#xff1a;[Unity与Web服务器Post&#xff0c;Get](https://blog.csdn.net/qq_42194657/article/details/103031573)一、上传和下载图片1.在Unity中创建一个RawImage并在WebManager.cs脚本中添加一个Textu…

石油石化应急三维电子沙盘系统研究分析与业务应用

一、概述 易图讯科技&#xff08;www.3dgis.top&#xff09;以大数据、云计算、虚拟现实、物联网、AI等先进技术为支撑&#xff0c;支持高清卫星影像、DEM高程数据、矢量数据、无人机倾斜摄像、BIM模型、点云、城市白模、等高线、标高点等数据融合和切换&#xff0c;集成油田原…

Unity-Shader-渲染队列

Unity-Shader-渲染队列 渲染简介Unity中的几种渲染队列Background (1000)最早被渲染的物体的队列。Geometry (2000) 不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染&#xff0c;也就是Unity Shader中默认的渲染队列。AlphaTest (2450) 有透明通道&#xff0c;需要进…

巅峰画师Midjourney:新时代的独角兽

介绍 AI绘画领域中&#xff0c;Midjourney处于绝对地位&#xff0c;并且一年时间就登顶。 Midjourney是一家独立的AI研究实验室,探索新的思维媒介,拓展人类的想象力。 它由一个小型的自筹资金团队组成,专注于设计、人类基础设施和AI。 在AI绘画领域,Midjourney取得了非常突出…

SaaS医院信息化云his系统源码带电子病历+LIS系统

一、系统概述 •采用主流成熟技术&#xff0c;软件结构简洁、代码规范易阅读&#xff0c;SaaS 应用&#xff0c;全浏览器访问前后端分离&#xff0c;多服务协同&#xff0c;服务可拆分&#xff0c;功能易扩展&#xff1b; •支持多样化灵活配置&#xff0c;提取大量公共参数&am…

P7 RV1126推流项目 —— 写代码前的思路草图

目录 前言 01 项目介绍&#xff1a; 02 项目框图&#xff1a; 03 模块设计思路 3.1.rv1126_ffmpeg_main.cpp(主模块代码): 3.2.rkmedia_assignment_manage.cpp(RKMEDIA 任务管理模块) 3.3. rkmedia_data_process.cpp(RV1126 数据处理模块)&#xff1a; 3.4. rkmedia_…

详解IDEA git 版本回滚

作者简介 目录 1.git分区 2.未commit&#xff0c;进行回滚 3.commit未push&#xff0c;进行回滚 3.1.undo commit 3.2.reset 4.已commit&push&#xff0c;进行回滚 1.git分区 git的版本回滚其实就是回滚不同的分区&#xff0c;所以在聊git回滚之前我们有必要简单了解…

linux(centos)相关

文件架构&#xff1a; 用户组 查看用户组中的用户&#xff01; 用户 切换用户&#xff1a;su 提高用户权限命令&#xff1a;sudo 进程状态命令&#xff1a;top 杀死进程&#xff1a;kill 关机命令:shutdown 重启命令&#xff1a;reboot 时间同步 目录命令 ls pwd rm mv …

git中的smart checkout和force checkout

切换分支时出现了这个问题&#xff1a; 这是因为shiyan01分支修改了代码,但是没有commit, 所以在切换到test分支的时候弹出这个窗口 一、smart checkout(智能签出) 会把shiyan01分支的改动内容带到test分支。合并处理后的内容就变成了test分支的内容,而shiyan01分支的改动会被…

EternalBlue【永恒之蓝】漏洞详解(复现、演示、远程、后门、入侵、防御)内容丰富-深入剖析漏洞原理-漏洞成因-以及报错解决方法-值得收藏!

漏洞背景&#xff1a; 1.何为永恒之蓝&#xff1f; 永恒之蓝&#xff08;Eternal Blue&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子…

yolov7添加FPPI评价指标

学术上目标检测大多用mAP去评价一个模型的好坏&#xff0c;mAP用来作为比较模型的指标是挺好的&#xff0c;不过有个问题就是不够直观&#xff0c;比如mAP0.9到底代表什么呢&#xff1f;平均一个图会误检几个呢&#xff1f;该取什么阈值呢&#xff1f;mAP说明不了&#xff0c;所…

获取android签名

1、安装安卓模拟器&#xff0c;比如MuMu模拟器&#xff1b; 2、打包需要签名的apk&#xff0c;记住包名&#xff0c;比如org.ungleyou.uy,后面签名用得着&#xff1b; 3、下载签名工具&#xff0c;Gen_Signature_Android.apk&#xff1a; http://dlied5.qq.com/msdk/Gen_Sig…

【力扣题解】P101-对称二叉树-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P101-对称二叉树-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f30f;总结…

揭秘Pod状态与生命周期管理的秘密(上)

写在前面 前几篇文章中主要分享了k8s的几种控制器&#xff0c;本文将着重分享一下k8s最小的创建和部署单位pod的状态与生命周期管理。 点击 这里 可以查看所有相关文章。 Pod 概览 Pod 是 kubernetes 中你可以创建和部署的最小也是最简的单位。Pod 代表着集群中运行的进程。…

C# LINQ

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第22章《LINQ》 二、LINQ to XML 我们可以通过LINQ to XML来创造xml文件 如下示例&#xff0c;我们用LINQ to XML来创造。 <Books><CSharp Time"2019"><book>C# 入门经典</book><…

Quadratic Assignment Problem 二次分配问题

1 问题定义 二次分配问题&#xff08;Quadratic Assignment Problem&#xff0c;QAP&#xff09;是一种组合优化问题&#xff0c;涉及确定将设施分配到位置的最优方案。它的目标是找到最佳分配&#xff0c;以最小化设施对之间的总成本或距离&#xff0c;考虑到它们之间的相互作…

枚举(蓝桥杯备赛系列)acwing版

枚举 前言 hello&#xff0c;大家好&#xff0c;前面一段时间已经是把acwing Linux基础课讲完了&#xff0c;其实那些内容完全可以带领小白入门Linux我说过如果有人留言要Linux和Windows server 配置DNS Web ftp 的内容我就做一期&#xff0c;但是没人留言我也就先不自作多情了…