2017-06-09 04:00:12 +00:00
|
|
|
var Class = require('../../../utils/Class');
|
|
|
|
var GameObject = require('../../GameObject');
|
2017-07-04 00:59:31 +00:00
|
|
|
var Components = require('../../components');
|
2017-06-09 04:00:12 +00:00
|
|
|
var TilemapRender = require('./TilemapRender');
|
|
|
|
var Tile = require('./Tile');
|
|
|
|
|
|
|
|
var Tilemap = new Class({
|
|
|
|
|
|
|
|
Extends: GameObject,
|
|
|
|
|
|
|
|
Mixins: [
|
|
|
|
Components.Alpha,
|
|
|
|
Components.BlendMode,
|
|
|
|
Components.Flip,
|
|
|
|
Components.GetBounds,
|
|
|
|
Components.Origin,
|
|
|
|
Components.RenderTarget,
|
|
|
|
Components.ScaleMode,
|
|
|
|
Components.Size,
|
|
|
|
Components.Texture,
|
|
|
|
Components.Transform,
|
|
|
|
Components.Visible,
|
2017-06-22 02:19:03 +00:00
|
|
|
Components.ScrollFactor,
|
2017-06-09 04:00:12 +00:00
|
|
|
TilemapRender
|
|
|
|
],
|
|
|
|
|
|
|
|
initialize:
|
|
|
|
|
2017-07-14 13:30:20 +00:00
|
|
|
function Tilemap (scene, mapData, x, y, tileWidth, tileHeight, mapWidth, mapHeight, tileBorder, texture, frame)
|
2017-06-09 04:00:12 +00:00
|
|
|
{
|
2017-07-14 13:30:20 +00:00
|
|
|
GameObject.call(this, scene, 'Tilemap');
|
2017-06-09 04:00:12 +00:00
|
|
|
|
2017-08-01 12:10:08 +00:00
|
|
|
this.mapData = (mapData !== null) ? new Uint32Array(mapData) : new Uint32Array(mapWidth * mapHeight);
|
2017-06-09 04:00:12 +00:00
|
|
|
this.tileWidth = tileWidth;
|
|
|
|
this.tileHeight = tileHeight;
|
|
|
|
this.mapWidth = mapWidth;
|
|
|
|
this.mapHeight = mapHeight;
|
|
|
|
this.tileArray = [];
|
|
|
|
this.culledTiles = [];
|
2017-06-27 21:22:39 +00:00
|
|
|
this.tileBorder = tileBorder;
|
2017-06-09 04:00:12 +00:00
|
|
|
this.setTexture(texture, frame);
|
|
|
|
this.setPosition(x, y);
|
|
|
|
this.setSizeToFrame();
|
|
|
|
this.setOrigin();
|
|
|
|
this.setSize(tileWidth * mapWidth, tileHeight * mapHeight);
|
2017-08-25 02:46:33 +00:00
|
|
|
this.buildTilemap(!!scene.sys.game.renderer.gl);
|
2017-06-09 04:00:12 +00:00
|
|
|
},
|
|
|
|
|
2017-06-26 12:16:27 +00:00
|
|
|
getTotalTileCount: function ()
|
2017-06-22 02:19:03 +00:00
|
|
|
{
|
|
|
|
return this.tileArray.length;
|
|
|
|
},
|
|
|
|
|
|
|
|
getVisibleTileCount: function (camera)
|
|
|
|
{
|
|
|
|
return this.cull(camera).length;
|
|
|
|
},
|
|
|
|
|
2017-08-25 02:46:33 +00:00
|
|
|
buildTilemap: function (center)
|
2017-06-09 04:00:12 +00:00
|
|
|
{
|
|
|
|
var tileArray = this.tileArray;
|
|
|
|
var mapData = this.mapData;
|
2017-06-27 21:22:39 +00:00
|
|
|
var border = this.tileBorder;
|
2017-06-09 04:00:12 +00:00
|
|
|
var tileWidth = this.tileWidth;
|
|
|
|
var tileHeight = this.tileHeight;
|
2017-06-27 21:22:39 +00:00
|
|
|
var tileWidthBorder = tileWidth + border * 2;
|
|
|
|
var tileHeightBorder = tileHeight + border * 2;
|
2017-06-09 04:00:12 +00:00
|
|
|
var width = this.texture.source[0].width;
|
|
|
|
var height = this.texture.source[0].height;
|
|
|
|
var mapWidth = this.mapWidth;
|
|
|
|
var mapHeight = this.mapHeight;
|
|
|
|
var setWidth = width / tileWidth;
|
2017-08-25 02:46:33 +00:00
|
|
|
var tileWidthBorderHalf = tileWidthBorder * 0.5;
|
|
|
|
var tileHeightBorderHalf = tileHeightBorder * 0.5;
|
|
|
|
|
|
|
|
if (!center)
|
|
|
|
{
|
|
|
|
tileWidthBorderHalf = 0;
|
|
|
|
tileHeightBorderHalf = 0;
|
|
|
|
}
|
2017-06-09 04:00:12 +00:00
|
|
|
|
|
|
|
tileArray.length = 0;
|
|
|
|
|
|
|
|
for (var y = 0; y < mapHeight; ++y)
|
|
|
|
{
|
|
|
|
for (var x = 0; x < mapWidth; ++x)
|
|
|
|
{
|
|
|
|
var tileId = mapData[y * mapWidth + x];
|
2017-08-25 02:46:33 +00:00
|
|
|
var rectx = (((tileId % setWidth)|0) * tileWidthBorder) + tileWidthBorderHalf;
|
|
|
|
var recty = (((tileId / setWidth)|0) * tileHeightBorder) + tileHeightBorderHalf;
|
2017-06-09 04:00:12 +00:00
|
|
|
var tx = x * tileWidth;
|
|
|
|
var ty = y * tileHeight;
|
2017-06-27 21:22:39 +00:00
|
|
|
|
2017-06-09 04:00:12 +00:00
|
|
|
tileArray.push(new Tile({
|
2017-06-22 02:19:03 +00:00
|
|
|
index: x + y,
|
2017-06-09 04:00:12 +00:00
|
|
|
id: tileId,
|
|
|
|
x: tx,
|
|
|
|
y: ty,
|
|
|
|
width: tileWidth,
|
|
|
|
height: tileHeight,
|
2017-06-22 02:19:03 +00:00
|
|
|
frameX: rectx,
|
|
|
|
frameY: recty,
|
|
|
|
frameWidth: tileWidth,
|
|
|
|
frameHeight: tileHeight,
|
|
|
|
textureWidth: width,
|
2017-06-27 21:22:39 +00:00
|
|
|
textureHeight: height,
|
2017-08-25 02:46:33 +00:00
|
|
|
border: border,
|
|
|
|
center: center
|
2017-06-09 04:00:12 +00:00
|
|
|
}));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2017-06-22 02:19:03 +00:00
|
|
|
cull: function (camera)
|
|
|
|
{
|
|
|
|
var culledTiles = this.culledTiles;
|
|
|
|
var tiles = this.tileArray;
|
|
|
|
var length = tiles.length;
|
|
|
|
var scrollX = camera.scrollX * this.scrollFactorX;
|
|
|
|
var scrollY = camera.scrollY * this.scrollFactorY;
|
|
|
|
var cameraW = camera.width;
|
|
|
|
var cameraH = camera.height;
|
|
|
|
|
|
|
|
culledTiles.length = 0;
|
2017-06-26 12:16:27 +00:00
|
|
|
|
2017-06-22 02:19:03 +00:00
|
|
|
for (var index = 0; index < length; ++index)
|
|
|
|
{
|
|
|
|
var tile = tiles[index];
|
|
|
|
var tileX = tile.x - scrollX;
|
|
|
|
var tileY = tile.y - scrollY;
|
|
|
|
var tileW = tile.width;
|
|
|
|
var tileH = tile.height;
|
|
|
|
var cullW = cameraW + tileW;
|
|
|
|
var cullH = cameraH + tileH;
|
|
|
|
|
|
|
|
if (tile.visible &&
|
2017-07-07 01:17:27 +00:00
|
|
|
tileX > -tileW && tileY > -tileH &&
|
2017-06-22 02:19:03 +00:00
|
|
|
tileX < cullW && tileY < cullH)
|
|
|
|
{
|
|
|
|
culledTiles.push(tile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return culledTiles;
|
|
|
|
},
|
|
|
|
|
|
|
|
forEach: function (callback)
|
2017-06-09 04:00:12 +00:00
|
|
|
{
|
2017-06-22 02:19:03 +00:00
|
|
|
this.tileArray.forEach(callback);
|
|
|
|
},
|
|
|
|
|
2017-06-26 14:08:26 +00:00
|
|
|
// Returns Object containing:
|
|
|
|
// {
|
|
|
|
// alpha
|
|
|
|
// frameWidth,
|
|
|
|
// frameHeight,
|
|
|
|
// frameX
|
|
|
|
// frameY
|
|
|
|
// id
|
|
|
|
// index = the tile in the tilset to render
|
|
|
|
// textureWidth = tileset texture size
|
|
|
|
// textureHeight
|
|
|
|
// tint
|
|
|
|
// visible
|
|
|
|
// width
|
|
|
|
// x
|
|
|
|
// y
|
|
|
|
// }
|
|
|
|
|
2017-06-22 02:19:03 +00:00
|
|
|
getTileAt: function (x, y)
|
|
|
|
{
|
|
|
|
var ix = (x|0);
|
|
|
|
var iy = (y|0);
|
|
|
|
var tiles = this.tileArray;
|
|
|
|
var index = iy * this.mapWidth + ix;
|
2017-06-26 12:16:27 +00:00
|
|
|
|
2017-06-22 02:19:03 +00:00
|
|
|
if (index < tiles.length)
|
|
|
|
{
|
|
|
|
return tiles[index];
|
|
|
|
}
|
2017-06-26 12:16:27 +00:00
|
|
|
|
2017-06-22 02:19:03 +00:00
|
|
|
return null;
|
|
|
|
},
|
|
|
|
|
|
|
|
getTileAtIndex: function (index)
|
|
|
|
{
|
|
|
|
var tiles = this.tileArray;
|
2017-06-26 12:16:27 +00:00
|
|
|
|
2017-06-22 02:19:03 +00:00
|
|
|
if (index < tiles.length)
|
|
|
|
{
|
|
|
|
return tiles[index];
|
|
|
|
}
|
2017-06-26 12:16:27 +00:00
|
|
|
|
|
|
|
return null;
|
2017-06-09 04:00:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
module.exports = Tilemap;
|