Phaser 3 - 物质物理 - 意外 "Jumping Bean" 行为

Phaser 3 - Matter Physics - Unexpected "Jumping Bean" Behaviour

我正在使用 Phaser 3MatterJS 物理引擎构建一个基本的物理游戏。

(我把游戏的例子放在这里进行测试:game demo)

一切都进行得很顺利,但是当 dynamic body)试图停在平面上时,我目前看到一些奇怪的行为 static body地面)。球并没有失去所有动量/速度并变得静止,而是四处跳跃,就好像它正在与移动物体碰撞一样(球的轨迹如提供的屏幕截图所示)。

随着球不断以随机方向和随机高度跳跃,这种情况永远持续下去。

我不确定是什么导致了这种永无止境的 运动,但这是物理体的代码:

任何想法都会很棒!

注意:我现在正在使用 Phaser.GameObjects.Container,因为我需要将其他游戏对象添加到此容器中。

球类游戏对象:

export class HoleBall extends Phaser.GameObjects.Container {
  private ball: Phaser.Physics.Matter.Sprite;

  constructor(
    public scene: Phaser.Scene,
    public x: number,
    public y: number,
    private ballStartPosition: IPosition
  ) {
    super(scene, x, y);
    this.createPhysicsObjects();
  }

  private createPhysicsObjects(): void {
    const shapes = this.scene.cache.json.get(
      ECourseItems.COMMON_PHYSICS_SHAPES
    );

    this.ball = this.scene.matter.add
      .sprite(
        this.ballStartPosition.x,
        this.ballStartPosition.y,
        ECourseItems.COMMON_SPRITE_SHEET,
        ECourseItems.BALL,
        {
          shape: shapes.ball,
          label: ECourseItems.BALL,
        } as TMatterBody
      )
      .setSleepThreshold(settings.ball.sleepThreshold);
    this.ball.setDepth(2);
  }

  public getBall(): Phaser.Physics.Matter.Sprite {
    return this.ball;
  }
}

地面游戏对象:

export class HoleGround extends Phaser.GameObjects.Container {
  private ground: Phaser.Physics.Matter.Image;

  constructor(
    public scene: Phaser.Scene,
    public x: number,
    public y: number,
    private holePhysicsShapeKey: ECourseItems,
    private holeSpriteSheetKey: ECourseItems
  ) {
    super(scene, x, y);
    this.createPhysicsObjects();
  }

  private createPhysicsObjects(): void {
    const shapes = this.scene.cache.json.get(this.holePhysicsShapeKey);

    this.ground = this.scene.matter.add.image(
      0,
      0,
      this.holeSpriteSheetKey,
      ECourseItems.GROUND,
      {
        shape: shapes.ground,
        label: ECourseItems.GROUND,
      } as TMatterBody
    );

    this.ground.setStatic(true);

    this.scene.matter.alignBody(
      this.ground,
      this.scene.sys.game.canvas.width,
      this.scene.sys.game.canvas.height,
      Phaser.Display.Align.BOTTOM_CENTER
    );
  }

  public getGround(): Phaser.Physics.Matter.Image {
    return this.ground;
  }
}

在查看为 ground 游戏 object 生成的 JSON 之后(由 PhysicsEditor 应用程序生成)- 它似乎正在生成多层物理体(不知道为什么,可能是应用程序的错误)。但是在手动删除额外的层之后,奇怪的 'jumping' 行为不再发生。