From c450ae3cff99d8da9460290ead9a258d42b1d349 Mon Sep 17 00:00:00 2001 From: Justin Hawkins Date: Sun, 8 Jan 2023 17:14:09 +1030 Subject: [PATCH] first commit --- README.md | 39 +++++++++ example.png | Bin 0 -> 23577 bytes go.mod | 5 ++ go.sum | 26 ++++++ main.go | 248 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 318 insertions(+) create mode 100644 README.md create mode 100644 example.png create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/README.md b/README.md new file mode 100644 index 0000000..13a610f --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# spritesheet_generator + +This is a simple program to generate a template for isometric sprite +tilesheets, in png format. For use with software such as [Tiled](https://www.mapeditor.org). + +## Installation + +`go install github.com/tardisx/spritesheet_generator@latest` + +If you really want binaries, pester me :-) + +## Usage + +`Usage of ./spritesheet_generator: + -height int + base tile height in pixels (default 128) + -multiplier int + tile height multiplier (default 2) + -output string + output filename + -width int + tile width in pixels (default 128) + -x int + number of tiles across (default 8) + -y int + number of tiles down (default 8)` + +Hopefully these options are mostly self-explanatory. + +The `multiplier` option describes how 'tall' the tiles are. Normally you +want some height to tiles to give them the illusion of depth and the ability +to hide things behind them. If you are unsure, start with the default of 2. + +## Example + +![Screenshot][screenshot] + + +[screenshot]: https://raw.githubusercontent.com/tardisx/spritesheet_generator/main/example.png diff --git a/example.png b/example.png new file mode 100644 index 0000000000000000000000000000000000000000..bb73b5e9f68e392a7344c5fa6559ea9835e13a02 GIT binary patch literal 23577 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 bl + drawLine(img, tileX, tileY, tileX, tileY+t.Y-1, color.White) + // bl => br + drawLine(img, tileX, tileY+t.Y-1, tileX+t.X-1, tileY+t.Y-1, color.White) + // br => tr + drawLine(img, tileX+t.X-1, tileY+t.Y-1, tileX+t.X-1, tileY, color.White) + // tr => tl + drawLine(img, tileX+t.X-1, tileY, tileX, tileY, color.White) + +} + +// thanks to https://github.com/StephaneBunel/bresenham +func drawLine(img *image.RGBA, x1, y1, x2, y2 int, col color.Color) { + var dx, dy, e, slope int + + // Because drawing p1 -> p2 is equivalent to draw p2 -> p1, + // I sort points in x-axis order to handle only half of possible cases. + if x1 > x2 { + x1, y1, x2, y2 = x2, y2, x1, y1 + } + + dx, dy = x2-x1, y2-y1 + // Because point is x-axis ordered, dx cannot be negative + if dy < 0 { + dy = -dy + } + + switch { + + // Is line a point ? + case x1 == x2 && y1 == y2: + img.Set(x1, y1, col) + + // Is line an horizontal ? + case y1 == y2: + for ; dx != 0; dx-- { + img.Set(x1, y1, col) + x1++ + } + img.Set(x1, y1, col) + + // Is line a vertical ? + case x1 == x2: + if y1 > y2 { + y1, y2 = y2, y1 + } + for ; dy != 0; dy-- { + img.Set(x1, y1, col) + y1++ + } + img.Set(x1, y1, col) + + // Is line a diagonal ? + case dx == dy: + if y1 < y2 { + for ; dx != 0; dx-- { + img.Set(x1, y1, col) + x1++ + y1++ + } + } else { + for ; dx != 0; dx-- { + img.Set(x1, y1, col) + x1++ + y1-- + } + } + img.Set(x1, y1, col) + + // wider than high ? + case dx > dy: + if y1 < y2 { + // BresenhamDxXRYD(img, x1, y1, x2, y2, col) + dy, e, slope = 2*dy, dx, 2*dx + for ; dx != 0; dx-- { + img.Set(x1, y1, col) + x1++ + e -= dy + if e < 0 { + y1++ + e += slope + } + } + } else { + // BresenhamDxXRYU(img, x1, y1, x2, y2, col) + dy, e, slope = 2*dy, dx, 2*dx + for ; dx != 0; dx-- { + img.Set(x1, y1, col) + x1++ + e -= dy + if e < 0 { + y1-- + e += slope + } + } + } + img.Set(x2, y2, col) + + // higher than wide. + default: + if y1 < y2 { + // BresenhamDyXRYD(img, x1, y1, x2, y2, col) + dx, e, slope = 2*dx, dy, 2*dy + for ; dy != 0; dy-- { + img.Set(x1, y1, col) + y1++ + e -= dx + if e < 0 { + x1++ + e += slope + } + } + } else { + // BresenhamDyXRYU(img, x1, y1, x2, y2, col) + dx, e, slope = 2*dx, dy, 2*dy + for ; dy != 0; dy-- { + img.Set(x1, y1, col) + y1-- + e -= dx + if e < 0 { + x1++ + e += slope + } + } + } + img.Set(x2, y2, col) + } +} + +func addLabel(img *image.RGBA, x, y int, label string) { + col := color.RGBA{20, 20, 240, 255} + point := fixed.Point26_6{X: fixed.I(x), Y: fixed.I(y)} + + d := &font.Drawer{ + Dst: img, + Src: image.NewUniform(col), + Face: basicfont.Face7x13, + Dot: point, + } + d.DrawString(label) +} + +// // Colors are defined by Red, Green, Blue, Alpha uint8 values. +// cyan := color.RGBA{100, 200, 200, 0xff} + +// // Set color for each pixel. +// for x := 0; x < width; x++ { +// for y := 0; y < height; y++ { +// switch { +// case x < width/2 && y < height/2: // upper left quadrant +// img.Set(x, y, cyan) +// case x >= width/2 && y >= height/2: // lower right quadrant +// img.Set(x, y, color.White) +// default: +// // Use zero value. +// } +// } +// }