@canvasengine/presets 2.0.0-beta.2 → 2.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +54 -0
- package/dist/index.js +771 -0
- package/dist/index.js.map +1 -0
- package/package.json +9 -2
- package/src/DrawMap/index.ts +60 -0
- package/src/Tilemap/Tile.ts +79 -0
- package/src/Tilemap/TileGroup.ts +207 -0
- package/src/Tilemap/TileLayer.ts +162 -0
- package/src/Tilemap/TileSet.ts +41 -0
- package/src/Tilemap/index.ts +75 -0
- package/src/index.ts +3 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { TiledLayer, TiledLayerType, TiledMap, TiledParserFile, TiledTileset } from "@rpgjs/tiled"
|
|
2
|
+
import { loop, h, Container, TilingSprite, useProps, effect, signal } from "canvasengine"
|
|
3
|
+
import { CompositeTileLayer } from "./TileLayer"
|
|
4
|
+
import { TileSet } from "./TileSet"
|
|
5
|
+
|
|
6
|
+
export function TiledMap(props) {
|
|
7
|
+
const { map } = useProps(props)
|
|
8
|
+
const layers = signal<TiledLayer[]>([])
|
|
9
|
+
const objectLayer = props.objectLayer
|
|
10
|
+
let tilesets: TiledTileset[] = []
|
|
11
|
+
let mapData: TiledMap = {} as TiledMap
|
|
12
|
+
|
|
13
|
+
const parseTmx = async (file: string, relativePath: string = '') => {
|
|
14
|
+
if (typeof file !== 'string') {
|
|
15
|
+
return file
|
|
16
|
+
}
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
const parser = new TiledParserFile(
|
|
19
|
+
file,
|
|
20
|
+
{
|
|
21
|
+
basePath: '',
|
|
22
|
+
staticDir: '',
|
|
23
|
+
relativePath
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
const data = await parser.parseFilePromise({
|
|
27
|
+
getOnlyBasename: false
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
return data
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
effect(async () => {
|
|
34
|
+
mapData = await parseTmx(map())
|
|
35
|
+
for (let tileSet of mapData.tilesets) {
|
|
36
|
+
tilesets.push(await new TileSet(tileSet).load(tileSet.image.source))
|
|
37
|
+
}
|
|
38
|
+
layers.set(mapData.layers)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
const createLayer = (layers, props = {}) => {
|
|
42
|
+
return h(Container, props, loop(layers, (layer) => {
|
|
43
|
+
switch (layer.type) {
|
|
44
|
+
case TiledLayerType.Tile:
|
|
45
|
+
return h(CompositeTileLayer, {
|
|
46
|
+
tilewidth: mapData.tilewidth,
|
|
47
|
+
tileheight: mapData.tileheight,
|
|
48
|
+
// @ts-ignore
|
|
49
|
+
width: mapData.width,
|
|
50
|
+
// @ts-ignore
|
|
51
|
+
height: mapData.height,
|
|
52
|
+
...layer,
|
|
53
|
+
tilesets
|
|
54
|
+
})
|
|
55
|
+
case TiledLayerType.Image:
|
|
56
|
+
const { width, height, source } = layer.image
|
|
57
|
+
return h(TilingSprite, {
|
|
58
|
+
image: source,
|
|
59
|
+
...layer,
|
|
60
|
+
width: layer.repeatx ? layer.width * layer.tilewidth : width,
|
|
61
|
+
height: layer.repeaty ? layer.height * layer.tileheight : height
|
|
62
|
+
})
|
|
63
|
+
case TiledLayerType.Group:
|
|
64
|
+
return createLayer(signal(layer.layers), layer)
|
|
65
|
+
case TiledLayerType.ObjectGroup:
|
|
66
|
+
const child = objectLayer?.(layer)
|
|
67
|
+
return h(Container, layer, child)
|
|
68
|
+
default:
|
|
69
|
+
return h(Container)
|
|
70
|
+
}
|
|
71
|
+
}))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return createLayer(layers)
|
|
75
|
+
}
|