通过matter.js在phaser 3中尝试检测2个特定物体是否发生了碰撞。

4

我正在尝试使用matter物理引擎向我的平台游戏添加敌人, 但是使用this.matter.world.on collisionactive函数只能在玩家跳跃一次后检查地板和敌人之间的碰撞。我目前正在使用标签来检查碰撞。 我已经尝试添加额外的条件,但只能让玩家无限跳跃。即-它正在检查发生碰撞的标签。

碰撞检测代码:

    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'
}

1
你能展示一下那个不起作用的敌方代码吗? - winner_joiner
1个回答

1
我不完全了解问题,但如果您在检查/查找所有当前碰撞时遇到问题,您可以使用传递给物理回调函数的事件对象参数文档链接)的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>


你如何知道 bodyAbodyB 的顺序?例如,你检查 bodyA==playerbodyB==floor,但并没有检查相反的情况。bodyAbodyB 是否总是按照它们添加到 Matter 中的顺序排列的? - Brian Morearty
1
@BrianMorearty 是的,你说得对,这是由于它们被添加的顺序。我可以找到文档,但当我找到它时,我会发布它。 - winner_joiner

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