首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >cocos creator从零开发之 如何实现游戏的虚拟摇杆功能逻辑

cocos creator从零开发之 如何实现游戏的虚拟摇杆功能逻辑

作者头像
代码简单说
发布2026-06-16 16:19:35
发布2026-06-16 16:19:35
180
举报
文章被收录于专栏:代码简单说代码简单说

cocos creator从零开发之 如何实现游戏的虚拟摇杆功能逻辑

在很多手机游戏中,虚拟摇杆是移动控制的常见方案,尤其是在动作类、冒险类游戏中非常实用。今天我使用 Cocos Creator 3.8.6 版本,通过一段简洁的 TypeScript 脚本,手把手教大家如何实现一个基础的虚拟摇杆功能。

请添加图片描述
请添加图片描述

一、功能需求分析

虚拟摇杆主要包含两个关键节点:

  • 摇杆背景(joystickBg):表示摇杆的活动区域,通常是一个圆形底盘。
  • 摇杆操控柄(joystickHandle):用户拖动的控件,限制在摇杆背景的半径范围内。

功能逻辑:

  • 触摸摇杆背景时,摇杆柄跟随手指移动,但限制在指定半径范围内。
  • 触摸结束或取消时,摇杆柄自动回到中心位置。
  • 通过摇杆柄的位置可以计算方向和力度,控制游戏角色移动。

二、项目结构准备

虚拟摇杆图片素材下载 https://wlor.lanzoum.com/itwAB32zngje

  1. 在 Cocos Creator 编辑器中,新建一个节点,命名为 Joystick
  2. Joystick 下创建两个子节点:
    • joystickBg (摇杆背景)
    • joystickHandle (摇杆柄)
  3. joystickBgjoystickHandle 节点添加合适的图片资源,比如圆形底盘和小圆点。
  4. 创建脚本 Move.ts,将它挂载到 Joystick 节点上。
在这里插入图片描述
在这里插入图片描述

三、核心代码讲解

代码语言:javascript
复制
import { _decorator, Component, Node, input, Input, EventTouch, CCFloat, v3, Vec3 } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('Move')
export class Move extends Component {
    @property(Node)
    joystickBg: Node = null;  // 摇杆背景节点

    @property(Node)
    joystickHandle: Node = null;  // 摇杆柄节点

    @property({ type: CCFloat })
    radius: number = 0;  // 摇杆半径限制

    initPosition: Vec3 = v3();  // 摇杆背景的初始位置

    start() {
        // 注册触摸事件监听
        input.on(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
        input.on(Input.EventType.TOUCH_START, this.onTouchStart, this);
        input.on(Input.EventType.TOUCH_END, this.onTouchEnd, this);
        input.on(Input.EventType.TOUCH_CANCEL, this.onTouchCancel, this);

        // 记录摇杆背景的初始世界坐标
        this.initPosition = this.joystickBg.getWorldPosition();
    }

    // 触摸开始,摇杆柄跟随触摸点
    onTouchStart(event: EventTouch) {
        console.log('onTouchStart');
        const touch = event.touch;
        const touchPos = v3(touch.getUILocationX(), touch.getUILocationY(), 0);
        const localPos = v3();
        this.joystickBg.inverseTransformPoint(localPos, touchPos);
        this.joystickHandle.setPosition(localPos);
    }

    // 触摸移动,限制摇杆柄在半径范围内移动
    onTouchMove(event: EventTouch) {
        const touch = event.touch;
        const touchPos = v3(touch.getUILocationX(), touch.getUILocationY(), 0);
        const localPos = v3();
        this.joystickBg.inverseTransformPoint(localPos, touchPos);

        // 计算手指位置距离中心点的长度
        const length = localPos.length();

        // 方向向量,单位向量
        const direction = length > 0 ? localPos.normalize() : v3(0, 0, 0);

        // 限制长度最大为摇杆半径
        const clampedLength = Math.min(length, this.radius);

        // 计算摇杆柄最终位置
        const newPos = v3(direction.x * clampedLength, direction.y * clampedLength, 0);

        this.joystickHandle.setPosition(newPos);
    }

    // 触摸结束,摇杆柄回到中心
    onTouchEnd(event: EventTouch) {
        console.log('onTouchEnd');
        this.joystickHandle.setPosition(Vec3.ZERO);
    }

    // 触摸取消,也回到中心
    onTouchCancel(event: EventTouch) {
        console.log('onTouchCancel');
        this.joystickHandle.setPosition(Vec3.ZERO);
    }

    update(deltaTime: number) {
        // 这里可以根据摇杆柄的位置,计算角色移动方向和速度
    }
}

四、代码要点说明

  • 坐标转换 摇杆柄的位置需要相对于摇杆背景节点本地坐标来设置,因此用到了 inverseTransformPoint 将全局坐标转换为局部坐标。
  • 限制移动范围 摇杆柄的位置通过计算触摸点到中心的距离来控制,最大不能超过设置的 radius,保证操控杆不会超出背景圆盘。
  • 事件监听与解绑 示例中只注册了事件,实际项目中如果有动态创建销毁节点,建议在 onDestroy 里解绑事件,避免内存泄漏。
  • 摇杆回弹 触摸结束或取消时,摇杆柄回到中心,方便下次操作。

五、后续扩展建议

  • 方向与力度反馈 可以在 update 函数里实时获取摇杆柄位置,计算方向向量和力度(摇杆柄与中心距离占半径的比例),传递给角色控制逻辑,实现移动。
  • 多点触控支持 当前代码对单指操作有效,想支持多指操作,需要结合触摸的 touchId 管理不同触摸点。
  • 摇杆位置自适应 可以根据不同分辨率或UI布局动态计算摇杆半径和位置,提升用户体验。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • cocos creator从零开发之 如何实现游戏的虚拟摇杆功能逻辑
    • 一、功能需求分析
    • 二、项目结构准备
    • 三、核心代码讲解
    • 四、代码要点说明
    • 五、后续扩展建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档