phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
386 lines (309 loc) • 12.1 kB
JavaScript
var CreateFromTiles = require('../../../src/tilemaps/components/CreateFromTiles');
describe('Phaser.Tilemaps.Components.CreateFromTiles', function ()
{
function makeTile (index, x, y)
{
return {
index: index,
x: x,
y: y,
width: 32,
height: 32,
rotation: 0,
flipX: false,
flipY: false,
alpha: 1,
visible: true,
tint: 0xffffff
};
}
function makeLayer (tileGrid)
{
// tileGrid is a 2D array [y][x] of tile objects (or null)
var height = tileGrid.length;
var width = height > 0 ? tileGrid[0].length : 0;
var scene = {
cameras: {
main: {}
},
make: {
sprite: vi.fn(function (config)
{
return { type: 'Sprite', config: config };
})
}
};
var layer = {
width: width,
height: height,
data: tileGrid,
tilemapLayer: {
scene: scene,
tileToWorldXY: vi.fn(function (tx, ty)
{
return { x: tx * 32, y: ty * 32 };
})
}
};
return { layer: layer, scene: scene };
}
function makeGrid (width, height, defaultIndex)
{
var grid = [];
for (var y = 0; y < height; y++)
{
grid[y] = [];
for (var x = 0; x < width; x++)
{
grid[y][x] = makeTile(defaultIndex !== undefined ? defaultIndex : -1, x, y);
}
}
return grid;
}
beforeEach(function ()
{
vi.clearAllMocks();
});
it('should return an empty array when no tiles match the given index', function ()
{
var grid = makeGrid(3, 3, 5);
var setup = makeLayer(grid);
var result = CreateFromTiles(1, null, {}, setup.scene, {}, setup.layer);
expect(result).toBeInstanceOf(Array);
expect(result.length).toBe(0);
});
it('should return an empty array when the layer has no tiles', function ()
{
var setup = makeLayer([[]]);
var result = CreateFromTiles(1, null, {}, setup.scene, {}, setup.layer);
expect(result).toBeInstanceOf(Array);
expect(result.length).toBe(0);
});
it('should create a sprite for each tile matching the given index', function ()
{
var grid = makeGrid(3, 1, -1);
grid[0][0] = makeTile(1, 0, 0);
grid[0][2] = makeTile(1, 2, 0);
var setup = makeLayer(grid);
var result = CreateFromTiles(1, null, {}, setup.scene, {}, setup.layer);
expect(result.length).toBe(2);
expect(setup.scene.make.sprite).toHaveBeenCalledTimes(2);
});
it('should create sprites for all tiles when an array of indexes is provided', function ()
{
var grid = makeGrid(4, 1, -1);
grid[0][0] = makeTile(1, 0, 0);
grid[0][1] = makeTile(2, 1, 0);
grid[0][2] = makeTile(3, 2, 0);
grid[0][3] = makeTile(4, 3, 0);
var setup = makeLayer(grid);
var result = CreateFromTiles([ 1, 3 ], null, {}, setup.scene, {}, setup.layer);
expect(result.length).toBe(2);
});
it('should set sprite x/y from tileToWorldXY offset by half the tile size', function ()
{
var grid = makeGrid(1, 1, -1);
grid[0][0] = makeTile(1, 0, 0);
var setup = makeLayer(grid);
setup.layer.tilemapLayer.tileToWorldXY = vi.fn(function ()
{
return { x: 64, y: 96 };
});
var result = CreateFromTiles(1, null, {}, setup.scene, {}, setup.layer);
var cfg = result[0].config;
// x = 64 + (32 * 0.5) = 80, y = 96 + (32 * 0.5) = 112
expect(cfg.x).toBe(80);
expect(cfg.y).toBe(112);
});
it('should not add half-tile offset when origin is specified in spriteConfig', function ()
{
var grid = makeGrid(1, 1, -1);
grid[0][0] = makeTile(1, 0, 0);
var setup = makeLayer(grid);
setup.layer.tilemapLayer.tileToWorldXY = vi.fn(function ()
{
return { x: 64, y: 96 };
});
var result = CreateFromTiles(1, null, { origin: 0 }, setup.scene, {}, setup.layer);
var cfg = result[0].config;
expect(cfg.x).toBe(64);
expect(cfg.y).toBe(96);
});
it('should copy tile rotation into sprite config when not already set', function ()
{
var grid = makeGrid(1, 1, -1);
var tile = makeTile(1, 0, 0);
tile.rotation = 1.57;
grid[0][0] = tile;
var setup = makeLayer(grid);
var result = CreateFromTiles(1, null, {}, setup.scene, {}, setup.layer);
expect(result[0].config.rotation).toBeCloseTo(1.57);
});
it('should copy tile flipX, flipY, alpha, visible and tint into sprite config', function ()
{
var grid = makeGrid(1, 1, -1);
var tile = makeTile(1, 0, 0);
tile.flipX = true;
tile.flipY = true;
tile.alpha = 0.5;
tile.visible = false;
tile.tint = 0xff0000;
grid[0][0] = tile;
var setup = makeLayer(grid);
var result = CreateFromTiles(1, null, {}, setup.scene, {}, setup.layer);
var cfg = result[0].config;
expect(cfg.flipX).toBe(true);
expect(cfg.flipY).toBe(true);
expect(cfg.alpha).toBe(0.5);
expect(cfg.visible).toBe(false);
expect(cfg.tint).toBe(0xff0000);
});
it('should not overwrite spriteConfig properties already set with tile properties', function ()
{
var grid = makeGrid(1, 1, -1);
var tile = makeTile(1, 0, 0);
tile.alpha = 0.25;
grid[0][0] = tile;
var setup = makeLayer(grid);
var result = CreateFromTiles(1, null, { alpha: 0.9 }, setup.scene, {}, setup.layer);
expect(result[0].config.alpha).toBe(0.9);
});
it('should set key and frame from tileset when useSpriteSheet is in spriteConfig', function ()
{
var grid = makeGrid(1, 1, -1);
var tile = makeTile(5, 0, 0);
tile.tileset = { image: 'tiles_texture', firstgid: 1 };
grid[0][0] = tile;
var setup = makeLayer(grid);
var result = CreateFromTiles(5, null, { useSpriteSheet: true }, setup.scene, {}, setup.layer);
var cfg = result[0].config;
expect(cfg.key).toBe('tiles_texture');
expect(cfg.frame).toBe(4); // index(5) - firstgid(1) = 4
});
it('should not mutate the original spriteConfig object across multiple sprites', function ()
{
var grid = makeGrid(2, 1, -1);
var tile1 = makeTile(1, 0, 0);
tile1.rotation = 0.5;
var tile2 = makeTile(1, 1, 0);
tile2.rotation = 1.0;
grid[0][0] = tile1;
grid[0][1] = tile2;
var originalConfig = { someKey: 'someValue' };
var setup = makeLayer(grid);
CreateFromTiles(1, null, originalConfig, setup.scene, {}, setup.layer);
expect(originalConfig).toEqual({ someKey: 'someValue' });
});
it('should convert a single index number to an array and match tiles', function ()
{
var grid = makeGrid(3, 1, -1);
grid[0][0] = makeTile(42, 0, 0);
grid[0][1] = makeTile(42, 1, 0);
grid[0][2] = makeTile(99, 2, 0);
var setup = makeLayer(grid);
var result = CreateFromTiles(42, null, {}, setup.scene, {}, setup.layer);
expect(result.length).toBe(2);
});
it('should replace tile indexes with a single replacement value', function ()
{
var grid = makeGrid(3, 1, -1);
grid[0][0] = makeTile(1, 0, 0);
grid[0][1] = makeTile(2, 1, 0);
grid[0][2] = makeTile(1, 2, 0);
var setup = makeLayer(grid);
CreateFromTiles(1, 0, {}, setup.scene, {}, setup.layer);
expect(setup.layer.data[0][0].index).toBe(0);
expect(setup.layer.data[0][2].index).toBe(0);
expect(setup.layer.data[0][1].index).toBe(2); // unchanged
});
it('should replace each index with its matching replacement when arrays are provided', function ()
{
var grid = makeGrid(3, 1, -1);
grid[0][0] = makeTile(1, 0, 0);
grid[0][1] = makeTile(2, 1, 0);
grid[0][2] = makeTile(3, 2, 0);
var setup = makeLayer(grid);
CreateFromTiles([ 1, 2, 3 ], [ 10, 20, 30 ], {}, setup.scene, {}, setup.layer);
expect(setup.layer.data[0][0].index).toBe(10);
expect(setup.layer.data[0][1].index).toBe(20);
expect(setup.layer.data[0][2].index).toBe(30);
});
it('should not replace any tile indexes when replacements is null', function ()
{
var grid = makeGrid(2, 1, -1);
grid[0][0] = makeTile(1, 0, 0);
grid[0][1] = makeTile(1, 1, 0);
var setup = makeLayer(grid);
CreateFromTiles(1, null, {}, setup.scene, {}, setup.layer);
expect(setup.layer.data[0][0].index).toBe(1);
expect(setup.layer.data[0][1].index).toBe(1);
});
it('should default to an empty object when spriteConfig is falsy', function ()
{
var grid = makeGrid(1, 1, 1);
var setup = makeLayer(grid);
expect(function ()
{
CreateFromTiles(1, null, null, setup.scene, {}, setup.layer);
}).not.toThrow();
});
it('should use scene from layer.tilemapLayer when no scene is provided', function ()
{
var grid = makeGrid(1, 1, 1);
var setup = makeLayer(grid);
var layerScene = setup.layer.tilemapLayer.scene;
var result = CreateFromTiles(1, null, {}, null, layerScene.cameras.main, setup.layer);
expect(layerScene.make.sprite).toHaveBeenCalled();
expect(result.length).toBe(1);
});
it('should use camera from scene.cameras.main when no camera is provided', function ()
{
var grid = makeGrid(1, 1, 1);
var setup = makeLayer(grid);
expect(function ()
{
CreateFromTiles(1, null, {}, setup.scene, null, setup.layer);
}).not.toThrow();
expect(setup.layer.tilemapLayer.tileToWorldXY).toHaveBeenCalledWith(
0, 0, undefined, setup.scene.cameras.main, setup.layer
);
});
it('should pass the camera to tileToWorldXY for each matching tile', function ()
{
var grid = makeGrid(1, 1, 7);
var setup = makeLayer(grid);
var camera = { id: 'custom-camera' };
CreateFromTiles(7, null, {}, setup.scene, camera, setup.layer);
expect(setup.layer.tilemapLayer.tileToWorldXY).toHaveBeenCalledWith(0, 0, undefined, camera, setup.layer);
});
it('should return sprites corresponding to each matched tile across rows', function ()
{
var grid = makeGrid(3, 3, -1);
grid[0][1] = makeTile(5, 1, 0);
grid[1][0] = makeTile(5, 0, 1);
grid[2][2] = makeTile(5, 2, 2);
var setup = makeLayer(grid);
var result = CreateFromTiles(5, null, {}, setup.scene, {}, setup.layer);
expect(result.length).toBe(3);
});
it('should skip null tiles in the layer data', function ()
{
var grid = makeGrid(3, 1, -1);
grid[0][0] = makeTile(1, 0, 0);
grid[0][1] = null;
grid[0][2] = makeTile(1, 2, 0);
var setup = makeLayer(grid);
var result = CreateFromTiles(1, null, {}, setup.scene, {}, setup.layer);
expect(result.length).toBe(2);
});
it('should apply a single replacement to each index in the indexes array', function ()
{
var grid = makeGrid(2, 1, -1);
grid[0][0] = makeTile(1, 0, 0);
grid[0][1] = makeTile(2, 1, 0);
var setup = makeLayer(grid);
CreateFromTiles([ 1, 2 ], 0, {}, setup.scene, {}, setup.layer);
expect(setup.layer.data[0][0].index).toBe(0);
expect(setup.layer.data[0][1].index).toBe(0);
});
});