From b53cad31478efd38b4db9e4d01d91d7dce38fb67 Mon Sep 17 00:00:00 2001 From: Zachary King Date: Mon, 4 Feb 2019 18:27:49 -0600 Subject: [PATCH 1/3] refactored to use batch rendering --- community/tilemap/main.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/community/tilemap/main.go b/community/tilemap/main.go index d68691f..b87b1dc 100644 --- a/community/tilemap/main.go +++ b/community/tilemap/main.go @@ -16,14 +16,16 @@ import ( var clearColor = colornames.Skyblue -var sprites []*pixel.Sprite - func gameloop(win *pixelgl.Window, tilemap *tmx.Map) { + batches := make(map[string]*pixel.Batch) + // 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[tileset.Image.Source] = pixel.NewBatch(&pixel.TrianglesData{}, pictureData) } } @@ -82,10 +84,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[ts.Image.Source], pixel.IM.Moved(pos)) } } + for _, batch := range batches { + batch.Draw(win) + } win.Update() } } @@ -123,7 +128,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 +136,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() { From 00780ad11359a05f40ad5c3cda89c31206349866 Mon Sep 17 00:00:00 2001 From: Zachary King Date: Mon, 4 Feb 2019 20:18:08 -0600 Subject: [PATCH 2/3] clear batches at beginning of draw --- community/tilemap/main.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/community/tilemap/main.go b/community/tilemap/main.go index b87b1dc..0e1ce47 100644 --- a/community/tilemap/main.go +++ b/community/tilemap/main.go @@ -61,6 +61,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 From a65de950f9a0ad1f1f5e01982e320bd044fdb7a4 Mon Sep 17 00:00:00 2001 From: Zachary King Date: Tue, 5 Feb 2019 19:06:47 -0600 Subject: [PATCH 3/3] retain render order by using slice instead of map --- community/tilemap/main.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/community/tilemap/main.go b/community/tilemap/main.go index 0e1ce47..a10d6d4 100644 --- a/community/tilemap/main.go +++ b/community/tilemap/main.go @@ -17,7 +17,9 @@ import ( var clearColor = colornames.Skyblue func gameloop(win *pixelgl.Window, tilemap *tmx.Map) { - batches := make(map[string]*pixel.Batch) + batches := make([]*pixel.Batch, 0) + batchIndices := make(map[string]int) + batchCounter := 0 // Load the sprites sprites := make(map[string]*pixel.Sprite) @@ -25,7 +27,9 @@ func gameloop(win *pixelgl.Window, tilemap *tmx.Map) { if _, alreadyLoaded := sprites[tileset.Image.Source]; !alreadyLoaded { sprite, pictureData := loadSprite(tileset.Image.Source) sprites[tileset.Image.Source] = sprite - batches[tileset.Image.Source] = pixel.NewBatch(&pixel.TrianglesData{}, pictureData) + batches = append(batches, pixel.NewBatch(&pixel.TrianglesData{}, pictureData)) + batchIndices[tileset.Image.Source] = batchCounter + batchCounter++ } } @@ -88,7 +92,7 @@ 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(batches[ts.Image.Source], pixel.IM.Moved(pos)) + sprite.Draw(batches[batchIndices[ts.Image.Source]], pixel.IM.Moved(pos)) } }