《Cocos Creator游戏实战》非固定摇杆实现原理

为什么要使用非固定摇杆

许多同学在开发摇杆功能时,会将摇杆固定在屏幕左下某一位置,不会让其随着大拇指触摸点改变,而且玩家只有按在了摇杆上才能移动人物(触摸监听事件在摇杆精灵上)。然而,不同玩家的大拇指长度不同,使用这种固定摇杆可能会导致部分玩家无法快速按到摇杆,从而影响了游戏操作性。

非固定摇杆不需要玩家去寻找摇杆位置,玩家的大拇指只要在屏幕左下区域按下,摇杆就会自动被设置到大拇指按下的位置(触摸监听事件在画布上),游戏操作性因此提升。

注:有关固定摇杆的具体实现原理可以前往查看笔者的这篇文章

P.S. 上面的摇杆文章发布的时间是19年10月,时间过得好快。

运行效果和源码获取

Cocos Creator版本: 3.8.4
项目源码获取:搜索公号All Codes ,公号后台发送"非固定摇杆"

实现原理

1: 在摇杆组件生效时记录摇杆的位置。

ts 复制代码
/* 记录摇杆最初位置 */
recordOriginalPos() {
    this.originalPos = new Vec3(this.node.position)
}

2: 在TOUCH_START事件函数中,判断玩家触摸点是否在屏幕左下区域,是的话将摇杆设置到触摸点位置,不是的话则直接返回。

ts 复制代码
onTouchStart(event: EventTouch) {
    // 获取触摸点坐标
    let loc = event.getUILocation()
    let pos = this.canvas.getComponent(UITransform).convertToNodeSpaceAR(new Vec3(loc.x, loc.y, 0))

    // 判断触摸点是否在画布左下区域
    // 不是的话直接返回,是的话设置摇杆底部面板位置
    if (pos.x > 0 || pos.y > 0) {
        return
    }

    this.node.setPosition(pos)
    this.isTouchAreaCorrect = true
}

3: 在TOUCH_MOVE事件函数中,更新摇杆中心按钮在摇杆底部面板上的位置。

ts 复制代码
onTouchMove(event: EventTouch) {
    if (!this.isTouchAreaCorrect) {
        return
    }

    // 在该事件中我们只需要设置摇杆中心按钮的位置
    let posDelta = event.getDelta()
    this.joystickBtn.setPosition(new Vec3(this.joystickBtn.position).add3f(posDelta.x, posDelta.y, 0))
    
    // 获取移动方向和旋转角度
    this.dir = new Vec3(this.joystickBtn.position.x, this.joystickBtn.position.y, 0).normalize()
    if (this.dir.y > 0) {
        this.angle =  Vec3.angle(this.dir, new Vec3(1, 0, 0)) * 180 / Math.PI
    }
    else {
        this.angle =  -Vec3.angle(this.dir, new Vec3(1, 0, 0)) * 180 / Math.PI
    }

    // 设置主角isMoving变量为true
    this.playerComp.isMoving = true 
}

4: 在TOUCH_END和TOUCH_CANCEL事件函数中,重置相关变量并复原摇杆位置。摇杆底部面板回到在第1步中记录的位置,摇杆中心按钮回到摇杆底部面板中心位置。

ts 复制代码
onTouchEnd(event: EventTouch) {
    // 复原摇杆位置,重置相关变量
    this.node.setPosition(this.originalPos)
    this.joystickBtn.setPosition(Vec3.ZERO)
    this.playerComp.isMoving = false
    this.isTouchAreaCorrect = false
}

onTouchCancel(event: EventTouch) {
    // 复原摇杆位置,重置相关变量
    this.node.setPosition(this.originalPos)
    this.joystickBtn.setPosition(Vec3.ZERO)
    this.playerComp.isMoving = false
    this.isTouchAreaCorrect = false
}

王者荣耀中的非固定摇杆

相关推荐
gopyer15 小时前
180课时吃透Go语言游戏后端开发3:Go语言中其他常用的数据类型
开发语言·游戏·golang·游戏后端开发
wanhengidc18 小时前
云手机和网盘之间的关系
网络·游戏·智能手机·架构·云计算
点金石游戏出海1 天前
每周资讯 | 腾讯《三角洲行动》周年庆登双榜TOP1;腾讯首款生活模拟游戏《粒粒的小人国》曝光
游戏·腾讯·网易·游戏资讯·米哈游·三角洲行动·星布谷地
高山有多高1 天前
C语言实战项目:贪吃蛇(2)
c语言·开发语言·数据结构·c++·算法·游戏·游戏设计
陈尕六1 天前
从零开始的 Godot 之旅 — EP4:工作区基础操作与检查器初识
godot·游戏开发
倔强的石头_1 天前
一段奇遇的开始:当一名游戏开发者决定“氪金”升级装备
游戏开发
UWA1 天前
游戏在高负载场景下,整机功耗控制在多少
游戏·unity·性能优化·游戏开发
dllxhcjla2 天前
c++循环猜数字游戏
游戏
软件黑马王子2 天前
2025GUI项目实践:Unity编辑模式下GUI运行
游戏·unity·gui
wanhengidc2 天前
本机网速会影响到云手机的运行吗
运维·服务器·安全·游戏·智能手机