diff --git a/community/tilemap/main.go b/community/tilemap/main.go index d68691f..a10d6d4 100644 --- a/community/tilemap/main.go +++ b/community/tilemap/main.go @@ -16,14 +16,20 @@ import ( var clearColor = colornames.Skyblue -var sprites []*pixel.Sprite - func gameloop(win *pixelgl.Window, tilemap *tmx.Map) { + batches := make([]*pixel.Batch, 0) + batchIndices := make(map[string]int) + batchCounter := 0 + // Load the sprites sprites := make(map[string]*pixel.Sprite) for _, tileset := range tilemap.Tilesets { if _, alreadyLoaded := sprites[tileset.Image.Source]; !alreadyLoaded { - sprites[tileset.Image.Source] = loadSprite(tileset.Image.Source) + sprite, pictureData := loadSprite(tileset.Image.Source) + sprites[tileset.Image.Source] = sprite + batches = append(batches, pixel.NewBatch(&pixel.TrianglesData{}, pictureData)) + batchIndices[tileset.Image.Source] = batchCounter + batchCounter++ } } @@ -59,6 +65,10 @@ func gameloop(win *pixelgl.Window, tilemap *tmx.Map) { win.Clear(clearColor) // Draw tiles + for _, batch := range batches { + batch.Clear() + } + for _, layer := range tilemap.Layers { for tileIndex, tile := range layer.DecodedTiles { ts := layer.Tileset @@ -82,10 +92,13 @@ func gameloop(win *pixelgl.Window, tilemap *tmx.Map) { sprite := sprites[ts.Image.Source] sprite.Set(sprite.Picture(), pixel.R(iX, iY, fX, fY)) pos := gamePos.ScaledXY(pixel.V(float64(ts.TileWidth), float64(ts.TileHeight))) - sprite.Draw(win, pixel.IM.Moved(pos)) + sprite.Draw(batches[batchIndices[ts.Image.Source]], pixel.IM.Moved(pos)) } } + for _, batch := range batches { + batch.Draw(win) + } win.Update() } } @@ -123,7 +136,7 @@ func run() { gameloop(win, tilemap) } -func loadSprite(path string) *pixel.Sprite { +func loadSprite(path string) (*pixel.Sprite, *pixel.PictureData) { f, err := os.Open(path) panicIfErr(err) @@ -131,7 +144,7 @@ func loadSprite(path string) *pixel.Sprite { panicIfErr(err) pd := pixel.PictureDataFromImage(img) - return pixel.NewSprite(pd, pd.Bounds()) + return pixel.NewSprite(pd, pd.Bounds()), pd } func main() {