cocos之游戏手柄控制实例

  • 1.场景布置
  • 2. 添加手柄监听器
  • 3. 添加小车的控制
    • 1. 小车的旋转
    • 2. 小车的移动
  • 最终效果

1.场景布置


2. 添加手柄监听器

  1. 监听事件的变化
    由原先的mouse系列的转换为touch系列的

    1. touchstart 触摸按下,相当于 mousedown
      2 . touchmove 触摸移动,相当于 mousemove
    2. touchend 触摸抬起,相当于 mouseup
    3. touchcancel 触摸取消,被其他事件终止,相当于按下了ESC键
  2. 坐标设定:当触摸按下随推动位置变化(要用世界坐标转换),触摸抬起后回归原位(直接设定0,0坐标默认相对坐标)。
    setPosition()设定的为相对父节点的坐标

  onTouchMove(e:cc.Event.EventTouch){// e.getLocation() 为点击的位置,是世界坐标// 需要把世界坐标转换为本地坐标let parent=this.node.parent;// 父节点 (圆形底盘)let pos:cc.Vec2=parent.convertToNodeSpaceAR(e.getLocation());this.node.setPosition(pos);}onTouchCancel(){this.node.setPosition(cc.v3(0,0,0));}


3. 将手柄限制在托盘内。使用方位角来定位边缘位置。pos.normalize()方法返回该点相对于(0,0)的(cos, sin),返回Vec2对象。

  let parent=this.node.parent;// 父节点 (圆形底盘)let pos:cc.Vec2=parent.convertToNodeSpaceAR(e.getLocation());// 该点所在的方位 (cos, sin)let direction:cc.Vec2=pos.normalize();// 限制在边界之内let maxR = 100-20;   //点击的点到托盘中央的距离let r : number = cc.Vec2.distance(pos, cc.v2(0,0));if( r > maxR){pos.x = maxR * direction.x; pos.y = maxR * direction.y;}// cc.log("相对位置: " + pos.x + ", " + pos.y);this.node.setPosition( pos);

3. 添加小车的控制

1. 小车的旋转

  1. cc.Node.angle
    表示旋转的角度,逆时针为正
    官方建议不要使用 cc.Node.rotation
  2. a.signAngle( b)
    a和b为两个向量,返回值是一a,b的夹角 (弧度值)
    radian = a.signAngle(b)
    (1) a位于b的顺时针方向:角度为正
    (2) a位于b的逆时针方向:角度为负

旋转实现:
添加属性 car :cc.Node=null;获取小车节点。
cc.find()注意参数用"/"除号的斜杠,否则识别不到

   onLoad () {this.car=cc.find("Canvas/小车");}
        let radian=pos.signAngle(cc.v2(1,0));//计算点击位置与水平的夹角let ang=radian/Math.PI*180;//弧度制转换为角度值this.car.angle=-ang;//逆时针为正,所以这里要调整至顺时针

2. 小车的移动

  1. . 再小车的脚本中添加前进的动画,update(dt)方法中让x和y每帧加对应的速度在x和y轴的分量。
  2. 在手柄控制脚本中获取小车节点下的脚本。通过上面获取的direction的方向角,传入小车脚本中。通过控制direction来控制小车的移动。

小车运动脚本

   direction: cc.Vec2=null;speed:number=3;onLoad () {}start () {}update (dt) {if(this.direction==null) return;//静止let  dx=this.speed*this.direction.x;let  dy=this.speed*this.direction.y;let pos=this.node.getPosition();pos.x+=dx;pos.y+=dy;this.node.setPosition(pos);}

手柄控制脚本

  car :cc.Node=null;carscript:cc.Component=null;// LIFE-CYCLE CALLBACKS:onLoad () {this.car=cc.find("Canvas/小车");this.carscript=this.car.getComponent("CarMove");}start () {this.node.on('touchstart', this.onTouchStart, this);this.node.on('touchmove', this.onTouchMove, this);this.node.on('touchend', this.onTouchCancel, this);this.node.on('touchcancel', this.onTouchCancel, this);}onTouchStart(){}onTouchMove(e:cc.Event.EventTouch){// e.getLocation() 为点击的位置,是世界坐标// 需要把世界坐标转换为本地坐标// let parent=this.node.parent;// 父节点 (圆形底盘)// let pos:cc.Vec2=parent.convertToNodeSpaceAR(e.getLocation());// this.node.setPosition(pos);let parent=this.node.parent;// 父节点 (圆形底盘)let pos:cc.Vec2=parent.convertToNodeSpaceAR(e.getLocation());// 该点所在的方位 (cos, sin)let direction:cc.Vec2=pos.normalize();// 限制在边界之内let maxR = 100-20;   let r : number = cc.Vec2.distance(pos, cc.v2(0,0));if( r > maxR){pos.x = maxR * direction.x; pos.y = maxR * direction.y;}// cc.log("相对位置: " + pos.x + ", " + pos.y);this.node.setPosition( pos);let radian=pos.signAngle(cc.v2(1,0));//计算点击位置与水平的夹角let ang=radian/Math.PI*180;//弧度制转换为角度值this.car.angle=-ang;//逆时针为正,所以这里要调整至顺时针this.carscript.direction=direction;}onTouchCancel(){this.node.setPosition(cc.v3(0,0,0));//将方向置空,使汽车停止this.carscript.direction=null;}// update (dt) {}

最终效果

cocos之游戏手柄控制实例相关推荐

  1. Cocos Creator游戏开发教程 学习笔记

    学完提问几个问题吧: position的锚点位置数值原点在哪里? 因为position是相对坐标,所以原点是父节点的锚点 .所以Canvas下面的直属节点原点就是世界坐标系的原点Canvas的锚点. ...

  2. 《Unity 3.x游戏开发实例》一1.5 欢迎来到Unity 3D

    本节书摘来异步社区<Unity 3.x游戏开发实例>一书中的第1章,第1.5节,作者: [加]Ryan Henson Creighton 译者: 师蓉 责编: 陈冀康,更多章节内容可以访问 ...

  3. java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)

    游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...

  4. python小项目实例流程-python实现的简单RPG游戏流程实例

    本文实例讲述了python实现的简单RPG游戏流程.分享给大家供大家参考.具体如下: #RPG rpg = True whp = 100 mahp = 100 hhp = 100 MHP = 10 d ...

  5. 《Unity 3.x游戏开发实例》——2.10节注意

    本节书摘来自异步社区<Unity 3.x游戏开发实例>一书中的第2章,第2.10节注意,作者 [加]Ryan Henson Creighton,更多章节内容可以访问云栖社区"异步 ...

  6. python文字游戏源代码求年纪_Python实现猜年龄游戏代码实例

    1. 在猜年龄的基础上编写登录.注册方法,并且把猜年龄游戏分函数处理,如 2. 登录函数 3. 注册函数 4. 猜年龄函数 5. 选择奖品函数 代码如下 import json real_age = ...

  7. python编程手机模拟点击_python模拟点击玩游戏的实例讲解

    小编发现很多小伙伴都喜欢玩一些游戏,而手游因为玩的场景限制不多,所以受众的人更多.游戏里有很多重复的任务需要我们完成,虽然过程非常无聊,但是为了任务奖励还是有很多小伙伴不厌其烦的去做.那么,有没有什么 ...

  8. 多态 在游戏程序实例

    在面向对象的程序设计中,使用多态能够增强程序的可扩充性,即程序需要修改或增加功能时,只需改动或增加较少的代码.此外,使用多态也能起到精简代码的作用.本节通过两个实例来说明多态的作用. 游戏程序实例 游 ...

  9. C++多态的好处和作用(游戏程序实例)

    http://c.biancheng.net/view/265.html 在面向对象的程序设计中,使用多态能够增强程序的可扩充性,即程序需要修改或增加功能时,只需改动或增加较少的代码.此外,使用多态也 ...

最新文章

  1. OVS openflow(二十四)
  2. Leetcode 264. 丑数 II 解题思路及C++实现
  3. Java 面试知识点解析(二)——高并发编程篇
  4. 近世代数--整环与域--有限的整环是域
  5. 【原】页面跳转以及表单提交中有中文的解决办法
  6. 加加速度matlab,关于加加速度的若干机械运动分析及MATLAB模拟
  7. easyui源码翻译1.32--panel(面板)
  8. ftp服务器生成文件,ftp服务器自动生成文件
  9. Secure DevOps!探真科技2022云原生安全产品发布会圆满落幕
  10. 架构学习----消息队列
  11. 由杭州恶性撞人事件想到的
  12. hibernate整合openGauss
  13. 【银河麒麟V10】【桌面】安装虚拟pdf打印机
  14. c语言声音控制大小,C语言 如何将系统音量级别设置为从0到100的标量?
  15. MySQL创建视图的语法格式_Mysql创建视图语法及其创建种类
  16. 坚果云服务器地址,#网盘每日小技巧分享# 坚果云API是什么?
  17. Mybatis入门学习
  18. 罗兰贝格 | 适者生存:VUCA的世界
  19. 【数据挖掘实验】利用朴素贝叶斯方法对百万搜狐新闻文本数据进行分类
  20. 农村信用社答题小程序

热门文章

  1. 浏览器和服务器的区别
  2. GooglePay默认支付(payment)应用 之一
  3. 百度智能云TechDay干货满满!揭秘“百度太行”硬核技术,秀业务上云组合拳
  4. 微信上网卡WeSim悄然发布
  5. 3G0众测靶场-0407 WriteUp
  6. SAP ABAP 调用 BAPI_GOODSMVT_CREATE 没有执行 MIGO/MB0A 相同检查的问题
  7. AtCoder Beginner Contest 285 青大蒟蒻训练日常(A-F) 上分场(可惜unr)
  8. Permission denied(publickey) 解决办法
  9. python 百度云盘 数据迁移_python爬虫,爬取百度云盘,找你兄弟的机器活塞运动原理文件?...
  10. 凡亿教育发布电子工程师利器:IC封装网 V.1.0