栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

cocos creator 3.x 精灵不显示、加载动态图片、物理碰撞、人物跟随鼠标移动、碰撞后节点销毁

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

cocos creator 3.x 精灵不显示、加载动态图片、物理碰撞、人物跟随鼠标移动、碰撞后节点销毁

温馨提醒:即刻转去Unity3d

精灵不显示:

不要在空节点下直接添加组件
正确的做法是:在空节点(Node)上右键创建一个精灵才会给看到 或者直接拖曳一个图片放到场景编辑器中也可

cocos creator 3.x图片动态加载

不知道是这文档抽象还是我阅读理解有问题 居然百度了三个小时没搜到哪里错了 后面在读了一遍才知道他是啥意思

这里是引用
加载 SpriteFrame 或 Texture2D
图片设置为 sprite-frame 或 texture 或其他图片类型后,将会在 资源管理器 中生成一个对应类型的资源。但如果直接加载 test assets/image,得到的类型将会是 ImageAsset。你必须指定路径到具体的子资源,才能加载到图片生成的 SpriteFrame:

// 加载 SpriteFrame,image 是 ImageAsset,spriteFrame 是 image/spriteFrame,texture 是 image/texture
resources.load("test assets/image/spriteFrame", SpriteFrame, (err, spriteFrame) => {
    this.node.getComponent(Sprite).spriteFrame = spriteFrame;
});

// 加载 SpriteFrame,image 是 ImageAsset,spriteFrame 是 image/spriteFrame,texture 是 image/texture

他的意思是你在你读到图片路径的屁股后面加一句/spriteFrame 获得的就是SpriteFrame的类型
加一句/texture就是texture的类型
我一直以为你他那个“image”是文件夹的意思 给我整无语了

我的图片位置:

我的脚本挂在:

然后代码应该这么写

let self = this;
 resources.load("test assets/image/ddd/spriteFrame", SpriteFrame, (err, spriteFrame) => {
            self.node.getComponent(Sprite).spriteFrame = spriteFrame
});
物理碰撞

3.x版本和以前不同

物体产生物理碰撞之后,原有的物理碰撞回调没有了
从 v3.0 开始,碰撞体回调需要在开始的时候进行注册,与原先 v2.x 会直接产生回调不同。因此开发者需要在物理回调的脚本中增加对回调函数的注册。例如:

let collider = this.getComponent(Collider2D);
if (collider) {
    // 只在两个碰撞体开始接触时被调用一次
    collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
    // 只在两个碰撞体结束接触时被调用一次
    collider.on(Contact2DType.END_CONTACT, this.onEndContact, this);
    // 每次将要处理碰撞体接触逻辑时被调用
    collider.on(Contact2DType.PRE_SOLVE, this.onPreSolve, this);
    // 每次处理完碰撞体接触逻辑时被调用
    collider.on(Contact2DType.POST_SOLVE, this.onPostSolve, this);
    }
});

升级之后,物理碰撞分组不见了 目前导入插件还不支持物理碰撞矩阵,因此暂时需要开发者手动设置碰撞矩阵,可在 Creator 主菜单 项目 ->
项目设置 -> 物理 中重新设置。

根据文档
要先在sprite上加上BoxCollider2D和RigidBody2D
并且碰撞双方RigidBody2D都要打开这个碰撞监听属性


代码:

start () {
  let collider =  this.getComponent(Collider2D);
  if(collider){
      console.log(1)
      collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this)
  }

}
onBeginContact (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
    // 只在两个碰撞体开始接触时被调用一次
    console.log('onBeginContact');
}

或者并不用开启RigidBody2D
只需要把项目设置里的这里改成内置的2D物理系统即可
简单的碰撞计算并不需要用到RigidBody2D

人物跟随鼠标移动

需要获取的是getUILocation()并不是 鼠标的getLocation()

   start () {
        input.on(Input.EventType.TOUCH_MOVE,(event)=>{            
            this.node.setWorldPosition(v3(event.getUILocation().x,event.getUILocation().y,0))
        },this)

    }
碰撞后节点销毁

必须要延迟一帧 我查了查他那个论坛 好像是说是引擎特色

HitEnemy(self:Collider2D,other:Collider2D){
    if(other.tag == 0){
        //延迟一帧
        this.scheduleOnce(()=>{
            //敌人销毁
            other.getComponent(enemyScript).die()
            //自己销毁
            self.node.destroy()
        },0)
    }
    
}
世界坐标系转局部坐标系

获取碰撞点转坐标系

        let col = this.getComponent(Collider2D)

        col.on(Contact2DType.BEGIN_CONTACT,(self:Collider2D,other:Collider2D,contant:IPhysics2DContact)=>{
            //世界坐标系
            //获取坐标点
            let point = contant.getWorldManifold().points[0]
            //获取法线
            let normal =contant.getWorldManifold().normal
            //转换为canvas下的局部坐标
            let newpoint = this.node.getParent().getComponent(UITransform).convertToNodeSpaceAR(v3(point.x,point.y,0))
            //设置
            this.node.getParent().getChildByName("bird0_2").setPosition(newpoint)
            console.log(normal)
            console.log(this.node.getParent().getComponent(UITransform).convertToNodeSpaceAR(v3(normal.x,normal.y,0)))

        
            
        },this)
raycast射线检测

先要把需要检测的物体的刚体(RigitBody2D)和BoxCollider2D都勾上
然后我还发现了 这物理系统的参数估计用的全都是世界坐标系到时候都得从UI坐标系中转出来还有如果报错别急,就先延后一帧试试看,再错就去查文档

    onLoad(){
        
            //经典延后一帧不然报错
            this.scheduleOnce(()=>{
                let phy = PhysicsSystem2D.instance
                //转换为世界坐标系
                let newp = this.node.getParent().getComponent(UITransform).convertToWorldSpaceAR(this.node.getPosition())
                //然后就能检测到了
                let res =  phy.raycast(newp,v2(newp.x+200,newp.y),ERaycast2DType.Closest)   
                console.log(res)
            })   

    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号