CocosCreator使用物理引擎和回调

本文介绍了在2D游戏开发中如何启用碰撞检测,涉及刚体类型(静态、动态、运动和动画),以及如何设置Collider2D和PhysicsSystem2D的回调函数以响应碰撞事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在2d中开启碰撞需要在项目设置–功能裁剪–2D物理系统【选择 基于Box2D的2D物理系统】
如果想要两个物体碰撞,则需要添加刚体和碰撞【!!重点】
在这里插入图片描述
设置刚体类型 可以设为四种,
Static 静态刚体,零质量,零速度,即不会受到重力或速度影响,但是可以设置他的位置来进行移动。该类型通常用于制作场景
Dynamic 动态刚体,有质量,可以设置速度,会受到重力影响。
Kinematic 运动刚体,零质量,可以设置速度,不会受到重力的影响,但是可以设置速度来进行移动
Animated 动画刚体,在上面已经提到过,从 Kinematic 衍生的类型,主要用于刚体与动画编辑结合使用
在设置碰撞体的时候可以选择Editing编辑碰撞体
在这里插入图片描述
Regenerate Points输入的值越小,点越密集
监听碰撞代码如下

import {
  _decorator,
  Component,
  Node,
  RigidBody2D,
  Collider2D,
  Contact2DType,
  PhysicsSystem2D,
  IPhysics2DContact,
  tween,
  Vec3,
} from "cc";
const { ccclass, property } = _decorator;

@ccclass("rigidbodys")
export class rigidbodys extends Component {
  start() {
    // 注册单个碰撞体的回调函数
    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);
    }
    // 注册全局碰撞回调函数
    if (PhysicsSystem2D.instance) {
      PhysicsSystem2D.instance.on(
        Contact2DType.BEGIN_CONTACT,
        this.onBeginContact,
        this
      );
      PhysicsSystem2D.instance.on(
        Contact2DType.END_CONTACT,
        this.onEndContact,
        this
      );
      PhysicsSystem2D.instance.on(
        Contact2DType.PRE_SOLVE,
        this.onPreSolve,
        this
      );
      PhysicsSystem2D.instance.on(
        Contact2DType.POST_SOLVE,
        this.onPostSolve,
        this
      );
    }
  }
  onBeginContact(
    selfCollider: Collider2D,
    otherCollider: Collider2D,
    contact: IPhysics2DContact | null
  ) {
    // 只在两个碰撞体开始接触时被调用一次
    console.log("onBeginContact");
  }
  onEndContact(
    selfCollider: Collider2D,
    otherCollider: Collider2D,
    contact: IPhysics2DContact | null
  ) {
    // 只在两个碰撞体结束接触时被调用一次
    console.log("onEndContact");
  }
  onPreSolve(
    selfCollider: Collider2D,
    otherCollider: Collider2D,
    contact: IPhysics2DContact | null
  ) {
    // 每次将要处理碰撞体接触逻辑时被调用
    console.log("onPreSolve");
  }
  onPostSolve(
    selfCollider: Collider2D,
    otherCollider: Collider2D,
    contact: IPhysics2DContact | null
  ) {
    // 每次处理完碰撞体接触逻辑时被调用
    console.log("onPostSolve");
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值