cocosCreator 之 2D物理

版本: v3.4.0


简介

cocosCreator 内置了 2D 物理系统 和 3D 物理系统,开发者可以通过项目 -> 项目设置 -> 功能裁切来配置物理系统相关:

请添加图片描述

本文仅对2D 物理系统 做下说明和遇到的问题汇总。该物理系统在cocosCreator的功能裁切中,主要有两个:

  • 内置的2D物理系统 :它仅提供了碰撞检测的功能,对于物理计算较为简单的情况,推荐使用。
  • 基于Box2D的2D物理系统 : 支持RigidBody2D(刚体)和Joint2D(物理关节)的使用,支持模拟物理世界相关的重力,摩擦,弹性等设置。 运行开销比内置的要大。

简单的理解二者的使用,如果你只需要简单的碰撞检测,类似于飞机射击的那种,用内置的就可以。

如果你需要物体支持重力,摩擦,还要支持碰撞相关,比如合成水果相关,那就Box2D

使用物理引擎,他们之间均需要Collider2D(碰撞组件)的支持。


2D碰撞组件

目前引擎支持如下几种碰撞组件:

  • 盒碰撞组件(BoxCollider2D)
  • 圆形碰撞组件(CircleCollider2D)
  • 多边形碰撞组件(PolygonCollider2D)

属性检测器中添加组件,搜索Collider2D即可查找对应的组件相关。他们的共同属性:

请添加图片描述

属性名说明
Editing对碰撞组件的区域进行编辑,它不会在程序运行的时候显示出来
Tag标签,可用于发生碰撞回调时,通过tag区分不同的碰撞组件,默认为0
Group碰撞矩阵分组,在项目 -> 物理中可以设置,用于检测不同分组之间的可能性
Sensor勾选后会有碰撞回调,但没有物理碰撞效果。 比如物体落在地板上,停止移动,就不要勾选。
Density碰撞组件的密度,用于刚体的质量计算
Friction摩擦力系数
Restitution弹性系数
Offset设置碰撞组件偏移

如果只需要有碰撞检测和碰撞回调事件的发生,物理引擎选择内置即可,且必须勾选Sensor选项。


RigidBody2D 刚体组件

RigidBody2D的使用主要用于Box2D物理引擎中;如果使用的是内置物理引擎,切记,该组件是不会生效的。

它的使用可通过属性检查器 -> 添加组件 -> RigidBody2D即可。它的属性:

请添加图片描述

属性说明
Group刚体的分组。通过 碰撞矩阵 可设置不同分组间碰撞的可能性
EnabledContactListener开启监听碰撞回调
Bullet这个刚体是否是一个快速移动的刚体,并且需要禁止穿过其他快速移动的刚体
Type刚体类型,有Static, Dynamic,Kinematic, Animated
AlllowSleep是否允许刚体休眠
GravityScale重力缩放比例 仅对 Dynamic 类型的刚体生效
LinearDamping移动速度衰减系数
AngularDamping旋转速度衰减系数
LinearVelocity移动速度 仅对 DynamicKinematic 类型的刚体生效
AngularVelocity旋转速度 仅对 DynamicKinematic 类型的刚体生效
FixedRotation是否固定旋转
AwakeOnLoad加载完成后立刻唤醒刚体

内置引擎相比较,使用Box2D需要碰撞回调的支持,一定要增加该组件,且勾选属性EnableContactListener

但要注意的是: Collider2D组件下的Senor属性就不要再勾选了,否则无法模拟物理世界活动。


碰撞回调

碰撞回调的注册主要有两种:

  • PhysicsSystem2D.instance.on 注册全局回调
  • clllider.on 注册单个碰撞体的回调

他们的回调事件类型是相同的,主要有:

export const Contact2DType: {None: string;// 两个碰撞体开始接触时调用一次BEGIN_CONTACT: string;// 只在两个碰撞体结束接触时被调用一次END_CONTACT: string;// 每次将要处理碰撞体接触逻辑时被调用PRE_SOLVE: string;// 每次处理完碰撞体接触逻辑时被调用POST_SOLVE: string;
};

回调的实例:

@ccclass('TestContactCallBack')
export class TestContactCallBack extends Component {onLoad () {// 注册单个碰撞体的回调函数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);}// 注册全局碰撞回调函数const System2D = PhysicsSystem2D.instanceif (System2D) {System2D.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);System2D.on(Contact2DType.END_CONTACT, this.onEndContact, this);System2D.on(Contact2DType.PRE_SOLVE, this.onPreSolve, this);System2D.on(Contact2DType.POST_SOLVE, this.onPostSolve, this);}}/*监听回调事件的参数:self: 指的是回调脚本上的节点碰撞体other: 指的是发生碰撞的另一个碰撞体contact: 包含碰撞的主要信息*/onBeginContact (self: Collider2D, other: Collider2D, contact: IPhysics2DContact) {console.log('onBeginContact');let curTag = other.tag;			// 获取当前标签}onEndContact (self: Collider2D, other: Collider2D, contact: IPhysics2DContact) {console.log('onEndContact');}onPreSolve (self: Collider2D, other: Collider2D, contact: IPhysics2DContact) {console.log('onPreSolve');}onPostSolve (self: Collider2D, other: Collider2D, contact: IPhysics2DContact | null) {console.log('onPostSolve');}
}

如果使用的是内置的物理引擎,它的事件回调仅支持BEGIN_CONTACTEND_CONTACT两种。

如果每个碰撞体都有各自的碰撞检测活动,就不要使用全局监听。比如说,飞机发射的子弹击中敌人,敌人死亡发生爆炸,如果是全局回调,就会导致所有的敌人都会死亡。

在cocosCreator 3.4.x中 物理系统是默认开启的,通过PhysicsSystem2D设置即可

PhysicsSystem2D.instance.enable = true;

通过debugDrawFlags可调试物理信息相关,主要的标记位有:

export enum EPhysics2DDrawFlags {None = 0,Shape = 1,Joint = 2,Aabb = 4,Pair = 8,CenterOfMass = 16,Particle = 32,Controller = 64,All = 63
}// 打开物理调试
PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb |EPhysics2DDrawFlags.Pair |EPhysics2DDrawFlags.CenterOfMass |EPhysics2DDrawFlags.Joint |EPhysics2DDrawFlags.Shape;// 关闭物理调试
PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.None;

其他

  1. 动态构建物体,碰撞器的大小受图形影响,不要使用UITransform下的getBoundingBox方法获取大小 。以创建合成水果的不同水果item为例,使用的是CircleCollider2D圆形碰撞组件
private createFruitItem(index: number) {// 图片相关,从图集当中对应的图片const name = "fruit_" + index.toString();const fruitImg = this.node.getComponent(Sprite);const spriteFrame = fruitImg.spriteAtlas.getSpriteFrame(name);if (spriteFrame != null) {fruitImg.spriteFrame = spriteFrame;}// 碰撞组件相关let collider = this.node.getComponent(CircleCollider2D);collider.on(Contact2DType.BEGIN_CONTACT, this.beginContac, this);const transfrom = this.node.getComponent(UITransform);// 大小相关collider.radius = transfrom.width/2;collider.tag = index;collider.apply();
}
  1. 在碰撞回调中,如果需要对节点销毁,就稍微延迟下销毁,否则很容易导致错误:

请添加图片描述

private beginContac(self: Collider2D, other: Collider2D) {setTimeout(()=> {if(this.node && this.node.isValid) {this.node.destroy();}}, 50);
}

实例项目参考: CreatorGameProjects 下的PlaneComposeFruits即可。

End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 如何分析应用的内存(十三)——perfetto

android 如何分析应用的内存(十三) 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始,android开发者峰会正式推出perfetto工具。从此perfetto成为安卓最重要的工具之一。在2018年以前,android使用syst…

微信小程序tab加列表demo

一、效果 代码复制即可使用,记得把图标替换成个人工程项目图片。 微信小程序开发经常会遇到各种各样的页面组合,本demo为list列表与tab组合,代码如下: 二、json代码 {"usingComponents": {},"navigationStyle&q…

matlab使用教程(6)—线性方程组的求解

进行科学计算时,最重要的一个问题是对联立线性方程组求解。在矩阵表示法中,常见问题采用以下形式:给定两个矩阵 A 和 b,是否存在一个唯一矩阵 x 使 Ax b 或 xA b? 考虑一维示例具有指导意义。例如,方程 …

20.3 HTML 表格

1. table表格 table标签是HTML中用来创建表格的元素. table标签通常包含以下子标签: - th标签: 表示表格的表头单元格(table header), 用于描述列的标题. - tr标签: 表示表格的行(table row). - td标签: 表示表格的单元格(table data), 通常位于tr标签内, 用于放置单元格中的…

奥迪A3:最新款奥迪A3内饰设计及智能科技应用

奥迪A3一直以来都是奥迪的入门级车型,但这并不意味着它在科技和内饰方面会有所退步。最新款奥迪A3的内饰设计和智能科技应用让人们再次惊叹奥迪的创新能力。 内饰设计 奥迪A3最新款的内饰设计引入了奥迪最新的设计元素,比如8.8英寸的中控显示屏&#xf…

干货 ,ChatGPT 4.0插件Review Reader,秒杀一切选品神器

Hi! 大家好,我是专注于AI项目实战的赤辰,今天继续跟大家介绍另外一款GPT4.0插件Review Reader(评论阅读器)。 做电商领域的小伙伴们,都知道选品分析至关重要,可以说选品决定成败,它直接关系到产…

【深度学习】High-Resolution Image Synthesis with Latent Diffusion Models,论文

13 Apr 2022 论文:https://arxiv.org/abs/2112.10752 代码:https://github.com/CompVis/latent-diffusion 文章目录 PS基本概念运作原理 AbstractIntroductionRelated WorkMethodPerceptual Image CompressionLatent Diffusion Models Conditioning Mec…

申请软件著作权都有什么好处?

随着社会的发展,知识产权保护意识对于公司而言尤为重要,对自己的权利进行最大限度的保护,以防止被别有用心的人侵权。那么,申请软著的好处到底是什么?软著有什么用呢? 无形资产软著是一种无形的知识产权,是开发者智慧…

Spark-对RDD的理解

RDD是分布式弹性数据集。 RDD有五大特性: 一组分区,每个RDD都会被分为多个分区,这些分区运行在集群的不同节点上,分区数决定并行计算的数量。一个计算每个分区的函数,就是计算逻辑。RDD之间的依赖关系,就…

大数据技术之Clickhouse---入门篇---数据类型、表引擎

星光下的赶路人star的个人主页 今天没有开始的事,明天绝对不会完成 文章目录 1、数据类型1.1 整型1.2 浮点型1.3 布尔型1.4 Decimal型1.5 字符串1.6 枚举类型1.7 时间类型1.8 数组 2、表引擎2.1 表引擎的使用2.2 TinyLog2.3 Memory2.4 MergeTree2.4.1 Partition by分…

简单分享婚宴预订小程序怎么做

婚宴预订小程序需要具备一些功能,通过这些功能,新人可以更方便地选择婚宴场地、预订服务,并且更好地规划自己的婚礼。 1. 场地浏览与选择 婚宴预订小程序可以展示多个婚宴场地的照片和详细信息,包括容纳人数、场地设施、价格等。…

无涯教程-Lua - Arrays(数组)

数组是对象的有序排列,可以是包含行集合的一维数组,也可以是包含多行和多列的多维数组。 在Lua中,数组是使用带有整数的索引表实现的。数组的大小不是固定的,并且可以根据无涯教程的要求(取决于内存限制)来增长。 一维数组 一维…

8.1作业

文件IO函数实现拷贝文件。子进程先拷贝后半部分&#xff0c;父进程再拷贝前半部分&#xff0c;允许使用sleep函数 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpidfo…

指针初阶(1)

文章目录 目录1. 指针是什么2. 指针变量的类型2.1 指针变量-整数2.2 指针变量的解引用 3. 野指针3.1 野指针成因3.2 如何规避野指针 4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 附&#xff1a; 目录 指针是什么指针变量的类型野指针指针运算指针和数组二级指针…

面试总结(三)

1.进程和线程的区别 根本区别&#xff1a;进程是操作系统分配资源的最小单位&#xff1b;线程是CPU调度的最小单位所属关系&#xff1a;一个进程包含了多个线程&#xff0c;至少拥有一个主线程&#xff1b;线程所属于进程开销不同&#xff1a;进程的创建&#xff0c;销毁&…

【Vue组件eval方法的使用】

Vue页面中条件可以放在当前vue页面中而无需影响到组件 如 这是我的表格操作列按钮&#xff0c;需求是第四个按钮如果表格当前数据的is_execl字段为0则显示否则隐藏 这种条件判断很频繁 如果像之前一样给一个标识&#xff0c;页面多了就难以维护&#xff0c;而且判断条件如果不…

【硬件设计】模拟电子基础一--元器件介绍

模拟电子基础一--元器件介绍 一、半导体&#xff08;了解&#xff09;1.1 基础知识1.2 PN结 二、二级管2.1 定义与特性2.2 二极管的分类 三、三级管四、MOS管三、其他元器件管3.1 电容3.2 光耦3.3 发声器件3.4 继电器3.5 瞬态电压抑制器 前言&#xff1a;本章为知识的简单复习&…

【Spring框架】SpringBoot创建和使用

目录 什么是SpringBoot&#xff1f;SpringBoot优点创建SpringBootSpringBoot使用 什么是SpringBoot&#xff1f; Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 SpringBoot优点 1.起步依赖(创建的时候就可以方…

Python爬虫遇到URL错误解决办法大全

在进行Python爬虫任务时&#xff0c;遇到URL错误是常见的问题之一。一个错误的URL链接可能导致爬虫无法访问所需的网页或资源。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决方法&#xff0c;并给出相关代码示例&#xff0c;希望对您的爬虫任务有所帮助。 一、…

玩转顺序表——【数据结构】

在C语言学习中&#xff0c;我们经常会遇见增删查改等一系列操作&#xff0c;而这些操作全都与线性表关联&#xff0c;没有线性表将会对这些操作完成的十分艰难&#xff01;那今天就让我们来了解一下顺序表如何增删查改&#xff01;&#xff01;&#xff01; 目录 1.线性表 2…