PhaserJS碰撞tilemap无法正常工作

时间:2016-09-05 07:11:44

标签: json phaser-framework 2d-games

我有一个瓷砖地图,只有1层正确地与播放器发生碰撞。通过所有的例子,但我似乎无法让它在多层上工作。

我有1个tilemap,其中包含总共13个图层的所有json数据,但是对于示例我只包含了3个。

我希望玩家能够与不同的图层发生碰撞并进行不同的回调,例如如果在范围内等,但是所有人都使用1个spritemap / tilemap。

var game = new Phaser.Game(1200, 780, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render });

function preload() {
        this.load.tilemap('main_map', 'img here', null, Phaser.Tilemap.TILED_JSON);
        this.load.image('sprite_map', 'img here');
        this.load.image('player_image', 'img here');
}

var map;
var tileset;
var bLayer;
var wLayer;
var player;
var sLayer;
var cursors;

function create() {

    game.physics.startSystem(Phaser.Physics.ARCADE);

    // initiallize the tilemap
    map = game.add.tilemap('main_map');
    map.addTilesetImage('otherNew', 'sprite_map');

    //draw the layers 
    bLayer = map.createLayer(0);
    wLayer = map.createLayer(1);
    sLayer = map.createLayer(2);
    wLayer.resizeWorld();

    player = game.add.sprite(600, 600, 'player_image');
    game.physics.arcade.enable(player);
    player.body.collideWorldBounds = true;  // works

    //game camera and movment keys here 

}
function update() {
    game.physics.arcade.collide(player, wLayer); // DOES NOT WORK
    game.physics.arcade.collide(player, sLayer); // THIS WORKS
    map.setCollision(1, true, wLayer); // DOES NOT WORK
    map.setCollision(2, true, sLayer); // THIS WORKS 

   //movement here already works so didn't include

}

2 个答案:

答案 0 :(得分:0)

我认为您的wLayer.resizeWorld();功能会使您的瓷砖地图的宽度/高度与世界的大小相符。看起来这是wLayer和sLayer之间的唯一区别。

在Phaser中设置宽度/高度不会自动调整碰撞体的大小。为此,请使用setSize功能。

要查看您当前的身体,请使用Phaser的debug方法

this.game.debug.body(someSprite, 'rgba(255,0,0,0.5)');

答案 1 :(得分:0)

答案是每个图层都有自己的一组图块,当我使用spritesheet生成每个图层时,这些图层有一些需要设置的值。我没有耐心去检查我需要什么样的实际碰撞层,但是因为我将它们全部拆分为单独的逻辑层,所以我只需要在0到100之间设置它们。

// In the create section    
map.setCollisionBetween(0, 100,true, wLayer,true);
map.setCollisionBetween(0, 100,true, sLayer,true);