目录

  • 前言
  •       一、新建Joystick2D.ts
  •       二、提问AI
  •       三、优化修改
  •             第一次修改:
  •             第二次修改:
  •       四、最终版本
  •       五、总结
  • 前言

    输入模块一般包含:键盘输入、鼠标鼠标、触屏输入。考虑到我们是小游戏开发只需要触屏输入,而 ccc 已经内置了常用的触摸事件,我们只需要封装一个摇杆组件结合 ccc 内置触摸事件就能满足日常小游戏开发。

    小白必读:摇杆组件的用处?
    :摇杆组件用于控制游戏中玩家角色的方向。一个完整的摇杆事件先后顺序为:触摸开始-->触摸移动-->触摸结束,其中触摸移动就能决定游戏中玩家角色的移动方向,我们在肉鸽类,RPG类,MOBA类等手游中都会使用到摇杆组件。

    一、新建Joystick2D.ts

    1、在Core分包目录下的Scripts目录新建Components目录用于保存各种组件
    2、在Components目录下新建Joystick目录
    3、在Joystick目录新建Joystick2D.ts脚本
    新建Joystick2D.ts

    二、提问AI

    使用ccc 3.8.x 内置 API 帮我们写一个Joystick2D.ts组件,实现:
    1、2D摇杆组件
    2、摇杆带2个属性:1、摇杆方向节点 2、摇杆方向范围

    提问AI

    三、优化修改

    第一次修改:

    1、注释说明不完整,可以参考ResMgr.ts注释风格
    2、我们基于 ccc 3D场景创建的框架项目,所以要使用Vec3,不是Vec2
    3、directionRange 用于限制 摇杆移动的范围
    优化修改1

    第二次修改:

    现在摇杆组件怎么应用到游戏中呢?我们新加2个公开变量提供给游戏使用:
    1、方向角度 angle
    2、是否移动 isMoving
    优化修改2

    四、最终版本

    import { _decorator, Component, Node, Vec3, EventTouch, UITransform, math } from 'cc';
    const { ccclass, property } = _decorator;
    
    /**
     * 2D摇杆组件
     * 用于在3D场景中实现2D摇杆功能
     */
    @ccclass('Joystick2D')
    export class Joystick2D extends Component {
        /** 摇杆方向节点 */
        @property(Node)
        directionNode: Node = null;
    
        /** 摇杆方向范围,用于限制摇杆移动的范围 */
        @property
        directionRange: number = 100;
    
        /** 记录触摸开始的位置 */
        private _startPos: Vec3 = new Vec3();
    
        /** 方向角度 */
        public angle: number = 0;
    
        /** 是否正在移动 */
        public isMoving: boolean = false;
    
        start() {
            // 注册触摸事件
            this.node.on(Node.EventType.TOUCH_START, this.onTouchStart, this);
            this.node.on(Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
            this.node.on(Node.EventType.TOUCH_END, this.onTouchEnd, this);
            this.node.on(Node.EventType.TOUCH_CANCEL, this.onTouchEnd, this);
        }
    
        /**
         * 触摸开始事件处理
         * @param {EventTouch} event - 触摸事件
         */
        onTouchStart(event: EventTouch) {
            const uiTransform = this.node.getComponent(UITransform);
            if (uiTransform) {
                const touchPos = event.getUILocation();
                // 将触摸位置转换为节点空间坐标
                this._startPos = uiTransform.convertToNodeSpaceAR(new Vec3(touchPos.x, touchPos.y, 0));
                this.isMoving = true; // 开始移动
            }
        }
    
        /**
         * 触摸移动事件处理
         * @param {EventTouch} event - 触摸事件
         */
        onTouchMove(event: EventTouch) {
            const uiTransform = this.node.getComponent(UITransform);
            if (uiTransform) {
                const touchPos = event.getUILocation();
                // 将当前触摸位置转换为节点空间坐标
                const currentPos = uiTransform.convertToNodeSpaceAR(new Vec3(touchPos.x, touchPos.y, 0));
                // 计算触摸移动的偏移量
                const offset = currentPos.subtract(this._startPos);
                const distance = offset.length();
    
                // 如果偏移量超过了方向范围,则进行限制
                if (distance > this.directionRange) {
                    offset.multiplyScalar(this.directionRange / distance);
                }
    
                // 设置方向节点的位置
                this.directionNode.setPosition(offset.x, offset.y, 0);
    
                // 计算方向角度
                this.angle = math.toDegree(Math.atan2(offset.y, offset.x));
            }
        }
    
        /**
         * 触摸结束事件处理
         * @param {EventTouch} event - 触摸事件
         */
        onTouchEnd(event: EventTouch) {
            // 触摸结束时重置方向节点的位置
            this.directionNode.setPosition(0, 0, 0);
            this.isMoving = false; // 停止移动
        }
    
        update(deltaTime: number) {
            // 可以在这里更新摇杆的逻辑
        }
    }

    五、总结

    摇杆组件具体怎么使用呢?
    很简单,只需要在游戏 update 里获取摇杆的方向 angle 和是否移动 isMoving 这2个公开的变量,就能控制玩家的移动和移动方向。
    另外在我们的框架实战开发中也会有使用示例,敬请期待!

     

    作者:ccs2d.com  创建时间:2024-09-30 04:44
    最后编辑:ccs2d.com  更新时间:2024-10-06 09:43
    上一篇:
    下一篇: