2024-06-11 15:06:43 -05:00
|
|
|
import {useEffect, useState} from 'react';
|
2024-06-12 14:31:12 -05:00
|
|
|
import {Assets} from '@pixi/assets';
|
2024-06-11 15:06:43 -05:00
|
|
|
import {PixiComponent} from '@pixi/react';
|
|
|
|
import '@pixi/spritesheet'; // NECESSARY!
|
|
|
|
import {CompositeTilemap} from '@pixi/tilemap';
|
|
|
|
|
|
|
|
const TileLayerInternal = PixiComponent('TileLayer', {
|
|
|
|
create: () => new CompositeTilemap(),
|
|
|
|
applyProps: (tilemap, {tiles: oldTiles}, props) => {
|
2024-06-12 14:31:12 -05:00
|
|
|
const {asset, tiles, tileset, tileSize, size, x, y} = props;
|
|
|
|
const extless = tileset.slice('/assets/'.length, -'.json'.length);
|
2024-06-11 15:06:43 -05:00
|
|
|
const {textures} = asset;
|
|
|
|
tilemap.position.x = x;
|
|
|
|
tilemap.position.y = y;
|
|
|
|
if (tiles === oldTiles) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
tilemap.clear();
|
|
|
|
let i = 0;
|
|
|
|
for (let y = 0; y < size.y; ++y) {
|
|
|
|
for (let x = 0; x < size.x; ++x) {
|
2024-06-12 14:31:12 -05:00
|
|
|
tilemap.tile(textures[`${extless}/${tiles[i++]}`], tileSize.x * x, tileSize.y * y);
|
2024-06-11 15:06:43 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
export default function TileLayer(props) {
|
|
|
|
const {tileset} = props;
|
|
|
|
const [asset, setAsset] = useState();
|
|
|
|
useEffect(() => {
|
|
|
|
const asset = Assets.get(tileset);
|
|
|
|
if (asset) {
|
|
|
|
setAsset(asset);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Assets.load(tileset).then(setAsset);
|
|
|
|
}
|
|
|
|
}, [setAsset, tileset]);
|
|
|
|
if (!asset) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<TileLayerInternal
|
|
|
|
{...props}
|
|
|
|
asset={asset}
|
2024-06-12 14:31:12 -05:00
|
|
|
tileset={tileset}
|
2024-06-11 15:06:43 -05:00
|
|
|
/>
|
|
|
|
);
|
2024-06-12 14:31:12 -05:00
|
|
|
};
|