输入模块
目录
前言
输入模块一般包含:键盘输入、鼠标鼠标、触屏输入。考虑到我们是小游戏开发只需要触屏输入,而 ccc 已经内置了常用的触摸事件,我们只需要封装一个摇杆组件结合 ccc 内置触摸事件就能满足日常小游戏开发。
小白必读:摇杆组件的用处?
答:摇杆组件用于控制游戏中玩家角色的方向。一个完整的摇杆事件先后顺序为:触摸开始-->触摸移动-->触摸结束,其中触摸移动就能决定游戏中玩家角色的移动方向,我们在肉鸽类,RPG类,MOBA类等手游中都会使用到摇杆组件。
一、新建Joystick2D.ts
1、在Core分包目录下的Scripts目录新建Components目录用于保存各种组件
2、在Components目录下新建Joystick目录
3、在Joystick目录新建Joystick2D.ts脚本
二、提问AI
使用ccc 3.8.x 内置 API 帮我们写一个Joystick2D.ts组件,实现:
1、2D摇杆组件
2、摇杆带2个属性:1、摇杆方向节点 2、摇杆方向范围
三、优化修改
第一次修改:
1、注释说明不完整,可以参考ResMgr.ts注释风格
2、我们基于 ccc 3D场景创建的框架项目,所以要使用Vec3,不是Vec2
3、directionRange 用于限制 摇杆移动的范围
第二次修改:
现在摇杆组件怎么应用到游戏中呢?我们新加2个公开变量提供给游戏使用:
1、方向角度 angle
2、是否移动 isMoving
四、最终版本
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
最后编辑:ccs2d.com 更新时间:2024-10-06 09:43