看cocos教程,记录cocos3.x api新写法、cocos2d物理射线,解决触摸移动、图片滚动空隙(cocos的文档一言难尽)

本文记录了CocosCreator中API更新后的使用心得,包括移动物体的不同方法、触摸移动解决方案、世界坐标与节点坐标的转换,以及碰撞检测和2D物理射线的相关技巧,对初学者很有帮助。
摘要由CSDN通过智能技术生成

前言

更新中……

一边看Cocos Creator零基础小白超神教程一边练手时发现有很多api都改变了。记录下来节省后来人时间
3.8推荐看该教程,比百度好使

一方面也是知识点零散不好做笔记

源码位置:安装目录下的resources\resources\3d\engine
在这里插入图片描述

  1. 顶层canvas无法触发事件
  2. 触摸移动使用世界坐标系setWorldPosition
  3. new Vec3()可以简写成v3()
  4. 经测试,setPosition是相对父元素的锚点,position获取的坐标是相对于父节点锚点的坐标,setWorldPosition是相对于左下角(世界原点)
  5. 解决图片滚动空隙:卡顿导致deltaTime过大,所以直接在setposition的时候给一个更小的y值就行
  6. 用scale做动画,z轴不能设置为0,否则无法点击
  7. position的add方法会改变position而不是返回一个新的v3,源码为证,又没能在文档找到说法。还必须转成世界坐标系!
  8. uitransform的大小不能设置为0,不然会自动改成300*200!
  9. 图片资源的路径必须要在最后加spriteFrame
  10. 慎用auto release assets自动资源释放,报错Object.updateUVs (…/cocos-js/cc.8b346.js:1:1068082)

在这里插入图片描述

正文

移动位置的三种方式

  1. setPosition:建议使用v3避免重复实例化
// getPosition 可以传入out参数,则无需实例化,节省开销
let bulletPos = bullet.getPosition();//get返回的是一个私有变量,所以可以直接赋值修改了
   bulletPos.y += 100;

3

// set方法本质是调用了setPosition方法
    bullet.position = v3(this.node.position.x, this.node.position.y + 100);

触摸移动方案

  • input.on: 监听所有
  • node.on:监听范围内

不同api的场景:

  • getUILocation:UI 窗口内的坐标位置
  • getLocation: 世界坐标系
  • getLocationInView:游戏窗口内的坐标位置对象
  • convertToNodeSpaceAR:世界坐标转相对

触摸移动

  1. getLocation获取绝对定位,设置坐标时用convertToNodeSpaceAR转为相对
// 获取父节点的UITransform组件
      @property(Node)
  private map: Node = null;//map选择背景节点

  start() {
    this.map.on(Node.EventType.TOUCH_MOVE, (event: EventTouch) => {
      const parentUITransform = this.map.getComponent(UITransform);

      let touchPos = new Vec3(event.getLocationX(), event.getLocationY(), 0); // 获取触摸点的世界坐标
      let localPos = new Vec3();
      parentUITransform.convertToNodeSpaceAR(touchPos, localPos); // 转换到节点局部坐标
      this.node.setPosition(localPos.x, localPos.y);
    });
  }
  1. 直接设置世界坐标位置
input.on(Input.EventType.TOUCH_MOVE, (event: EventTouch) => {
      this.node.setWorldPosition(event.getLocationX(), event.getLocationY(), 0);
    });
  1. 只由玩家组件触发(3.5、3.6有版本差别):(我的选择)
    另一篇博客详细说明
this.node.on(Input.EventType.TOUCH_MOVE, (touch: EventTouch) => {
      this.node.setWorldPosition(v3(touch.getUILocation().x, touch.getUILocation().y));
    });

碰撞检测

文档

  1. 注册回调事件
  2. 编写钩子函数
  3. 功能裁剪中使用内置物理组件则无需添加刚体
   onLoad() {
   //获取碰撞组件父组件
    let collider = this.node.getComponent(Collider2D);
    collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
  }

// 只在两个碰撞体开始接触时被调用一次
// 只在两个碰撞体开始接触时被调用一次
  onBeginContact (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
    // 物理过程之后再销毁,以免报错
    director.once(Director.EVENT_AFTER_PHYSICS, () => {
      otherCollider.node.destroy();
    }, this)
}

2d物理射线

  • 经测试确实会忽略自身节点
    let distance = 100; // 射线长度
    let objs = new Vec2(this.node.getWorldPosition().x, this.node.getWorldPosition().y); // 起点
    let obje = new Vec2(this.node.getWorldPosition().x, this.node.getWorldPosition().y + distance * this.dir.y); // 终点  --向量数乘
    let results = PhysicsSystem2D.instance.raycast(objs, obje); // 遍历检测信息
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值