1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > cocos creator 3.x 精灵不显示 加载动态图片 物理碰撞 人物跟随鼠标移动 碰撞后节点销毁

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

时间:2023-10-04 09:26:18

相关推荐

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/textureresources.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)}) }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。