package main import ( "fmt" "image" "image/color" "image/draw" "log" "github.com/fogleman/gg" "github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten/ebitenutil" ) const ( screenWidth = 128 screenHeight = 128 ) var ( drawImage *image.RGBA gc *gg.Context ) func update(screen *ebiten.Image) error { if ebiten.IsRunningSlowly() { return nil } screen.ReplacePixels(drawImage.Pix) ebitenutil.DebugPrint(screen, fmt.Sprintf("FPS: %f", ebiten.CurrentFPS())) return nil } func main() { drawImage = image.NewRGBA(image.Rect(0, 0, screenWidth, screenHeight)) rect := image.Rect(0, 0, screenWidth, screenHeight) // 2 colour palette (black/red) palette := color.Palette{ color.RGBA{0, 0, 0, 0}, color.RGBA{255, 0, 0, 255}, } paletteImage := image.NewPaletted(rect, palette) gc = gg.NewContextForImage(drawImage) gc.SetRGB(0, 0, 0) gc.SetRGBA(1, 0, 0, 1) gc.SetLineWidth(1) gc.DrawLine(20, 20, 80, 60) gc.Stroke() // draw onto palette draw.Draw(paletteImage, rect, gc.Image(), rect.Bounds().Min, draw.Over) // draw back again draw.Draw(drawImage, rect, paletteImage, rect.Bounds().Min, draw.Over) scale := float64(800 / screenWidth) if err := ebiten.Run(update, screenWidth, screenHeight, scale, "EightBit (Ebiten Demo)"); err != nil { log.Fatal(err) } }