Jump to content

Neighbor tile's collision disappears


kurhlaa
 Share

Recommended Posts

Hello!

I've noticed, that if I modify exact tile's collisions with tile.setCollision(false, false, true, false) - it also disables neighbor tiles collisions (left-right directions).

A screenshot is attached. Red arrow shows a modified tile, blue arrow shows a tile which's left-right collisions have disappeared.

 

Lab's modified example that you can copy-paste into https://labs.phaser.io/edit.html?src=src/game objects/tilemap/collision/tile callbacks.js :

var config = {
    type: Phaser.WEBGL,
    width: 800,
    height: 576,
    parent: 'phaser-example',
    physics: {
        default: 'arcade',
        arcade: { gravity: { y: 300 } }
    },
    scene: {
        preload: preload,
        create:  create,
        update:  update
    }
};

var game = new Phaser.Game(config);
var map;
var cursors;
var debugGraphics;
var text;
var player;
var groundLayer;


function preload ()
{
    this.load.image('ground_1x1', 'assets/tilemaps/tiles/ground_1x1.png');
    this.load.tilemapTiledJSON('map', 'assets/tilemaps/maps/tile-collision-test.json');
    this.load.image('player', 'assets/sprites/phaser-dude.png');
}

function create ()
{
    map = this.make.tilemap({ key: 'map' });
    var groundTiles = map.addTilesetImage('ground_1x1');

    map.createDynamicLayer('Background Layer', groundTiles, 0, 0);
    groundLayer = map.createDynamicLayer('Ground Layer', groundTiles, 0, 0);

    groundLayer.layer.data[8][8].index = 11;
    groundLayer.layer.data[8][9].index = 1;

    groundLayer.setCollisionBetween(1, 10);


    // This breaks the collisions with the neighbor tiles
    groundLayer.layer.data[8][8].setCollision(false, false, true, false);
    

    player = this.physics.add.sprite(80, 70, 'player').setBounce(0.1);

    // We want the player to physically collide with the ground
    this.physics.add.collider(player, groundLayer);

    this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
    this.cameras.main.startFollow(player);

    cursors = this.input.keyboard.createCursorKeys();

    text = this.add.text(16, 16, 'Arrow keys to move. Space to jump', {
        fontSize: '20px',
        fill: '#ffffff'
    });
    text.setScrollFactor(0);
    text.setText('Arrow keys to move. Space to jump');
}

function update (time, delta)
{
    // Horizontal movement
    player.body.setVelocityX(0);

    if (cursors.left.isDown)
    {
        player.body.setVelocityX(-200);
    }
    else if (cursors.right.isDown)
    {
        player.body.setVelocityX(200);
    }

    // Jumping
    if ((cursors.space.isDown || cursors.up.isDown) && player.body.onFloor())
    {
        player.body.setVelocityY(-300);
    }
}

Here important is line 48:

groundLayer.layer.data[8][8].setCollision(false, false, true, false);

If you comment it out - everything is OK - you can walk through red arrow's tile and blue tile's collisions works fine. If you run it as is - you can walk through red arrow's tile and through neighbor blue tiles too - this is wrong.

How this can be fixed?  
 

Thanks!

collisions.png

Link to comment
Share on other sites

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...