Cocos Creator 3D 摇杆控制器一种简单实现!

news/2024/7/19 14:47:29 标签: 控制器, 3d, nokia, unity3d, js
js_content">

一个控制移动和视角的遥感控制器3D示例项目。

效果

原理

在贪吃蛇大作战!蛇移动的思考与实现!中使用到一个摇杆控制器,不过这是在2D层面上,这次把它改到3D上。

摇杆

摇杆的原理大致是把触摸点的位置传给需要的组件。(参考KUOKUO的摇杆组件改的)

监听触摸事件后,需要做一次坐标转换。在Cocos 3D中 ,坐标转换要用UITransformComponent组件。

接着把坐标和角度以事件的形式发送出去就可以了。

onTouchMove(e: EventTouch) {
    const location = e.getUILocation();
    // 坐标转换
    let pos = this.uITransform.convertToNodeSpaceAR(new Vec3(location.x, location.y));
    // 根据半径限制位置
    this.clampPos(pos);
    // 设置中间点的位置
    this.midNode.setPosition(pos.x, pos.y, 0);
    // 算出与(1,0)的夹角
    let angle = this.covertToAngle(pos);
    // 触发回调
    this.joyCallBack.forEach(c => c.emit([pos, angle]));
}

移动与视角

这里分了三个节点去分别控制节点移动,角色旋转,视角旋转。

使用摇杆返回的结果,根据模型初始状态和摄像机的角度,可以算出移动的速度和旋转的速度。

/** 移动摇杆触发回调 */
joysitckCallback(vector: Vec3, angle: number) {
    // 根据摄像机的角度旋转
    Vec3.rotateZ(vector, vector, Vec3.ZERO, this.node_camera.eulerAngles.y * macro.RAD);
    this._vector = vector.normalize();
    if (angle) {
        // 模型初始朝前,补个90度
        this.node_role.eulerAngles = new Vec3(0, angle + 90 + this.node_camera.eulerAngles.y, 0);
    }
}

/** 旋转摇杆触发回调 */
joysitckAngleCallback(vector: Vec3, angle: number) {
    this._vectorAngle = vector.normalize();
}

根据速度,每帧刷新位置和角度就可以了。

fix_update(dt: number) {
    if (this._vector.lengthSqr() > 0) {
        this.node.setPosition(this.node.position.add3f(this._vector.x * SPEED * dt, 0, -this._vector.y * SPEED * dt));
    }  

    if (this._vectorAngle.lengthSqr() > 0) {
        this.node_camera.eulerAngles = this.node_camera.eulerAngles.add3f(0, -this._vectorAngle.x, 0);
    }
}

小结

坐标转换!旋转!跳跃!不停歇!

以上为白玉无冰使用Cocos Creator 3D v1.1.1实现"摇杆控制器!"的技术分享。欢迎分享给身边的朋友!

那些不能激励自己的人一定是甘于平庸的人,无论他们的其他才能有多么令人印象深刻。

"在看"鼓励一下么~


http://www.niftyadmin.cn/n/806388.html

相关文章

推荐一位好友,是他让我破了戒!

“不要闷骚,以后没前途”这是我在「大大大火球」项目经理特战训练营上,记得的一最清晰的一句话!摘要29年前我就开始写代码,很喜欢写代码,直到现在为止仍然热度不减!人生总是会和你开点小玩笑,我…

了不起的 Creator Shader修仙之路—探照灯效果详解

介绍探照灯效果就是指整个场景或者图片都是黑的,只有灯光照射的地方才是亮的。实现方式有很多种,我们这里用shader来实现,主要原因就是用shader来实现,效率更高,效果更好,并且拓展性更强一些。下面是一个探…

如何假装一个成熟的「职场人」?

职场礼仪,是每个职场人的必修课下面,是为你精心准备修订的《2020职场礼仪指南》希望大家好好学习,认真实践——同事篇123商务篇123领导篇123职场日常篇123456-END-

oracle中 connect by prior 递归算法

http://xxciof.blog.163.com/blog/static/7978132720095193113752/ oracle中 connect by prior 递归算法 Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 c…

wordpress 更改 Home为首页

要怎麼更改wordpress的 menu上 那一直顯示著"首頁"的頁籤呢這問題我實在是找好久終於給我找到在 wp-includes 的 post-template.php 這檔案找到這行 $text __(Home);把 __(HOME)改成你要的字就行啦转载于:https://www.cnblogs.com/semcoding/p/3825228.html

Javascript对象拷贝(clone)

1. [代码]方法代码 function cp(source, target) { function isBaseType(v) { var type typeof v; var basetype { "string": true, "number": true, "boolean": true, &qu…

怎样将程序猿写出来的程序打包成安装包(最简单的)

一、准备工作:先下载一个Inno Setup编译器,这里我用到的是5.3.3中文版的。 下载地址:http://www.skycn.com/soft/5625.html 软件介绍: Inno Setup 是一个免费的安装制作软件,小巧、简便、精美是其最大特点&#xff0c…

Java精确计算

Java精确计算 如果我们编译运行下面这个程序会看到什么? public class Test{public static void main(String args[]){System.out.println(0.050.01);System.out.println(1.0-0.42);System.out.println(4.015*100);System.out.println(123.3/100);} } 你没有看错&am…