From b04ac93aaa788e750b79ae35526aab16434a9727 Mon Sep 17 00:00:00 2001 From: Sergio Vera Castellano <severa@magento.com> Date: Sun, 31 Dec 2017 17:56:58 +0100 Subject: [PATCH] First commit --- examples/community/isometric-basics/README.md | 11 ++ .../community/isometric-basics/castle.png | Bin 0 -> 26296 bytes examples/community/isometric-basics/main.go | 102 ++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 examples/community/isometric-basics/README.md create mode 100644 examples/community/isometric-basics/castle.png create mode 100644 examples/community/isometric-basics/main.go diff --git a/examples/community/isometric-basics/README.md b/examples/community/isometric-basics/README.md new file mode 100644 index 0000000..77625bd --- /dev/null +++ b/examples/community/isometric-basics/README.md @@ -0,0 +1,11 @@ +# Isometric view basics + +Created by [Sergio Vera](https://github.com/svera). + +Isometric view is a display method used to create an illusion of 3D for an otherwise 2D game - sometimes referred to as pseudo 3D or 2.5D. + +Implementing an isometric view can be done in many ways, but for the sake of simplicity I'll focus on a tile-based approach, which is the most efficient and widely used method. + +In the tile-based approach, each visual element is broken down into smaller pieces, called tiles, of a standard size. These tiles will be arranged to form the game world according to pre-determined level data - usually a 2D array. + +For a detailed explanation about the maths behind this, read [http://clintbellanger.net/articles/isometric_math/](http://clintbellanger.net/articles/isometric_math/). diff --git a/examples/community/isometric-basics/castle.png b/examples/community/isometric-basics/castle.png new file mode 100644 index 0000000000000000000000000000000000000000..190fd9ee1e7b6b6c6af13352916164eb93d9a913 GIT binary patch literal 26296 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 DMRaI9 literal 0 HcmV?d00001 diff --git a/examples/community/isometric-basics/main.go b/examples/community/isometric-basics/main.go new file mode 100644 index 0000000..246f9e4 --- /dev/null +++ b/examples/community/isometric-basics/main.go @@ -0,0 +1,102 @@ +package main + +import ( + "image" + "os" + + "github.com/faiface/pixel" + "github.com/faiface/pixel/pixelgl" + + _ "image/png" +) + +const ( + windowWidth = 800 + windowHeight = 800 + // sprite tiles are squared, 64x64 size + tileSize = 64 + f = 0 // floor identifier + w = 1 // wall identifier +) + +var levelData = [][]uint{ + {f, f, f, f, f, f}, // This row will be rendered in the lower left part of the screen (closer to the viewer) + {w, f, f, f, f, w}, + {w, f, f, f, f, w}, + {w, f, f, f, f, w}, + {w, f, f, f, f, w}, + {w, w, w, w, w, w}, // And this in the upper right +} +var win *pixelgl.Window +var offset = pixel.V(400, 325) +var floorTile, wallTile *pixel.Sprite + +func loadPicture(path string) (pixel.Picture, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + img, _, err := image.Decode(file) + if err != nil { + return nil, err + } + return pixel.PictureDataFromImage(img), nil +} + +func run() { + var err error + + cfg := pixelgl.WindowConfig{ + Title: "Isometric demo", + Bounds: pixel.R(0, 0, windowWidth, windowHeight), + VSync: true, + } + win, err = pixelgl.NewWindow(cfg) + if err != nil { + panic(err) + } + + pic, err := loadPicture("castle.png") + if err != nil { + panic(err) + } + + wallTile = pixel.NewSprite(pic, pixel.R(0, 448, tileSize, 512)) + floorTile = pixel.NewSprite(pic, pixel.R(0, 128, tileSize, 192)) + + depthSort() + + for !win.Closed() { + win.Update() + } +} + +// Draw level data tiles to window, from farthest to closest. +// In order to achieve the depth effect, we need to render tiles up to down, being lower +// closer to the viewer (see painter's algorithm). To do that, we need to process levelData in reverse order, +// so its first row is rendered last, as OpenGL considers its origin to be in the lower left corner of the display. +func depthSort() { + for x := len(levelData) - 1; x >= 0; x-- { + for y := len(levelData[x]) - 1; y >= 0; y-- { + isoCoords := cartesianToIso(pixel.V(float64(x), float64(y))) + mat := pixel.IM.Moved(offset.Add(isoCoords)) + // Not really needed, just put to show bigger blocks + mat = mat.ScaledXY(win.Bounds().Center(), pixel.V(2, 2)) + tileType := levelData[x][y] + if tileType == f { + floorTile.Draw(win, mat) + } else { + wallTile.Draw(win, mat) + } + } + } +} + +func cartesianToIso(pt pixel.Vec) pixel.Vec { + return pixel.V((pt.X-pt.Y)*(tileSize/2), (pt.X+pt.Y)*(tileSize/4)) +} + +func main() { + pixelgl.Run(run) +} -- GitLab