phaser/v3/src/gameobjects/tilemap/Tileset.js

100 lines
3 KiB
JavaScript
Raw Normal View History

2017-11-10 21:56:14 +00:00
var Class = require('../../utils/Class');
var Tileset = new Class({
initialize:
function Tileset (name, firstgid, tileWidth, tileHeight, tileMargin, tileSpacing, properties)
{
if (tileWidth === undefined || tileWidth <= 0) { tileWidth = 32; }
if (tileHeight === undefined || tileHeight <= 0) { tileHeight = 32; }
if (tileMargin === undefined) { tileMargin = 0; }
if (tileSpacing === undefined) { tileSpacing = 0; }
this.name = name;
this.firstgid = firstgid;
this.tileWidth = tileWidth;
this.tileHeight = tileHeight;
this.tileMargin = tileMargin;
this.tileSpacing = tileSpacing;
this.properties = properties;
this.image = null;
this.rows = 0;
this.columns = 0;
this.total = 0;
this.texCoordinates = [];
},
setImage: function (texture)
{
this.image = texture;
this.updateTileData(this.image.source[0].width, this.image.source[0].height);
},
containsTileIndex: function (tileIndex)
{
return (
tileIndex >= this.firstgid &&
tileIndex < (this.firstgid + this.total)
);
},
getTileTextureCoordinates: function (tileIndex)
{
if (!this.containsTileIndex(tileIndex)) { return null; }
return this.texCoordinates[tileIndex - this.firstgid];
},
2017-11-16 21:25:45 +00:00
setSpacing: function (margin, spacing)
{
this.tileMargin = margin;
this.tileSpacing = spacing;
if (this.image)
{
this.updateTileData(this.image.source[0].width, this.image.source[0].height);
}
},
2017-11-10 21:56:14 +00:00
updateTileData: function (imageWidth, imageHeight)
{
var rowCount = (imageHeight - this.tileMargin * 2 + this.tileSpacing) / (this.tileHeight + this.tileSpacing);
var colCount = (imageWidth - this.tileMargin * 2 + this.tileSpacing) / (this.tileWidth + this.tileSpacing);
if (rowCount % 1 !== 0 || colCount % 1 !== 0)
{
console.warn('Tileset ' + this.name + ' image tile area is not an even multiple of tile size');
}
// In Tiled a tileset image that is not an even multiple of the tile dimensions
// is truncated - hence the floor when calculating the rows/columns.
rowCount = Math.floor(rowCount);
colCount = Math.floor(colCount);
this.rows = rowCount;
this.columns = colCount;
// In Tiled, "empty" spaces in a tileset count as tiles and hence count towards the gid
this.total = rowCount * colCount;
this.texCoordinates.length = 0;
var tx = this.tileMargin;
var ty = this.tileMargin;
for (var y = 0; y < this.rows; y++)
{
for (var x = 0; x < this.columns; x++)
{
this.texCoordinates.push({ x: tx, y: ty });
tx += this.tileWidth + this.tileSpacing;
}
tx = this.tileMargin;
ty += this.tileHeight + this.tileSpacing;
}
}
});
module.exports = Tileset;