phaser/v3/src/gameobjects/tilemap/dynamic/Tilemap.js

200 lines
5.4 KiB
JavaScript
Raw Normal View History

2017-06-09 04:00:12 +00:00
var Class = require('../../../utils/Class');
var GameObject = require('../../GameObject');
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:
function Tilemap (scene, mapData, x, y, tileWidth, tileHeight, mapWidth, mapHeight, tileBorder, texture, frame)
2017-06-09 04:00:12 +00:00
{
GameObject.call(this, scene, 'Tilemap');
2017-06-09 04:00:12 +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 = [];
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
},
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;
var border = this.tileBorder;
2017-06-09 04:00:12 +00:00
var tileWidth = this.tileWidth;
var tileHeight = this.tileHeight;
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-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,
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-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-22 02:19:03 +00:00
if (index < tiles.length)
{
return tiles[index];
}
2017-06-22 02:19:03 +00:00
return null;
},
getTileAtIndex: function (index)
{
var tiles = this.tileArray;
2017-06-22 02:19:03 +00:00
if (index < tiles.length)
{
return tiles[index];
}
return null;
2017-06-09 04:00:12 +00:00
}
});
module.exports = Tilemap;