试图检测是否有2个特定的物体在phaser 3中与matter.js碰撞



我试图使用物质物理引擎在我的平台游戏中添加敌人,但是使用this.matter.world.on collision - active功能只检查玩家跳跃一次后地板和敌人之间的碰撞。我目前使用标签来检查碰撞。我曾尝试添加额外的条件,但只能让玩家无限跳跃。也就是说,它正在检查碰撞的标签。

碰撞检查代码:

this.matter.world.on("collisionactive", (e,o1,o2) => {
if(o1.label == 'floor' && o2.label == 'player')
{
this.touchingGround = true;
console.log('touching')
}
});

敌人创建功能:现在敌人是当玩家按下f

时在光标处生成的立方体。
function createEnemy(scene,x,y)
{
enemy = scene.matter.add.image(x,y,'enemy').setScale(1.5)
enemy.body.label = 'enemy'
}

我不完全理解这个问题,但是如果你有检查/发现所有当前碰撞的问题,你可以使用事件-对象-参数pairs属性(链接到文档),它被传递给物理回调函数。此属性应包含其他碰撞。

"…event.pairs阵列可能包含更多的碰撞体. ...">

这里有一个简短的演示:

document.body.style = 'margin:0;';
var config = {
type: Phaser.AUTO,
width: 11 * 16, 
height: 6 * 16,
zoom: 2,
pixelArt: true,
scene: {
preload: preload,
create: create
},
physics: {
default: 'matter',
matter: {
gravity: {
y:.3
},
debug:true
}
},
banner: false
};
function preload (){
this.load.image('mario-tiles', 'https://labs.phaser.io/assets/tilemaps/tiles/super-mario.png');
}
function create (){
var level = [
'0'.repeat(11).split(''),
'0'.repeat(11).split(''),
'0'.repeat(11).split(''),
'0'.repeat(11).split(''),
'0'.repeat(11).split(''),
'0'.repeat(11).split('').map( _ => 14),
];        

var map = this.make.tilemap({ data: level, tileWidth: 16, tileHeight: 16 });
var tiles = map.addTilesetImage('mario-tiles');
var layer = map.createLayer(0, tiles, 0, 0);
this.add.text(4, 4, 'click to jump', {color:'#9EE6FF', fontSize:10})
.setOrigin(0);
var info = this.add.text(4, 14, 'waiting ...', {color:'#ffffff', fontSize:10})
.setOrigin(0);
let enemy1 = this.add.rectangle(60.25, 5, 8, 8, 0xfff000)
.setOrigin(0.5);
let player = this.add.rectangle(60, 20, 8, 8, 0xffffff);

layer.setCollision([14]);

this.matter.add.gameObject(enemy1);

this.matter.add.gameObject(player);
this.matter.world.convertTilemapLayer(layer, {label:'floor'});

player.body.label = 'player';
enemy1.body.label = 'enemy';

this.input.on('pointerup', _=> player.setVelocityY(-3))

player.setVelocityY(-1)
this.matter.world.on("collisionactive", (e, o1, o2) => {
let text = 'p: ';

if( e.pairs.some (pair => pair.bodyA.label == 'player' && pair.bodyB.label =='floor' )) {
text += 'touch floor ';
}

if( e.pairs.some (pair => pair.bodyA.label == 'enemy' && pair.bodyB.label =='player' )) {
text += 'touch enemy ';
}

if( e.pairs.some (pair => pair.bodyA.label == 'enemy' && pair.bodyB.label =='floor' )) {
text += 'ne: touch floor';
}
info.setText(text);            
});
}
new Phaser.Game(config);
<script src="//cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>

最新更新