/
tilemap.go
73 lines (63 loc) · 1.82 KB
/
tilemap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package tilemap
import (
"github.com/coltentrainor/ebitextras/core"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
"github.com/lafriks/go-tiled"
"image"
"io/fs"
"log"
)
type Level struct {
LevelData *tiled.Map
Tiles map[int]*ebiten.Image
}
func LoadTileImages(fs fs.FS, levelData *tiled.Map) map[int]*ebiten.Image {
tiles := make(map[int]*ebiten.Image)
for _, tileset := range levelData.Tilesets {
tileImage, _, err := ebitenutil.NewImageFromFileSystem(fs, "assets/tilemap/"+tileset.Image.Source)
if err != nil {
log.Fatal("Failed to load tile image: ", err)
}
for i := 0; i < tileset.TileCount; i++ {
id := tileset.FirstGID + uint32(i)
tilesheetPos := core.Vector2i{
X: i % tileset.Columns,
Y: i / tileset.Columns,
}
subImgRect := image.Rect(
tilesheetPos.X*tileset.TileWidth,
tilesheetPos.Y*tileset.TileHeight,
(tilesheetPos.X+1)*tileset.TileWidth,
(tilesheetPos.Y+1)*tileset.TileHeight)
tiles[int(id)] = tileImage.SubImage(subImgRect).(*ebiten.Image)
}
}
return tiles
}
func (level *Level) DrawLevel(screen *ebiten.Image, drawOps ebiten.DrawImageOptions) {
levelSize := core.Vector2i{X: level.LevelData.Width, Y: level.LevelData.Height}
for _, layer := range level.LevelData.Layers {
for y := 0; y < levelSize.Y; y++ {
for x := 0; x < levelSize.X; x++ {
ops := drawOps
pos := core.Vector2i{
X: level.LevelData.TileWidth * x,
Y: level.LevelData.TileHeight * y,
}
ops.GeoM.Translate(float64(pos.X), float64(pos.Y))
layerTile := layer.Tiles[y*levelSize.X+x]
idOffset := uint32(0)
if layerTile.Tileset != nil {
idOffset = layerTile.Tileset.FirstGID
}
id := int(layerTile.ID + idOffset)
if id == 0 {
continue
}
tile := level.Tiles[id]
screen.DrawImage(tile, &ops)
}
}
}
}