Tilemap.putTile now correctly re-calculates the collision data based on the new collideIndexes array (fixes #371)

Tilemap.putTile can now insert a tile into a null/blank area of the map (before it could only replace existing tiles)
This commit is contained in:
photonstorm
2014-03-04 03:08:35 +00:00
parent b5df53b4f6
commit 5a6ae5f696
6 changed files with 186 additions and 99 deletions
+2
View File
@@ -212,6 +212,8 @@ Bug Fixes:
* Sound.onMarkerComplete event is now dispatched when a marker stops. See Sound.onLoop for a looping marker event (thanks registered99, fixes #500)
* Events.onInputUp would be dispatched twice if the Sprite had drag enabled, now only dispatched once (thanks Overbryd, fixes #502)
* You can now load in CSV Tilemaps again and they get created properly (fixes #391)
* Tilemap.putTile can now insert a tile into a null/blank area of the map (before it could only replace existing tiles)
* Tilemap.putTile now correctly re-calculates the collision data based on the new collideIndexes array (fixes #371)
TO DO:
-89
View File
@@ -1,89 +0,0 @@
var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render });
// var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create, update: update, render: render });
function preload() {
game.load.tilemap('map', 'assets/tilemaps/maps/collision_test.json', null, Phaser.Tilemap.TILED_JSON);
game.load.image('ground_1x1', 'assets/tilemaps/tiles/ground_1x1.png');
game.load.image('walls_1x2', 'assets/tilemaps/tiles/walls_1x2.png');
game.load.image('tiles2', 'assets/tilemaps/tiles/tiles2.png');
game.load.image('player', 'assets/sprites/phaser-dude.png');
game.load.image('box', 'assets/sprites/ufo.png');
game.load.image('ship', 'assets/sprites/thrust_ship2.png');
}
var ship;
var map;
var tileset;
var layer;
var p;
var b;
var cursors;
var box2;
var dump;
function create() {
game.renderer.roundPixels = true;
// game.stage.backgroundColor = '#787878';
map = game.add.tilemap('map');
map.addTilesetImage('ground_1x1');
map.addTilesetImage('walls_1x2');
map.addTilesetImage('tiles2');
layer = map.createLayer('Tile Layer 1');
layer.resizeWorld();
map.setCollisionBetween(1, 12);
layer.debug = true;
// dump = map.generateCollisionData(layer);
box2 = game.add.sprite(200, 200, 'box');
box2.physicsEnabled = true;
box2.body.fixedRotation = true;
game.camera.follow(box2);
cursors = game.input.keyboard.createCursorKeys();
}
function update() {
if (cursors.left.isDown)
{
box2.body.moveLeft(200);
}
else if (cursors.right.isDown)
{
box2.body.moveRight(200);
}
else
{
box2.body.setZeroVelocity();
}
if (cursors.up.isDown)
{
box2.body.moveUp(200);
}
else if (cursors.down.isDown)
{
box2.body.moveDown(200);
}
}
function render() {
}
+117
View File
@@ -0,0 +1,117 @@
var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create, update: update, render: render });
function preload() {
game.load.image('ground_1x1', 'assets/tilemaps/tiles/ground_1x1.png');
}
var map;
var layer;
var marker;
var currentTile = 0;
var cursors;
function create() {
game.stage.backgroundColor = '#787878';
// Creates a blank tilemap
map = game.add.tilemap();
// Creates a layer and sets-up the map dimensions.
// In this case the map is 30x30 tiles in size and the tiles are 32x32 pixels in size.
map.create('level1', 30, 30, 32, 32);
// Add a Tileset image to the map
map.addTilesetImage('ground_1x1');
// Create a layer. This is where the map is rendered to.
layer = map.createLayer('level1');
// Resize the world
layer.resizeWorld();
map.setCollisionBetween(0, 12);
layer.debug = true;
// Create our tile selector at the top of the screen
createTileSelector();
game.input.setMoveCallback(updateMarker, this);
cursors = game.input.keyboard.createCursorKeys();
}
function pickTile(sprite, pointer) {
currentTile = game.math.snapToFloor(pointer.x, 32) / 32;
}
function updateMarker() {
marker.x = layer.getTileX(game.input.activePointer.worldX) * 32;
marker.y = layer.getTileY(game.input.activePointer.worldY) * 32;
if (game.input.mousePointer.isDown)
{
map.putTile(currentTile, layer.getTileX(marker.x), layer.getTileY(marker.y))
}
}
function update() {
if (cursors.left.isDown)
{
game.camera.x -= 4;
}
else if (cursors.right.isDown)
{
game.camera.x += 4;
}
if (cursors.up.isDown)
{
game.camera.y -= 4;
}
else if (cursors.down.isDown)
{
game.camera.y += 4;
}
}
function render() {
}
function createTileSelector() {
// Our tile selection window
var tileSelector = game.add.group();
var tileSelectorBackground = game.make.graphics();
tileSelectorBackground.beginFill(0x000000, 0.5);
tileSelectorBackground.drawRect(0, 0, 800, 34);
tileSelectorBackground.endFill();
tileSelector.add(tileSelectorBackground);
var tileStrip = tileSelector.create(1, 1, 'ground_1x1');
tileStrip.inputEnabled = true;
tileStrip.events.onInputDown.add(pickTile, this);
tileSelector.fixedToCamera = true;
// Our painting marker
marker = game.add.graphics();
marker.lineStyle(2, 0x000000, 1);
marker.drawRect(0, 0, 32, 32);
}
+7
View File
@@ -179,10 +179,12 @@ Phaser.Tile.prototype = {
if (left || right || up || down)
{
this.collides = true;
this.collideNone = false;
}
else
{
this.collides = false;
this.collideNone = true;
}
@@ -199,6 +201,11 @@ Phaser.Tile.prototype = {
this.collideRight = false;
this.collideUp = false;
this.collideDown = false;
this.collides = false;
this.faceTop = false;
this.faceBottom = false;
this.faceLeft = false;
this.faceRight = false;
},
+54 -4
View File
@@ -106,6 +106,11 @@ Phaser.Tilemap = function (game, key, tileWidth, tileHeight, width, height) {
*/
this.objects = data.objects;
/**
* @property {array} collideIndexes - An array of tile indexes that collide.
*/
this.collideIndexes = [];
/**
* @property {array} collision - An array of collision data (polylines, etc).
*/
@@ -763,6 +768,20 @@ Phaser.Tilemap.prototype = {
if (typeof layer === 'undefined') { layer = this.currentLayer; }
if (typeof recalculate === 'undefined') { recalculate = true; }
if (collides)
{
this.collideIndexes.push(index);
}
else
{
var i = this.collideIndexes.indexOf(index);
if (i > -1)
{
this.collideIndexes.splice(i, 1);
}
}
for (var y = 0; y < this.layers[layer].height ; y++)
{
for (var x = 0; x < this.layers[layer].width; x++)
@@ -848,6 +867,14 @@ Phaser.Tilemap.prototype = {
left = this.getTileLeft(layer, x, y);
right = this.getTileRight(layer, x, y);
if (tile.collides)
{
tile.faceTop = true;
tile.faceBottom = true;
tile.faceLeft = true;
tile.faceRight = true;
}
if (above && above.collides)
{
// There is a tile above this one that also collides, so the top of this tile is no longer interesting
@@ -974,6 +1001,15 @@ Phaser.Tilemap.prototype = {
},
/**
* Checks if there is a tile at the given location.
*
* @method Phaser.Tilemap#hasTile
* @param {number} x - X position to check if a tile exists at (given in tile units, not pixels)
* @param {number} y - Y position to check if a tile exists at (given in tile units, not pixels)
* @param {number|string|Phaser.TilemapLayer} layer - The layer to set as current.
* @return {boolean} True if there is a tile at the given location, otherwise false.
*/
hasTile: function (x, y, layer) {
return (this.layers[layer].data[y] !== null && this.layers[layer].data[y][x] !== null);
@@ -995,30 +1031,44 @@ Phaser.Tilemap.prototype = {
if (x >= 0 && x < this.layers[layer].width && y >= 0 && y < this.layers[layer].height)
{
var index;
if (tile instanceof Phaser.Tile)
{
index = tile.index;
if (this.hasTile(x, y, layer))
{
this.layers[layer].data[y][x].copy(tile);
}
else
{
//Phaser.Tile = function (layer, index, x, y, width, height) {
this.layers[layer].data[y][x] = new Phaser.Tile(layer, tile.index, x, y, tile.width, tile.height);
this.layers[layer].data[y][x] = new Phaser.Tile(layer, index, x, y, tile.width, tile.height);
}
}
else
{
index = tile;
if (this.hasTile(x, y, layer))
{
this.layers[layer].data[y][x].index = tile;
this.layers[layer].data[y][x].index = index;
}
else
{
this.layers[layer].data[y][x] = new Phaser.Tile(layer, tile, x, y, this.tileWidth, this.tileHeight);
this.layers[layer].data[y][x] = new Phaser.Tile(layer, index, x, y, this.tileWidth, this.tileHeight);
}
}
if (this.collideIndexes.indexOf(index) > -1)
{
this.layers[layer].data[y][x].setCollision(true, true, true, true);
}
else
{
this.layers[layer].data[y][x].resetCollision();
}
this.layers[layer].dirty = true;
this.calculateFaces(layer);
+6 -6
View File
@@ -837,12 +837,12 @@ Phaser.TilemapLayer.prototype.renderDebug = function () {
}
// Collision callback
if (tile && (tile.collisionCallback || tile.layer.callbacks[tile.index]))
{
this.context.fillStyle = this.debugCallbackColor;
this.context.fillRect(this._tx, this._ty, this._cw, this._ch);
this.context.fillStyle = this.debugFillColor;
}
// if (tile && (tile.collisionCallback || tile.layer.callbacks[tile.index]))
// {
// this.context.fillStyle = this.debugCallbackColor;
// this.context.fillRect(this._tx, this._ty, this._cw, this._ch);
// this.context.fillStyle = this.debugFillColor;
// }
this._tx += this.map.tileWidth;