134 lines
2.7 KiB
Go
134 lines
2.7 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"image/color"
|
||
|
"image/png"
|
||
|
"log"
|
||
|
"math"
|
||
|
"math/rand"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
|
||
|
"github.com/hajimehoshi/ebiten/v2"
|
||
|
)
|
||
|
|
||
|
type Game struct {
|
||
|
points []*Position
|
||
|
preScreens []*ColorArray
|
||
|
screen *ebiten.Image
|
||
|
pressCountEnter int
|
||
|
pressCountSpace int
|
||
|
}
|
||
|
|
||
|
func (g *Game) NewImage() {
|
||
|
image := NewColorArray()
|
||
|
for i := 0; i < 3; i++ {
|
||
|
x, y := rand.Intn(screenHeight), rand.Intn(screenWidth)
|
||
|
g.points[i] = &Position{x, y}
|
||
|
}
|
||
|
for x := 0; x < screenWidth; x++ {
|
||
|
for y := 0; y < screenHeight; y++ {
|
||
|
c := make([]uint16, 3)
|
||
|
for i := 0; i < 3; i++ {
|
||
|
p := g.points[i]
|
||
|
if p.X != x || p.Y != y {
|
||
|
v := math.Abs(p.Dist(&Position{x, y}))
|
||
|
c[i] = function.Func(v)
|
||
|
} else {
|
||
|
c[0] = 65535
|
||
|
c[1] = 65535
|
||
|
c[2] = 65535
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
image.Set(x, y, color.RGBA64{c[0], c[1], c[2], 255})
|
||
|
}
|
||
|
}
|
||
|
g.preScreens = append(g.preScreens, image)
|
||
|
}
|
||
|
|
||
|
func (gm *Game) Init() {
|
||
|
for i := 0; i < layerCount; i++ {
|
||
|
gm.NewImage()
|
||
|
}
|
||
|
|
||
|
for x := 0; x < screenWidth; x++ {
|
||
|
for y := 0; y < screenHeight; y++ {
|
||
|
var r, g, b int64 = 0, 0, 0
|
||
|
for i := 0; i < layerCount; i++ {
|
||
|
R, G, B, _ := gm.preScreens[i].At(x, y).RGBA()
|
||
|
r += int64(R)
|
||
|
g += int64(G)
|
||
|
b += int64(B)
|
||
|
}
|
||
|
r /= int64(layerCount)
|
||
|
g /= int64(layerCount)
|
||
|
b /= int64(layerCount)
|
||
|
gm.screen.Set(x, y, color.RGBA64{uint16(r), uint16(g), uint16(b), 65535})
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (g *Game) ReInit() {
|
||
|
g.points = make([]*Position, 3)
|
||
|
g.preScreens = make([]*ColorArray, 0)
|
||
|
g.screen = ebiten.NewImage(screenWidth, screenHeight)
|
||
|
g.Init()
|
||
|
}
|
||
|
|
||
|
func NewGame() *Game {
|
||
|
gm := &Game{
|
||
|
make([]*Position, 3),
|
||
|
make([]*ColorArray, 0),
|
||
|
ebiten.NewImage(screenWidth, screenHeight),
|
||
|
0,
|
||
|
0,
|
||
|
}
|
||
|
gm.Init()
|
||
|
return gm
|
||
|
}
|
||
|
|
||
|
func (g *Game) Update() error {
|
||
|
if ebiten.IsKeyPressed(ebiten.KeyEnter) && g.pressCountEnter == 0 {
|
||
|
file, err := os.Create(strconv.FormatInt(time.Now().Unix(), 10) + ".png")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer file.Close()
|
||
|
err = png.Encode(file, g.screen)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
g.pressCountEnter++
|
||
|
} else if !ebiten.IsKeyPressed(ebiten.KeyEnter) && g.pressCountEnter > 0 {
|
||
|
g.pressCountEnter = 0
|
||
|
}
|
||
|
|
||
|
if ebiten.IsKeyPressed(ebiten.KeySpace) && g.pressCountSpace == 0 {
|
||
|
g.ReInit()
|
||
|
g.pressCountSpace++
|
||
|
} else if !ebiten.IsKeyPressed(ebiten.KeySpace) && g.pressCountSpace > 0 {
|
||
|
g.pressCountSpace = 0
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (g *Game) Draw(screen *ebiten.Image) {
|
||
|
screen.DrawImage(g.screen, nil)
|
||
|
}
|
||
|
|
||
|
func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
|
||
|
return screenWidth, screenHeight
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
g := NewGame()
|
||
|
ebiten.SetWindowSize(windowWidth, windowHeight)
|
||
|
ebiten.SetWindowTitle("XVisuals")
|
||
|
if err := ebiten.RunGame(g); err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}
|