我正在使用 Matter.js 物理引擎使用 Phaser 3 创建 HTML5 游戏。游戏同时在屏幕上显示多个对象,包括:
- https://photonstorm.github.io/phaser3-docs/Phaser.Physics.Matter.Image.html子类的实例
- (动画游戏对象)子类的实例:https ://photonstorm.github.io/phaser3-docs/Phaser.Physics.Matter.Sprite.html
- 以下对象:https ://photonstorm.github.io/phaser3-docs/MatterJS.Body.html
如果重要,MatterJS.Body 对象是使用生成的fromVertices()
(此处的文档:https ://photonstorm.github.io/phaser3-docs/Phaser.Physics.Matter.Factory.html#fromVertices__anchor )
我希望生成一个Phaser.Physics.Matter.Image
具有随机起始位置的新对象,但是,该位置不能与屏幕上已经存在的任何游戏对象重叠。
我知道如何为对象的位置生成随机坐标。我的问题是,如何检查现有对象是否不包含此坐标?
我可以使用 获取所有现有游戏对象的列表this.matter.world.localWorld.bodies)
,所以我尝试的是:
- 生成随机
x
和y
坐标。 - 遍历
this.matter.world.localWorld.bodies
, 并为每个游戏对象(我们称之为gameObject
): - 调用
getBounds().contains(x, y)
以检查边界是否包含坐标。
当我只有图像和精灵时,这实际上有效,但是,我也有没有getBounds()
方法的 MatterJS.Body 对象。这是我的主要问题。编辑:它们确实有一个bounds
属性,但它只是标记为 min 和 max 的两个坐标,并且没有contains()
方法。AABB 边界检查不足以实现我的目标;我需要更精确的东西。
注意:我还考虑过简单地将对象放在屏幕上并监听碰撞事件。但是,看起来碰撞事件仅在碰撞由运动中的对象触发时触发,理想情况下,如果它位于某物之上,我根本不想渲染它。
最后说明:我愿意创建某种形状或游戏对象,而不是使用 x 和 y 坐标,如果这意味着更简单的方法来做我想做的事情。