如何在Phaser JS中动态地基于碰撞删除Matter JS对象

3

我正在制作一个平台游戏,其中有玩家和一些强化道具。为了检测碰撞,我使用了matterjs的collisionactive函数:

this.matter.world.on("collisionactive", (e, o1, o2) => {
    
});

在函数内部,我需要从游戏中删除powerup。所以我尝试使用o1.destroy,其中o1是powerup对象。这并没有起作用,也没有返回错误。我还尝试了this.matter.world.remove(o1);,但这也不起作用。为什么我无法删除这些对象?非常感谢任何帮助。谢谢!
1个回答

3

如果你仅从世界中移除对象,会出现一些问题。最好/最清洁的解决方法是使用 GameObject 的 destroy() 方法。

我会使用 collisionstart 事件,在那里检查玩家是否正在与 powerup 交互,并销毁 gameObject。这也将清除物理对象。

以下是一个基于上一个答案的示例:

let playertouchingground = true
const config = {
  type: Phaser.AUTO,
  width: 400,
  height: 180,
  physics: {
    default: "matter",
    matter: {
      debug: true
    }
  },
  scene: {
    create,
    update
  },
};

var game = new Phaser.Game(config);

function create() {
  ground = this.matter.add.sprite(0, 180, 'platform').setStatic(true).setScale(100, 1).setOrigin(0)
  ground.body.label = 'platform'
  ground.setCollisionCategory(1)

  player = this.matter.add.sprite(125, 140, 'player')
  player.body.label = 'player'
  player.setCollisionGroup(2)
  player.setFixedRotation()
  
  powerup = this.matter.add.sprite(140, 10, 'powerup').setBody('circle')
  powerup.body.label = 'powerup'
    powerup.setCollisionGroup(2)
  
    this.matter.world.on("collisionstart", (e, o1, o2) => {
      
      if([o1.label, o2.label].indexOf('powerup') != -1 &&
      [o1.label, o2.label].indexOf('player') != -1){
        o2.gameObject.destroy();
       }
  });

  this.matter.world.on("collisionend", (e, o1, o2) => {
      playertouchingground = true;
    }
  )
  
  this.cursors = this.input.keyboard.createCursorKeys();
}

function update() {
  if (this.cursors.left.isDown ) {
    player.setVelocityX(-3)
  } else if (this.cursors.right.isDown ) {
    player.setVelocityX(3)
  } else {
    player.setVelocityX(0);
  }

  if (this.cursors.up.isDown && playertouchingground ) {
    player.setVelocityY(-8)
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/phaser/3.23.0/phaser.min.js" ></script>

顺便说一句: this.matter.world.remove(o1) 本应有效,但无法隐藏/移除图像,正如此帖子中所提到的。以上的代码解决了这个问题,并且确实有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接