Cocos二维Slider

server/2025/1/12 12:08:02/

1、可拖动区域计算

根据UI的世界坐标了宽高信息计算出handle的坐标范围

this.posMin = new Vec2(this.node.worldPosition.x - this.uiSelf.contentSize.width * 0.5, this.node.worldPosition.y - this.uiSelf.contentSize.height * 0.5);
this.posMax = new Vec2(this.node.worldPosition.x + this.uiSelf.contentSize.width * 0.5, this.node.worldPosition.y + this.uiSelf.contentSize.height * 0.5);

2、归一化

let posLD = new Vec2(this.handle.node.position.x + this.uiSelf.contentSize.width * 0.5, this.handle.node.position.y + this.uiSelf.contentSize.height * 0.5);
return new Vec2(posLD.x / this.uiSelf.contentSize.width, posLD.y / this.uiSelf.contentSize.height);

3、Handle位置处理

this.handle.node.worldPosition = new Vec3(mousePosition.x, mousePosition.y, 0);
this.handle.node.worldPosition = this.handle.node.worldPosition.clampf(this.posMin.toVec3(), this.posMax.toVec3());

4、说明

4.1 到边界拖动位置不变时,不执行回调

if (Vec2.distance(this.progress, this.calculateProgress()) == 0) return;

4.2 事件处理

只添加了背景板的点击和拖动事件,所以对于Handle,要关闭其事件接接收

5、整体代码

import { _decorator, Component, Node, Sprite, UITransform, Vec2, Vec3 } from 'cc';
const { ccclass, property } = _decorator;@ccclass('SliderXY')
export class SliderXY extends Component {@property(Sprite)private handle: Sprite;private progress: Vec2 = Vec2.ZERO;private uiSelf: UITransform;private posMin: Vec2;private posMax: Vec2;private callbacks: Function[] = Array<Function>();public addCallback(callback: Function) {this.callbacks.push(callback);}public getProgress(): Vec2 {this.progress = this.calculateProgress();return this.progress;}protected onLoad(): void {this.uiSelf = this.getComponent(UITransform);}protected start(): void {this.posMin = new Vec2(this.node.worldPosition.x - this.uiSelf.contentSize.width * 0.5, this.node.worldPosition.y - this.uiSelf.contentSize.height * 0.5);this.posMax = new Vec2(this.node.worldPosition.x + this.uiSelf.contentSize.width * 0.5, this.node.worldPosition.y + this.uiSelf.contentSize.height * 0.5);this.node.on(Node.EventType.TOUCH_START, (event) => {this.setHandlePosition(event.getLocation());}, this);this.node.on(Node.EventType.TOUCH_MOVE, (event) => {this.setHandlePosition(event.getLocation());}, this);}private setHandlePosition(mousePosition: Vec3) {this.handle.node.worldPosition = new Vec3(mousePosition.x, mousePosition.y, 0);this.handle.node.worldPosition = this.handle.node.worldPosition.clampf(this.posMin.toVec3(), this.posMax.toVec3());if (Vec2.distance(this.progress, this.calculateProgress()) == 0) return;this.getProgress();for (let i = 0; i < this.callbacks.length; i++) {this.callbacks[i]?.(this.progress);}}private calculateProgress(): Vec2 {let posLD = new Vec2(this.handle.node.position.x + this.uiSelf.contentSize.width * 0.5, this.handle.node.position.y + this.uiSelf.contentSize.height * 0.5);return new Vec2(posLD.x / this.uiSelf.contentSize.width, posLD.y / this.uiSelf.contentSize.height);}
}

http://www.ppmy.cn/server/157756.html

相关文章

TrustRAG:增强RAG系统鲁棒性与可信度的创新框架

在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;LLMs&#xff09;凭借其强大的语言处理能力在诸多领域大放异彩。检索增强生成&#xff08;RAG&#xff09;系统&#xff08;面向企业RAG&#xff08;Retrieval Augmented Generation&#xff09;系统的多维检索框架…

HBuilderX打包ios保姆式教程

1、登录苹果开发者后台并登录已认证开发者账号ID Sign In - Apple 2、创建标识符&#xff08;App ID&#xff09;、证书&#xff0c;描述文件 3、首先创建标识符&#xff0c;用于新建App应用 3-1、App的话直接选择第一个App IDs&#xff0c;点击右上角继续 3-2、选择App&#x…

【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky

目录 relative 相对定位 absolute 绝对定位 fixed 固定定位 sticky 粘性定位 position&#xff1a;relative 、absolute、fixed 、sticky &#xff08;四选一&#xff09; top&#xff1a;距离上面的像素 bottom&#xff1a;距离底部的像素 left&#xff1a;距离左边的像素…

Vue 3 和 Electron 来构建一个桌面端应用

我们将使用 Vue 3 和 Electron 来构建一个桌面端应用&#xff0c;该应用可以通过 Websocket 与服务器进行通信&#xff0c;并实现心跳检测、客户端上线、获取资产信息以及修改资产状态的功能。以下是实现步骤的概述&#xff1a; 项目结构&#xff1a;创建一个 Vue 3 项目&…

设计模式 行为型 备忘录模式(Memento Pattern)与 常见技术框架应用 解析

备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在不暴露对象内部细节的情况下保存和恢复对象的内部状态。这种模式的核心思想是将对象的状态保存在一个独立的备忘录对象中&#xff0c;以便在需要时可以恢复到之前的状态。 一、核心…

Redis 性能优化 18招

前言 Redis在我们的日常开发工作中&#xff0c;使用频率非常高&#xff0c;已经变成了必不可少的技术之一。 Redis的使用场景也很多。 比如&#xff1a;保存用户登录态&#xff0c;做限流&#xff0c;做分布式锁&#xff0c;做缓存提升数据访问速度等等。 那么问题来了&…

Copilot 和 Windsurf哪个更适合于.netcore开发

要判断 Copilot 和 Windsurf 哪个更适合 .NET Core 开发&#xff0c;我们可以从以下几个维度进行比较&#xff1a; 1. 开发定位与目标 Copilot&#xff1a;由 GitHub 和 OpenAI 联合推出&#xff0c;旨在通过 AI 辅助代码开发&#xff0c;提供智能代码补全、生成、以及上下文理…

spark汇总

目录 描述运行模式1. Windows模式代码示例 2. Local模式3. Standalone模式 RDD描述特性RDD创建代码示例&#xff08;并行化创建&#xff09;代码示例&#xff08;读取外部数据&#xff09;代码示例&#xff08;读取目录下的所有文件&#xff09; 算子DAGSparkSQLSparkStreaming…