Skip to content
Snippets Groups Projects
main.go 1.24 KiB
Newer Older
Nathan's avatar
Nathan committed
package main

import (
	"flag"
	"math/rand"
	"time"

	"golang.org/x/image/colornames"

	"github.com/faiface/pixel"
	"github.com/faiface/pixel/examples/community/game_of_life/life"
	"github.com/faiface/pixel/imdraw"
	"github.com/faiface/pixel/pixelgl"
)

var (
	size       *int
	windowSize *float64
Nathan's avatar
Nathan committed
	frameRate  *time.Duration
Nathan's avatar
Nathan committed
)

func init() {
	rand.Seed(time.Now().UnixNano())
	size = flag.Int("size", 5, "The size of each cell")
	windowSize = flag.Float64("windowSize", 800, "The pixel size of one side of the grid")
Nathan's avatar
Nathan committed
	frameRate = flag.Duration("frameRate", 33*time.Millisecond, "The framerate in milliseconds")
Nathan's avatar
Nathan committed
	flag.Parse()
}

func main() {
	pixelgl.Run(run)
}

func run() {

	cfg := pixelgl.WindowConfig{
		Title:  "Pixel Rocks!",
		Bounds: pixel.R(0, 0, *windowSize, *windowSize),
		VSync:  true,
	}
	win, err := pixelgl.NewWindow(cfg)
	if err != nil {
		panic(err)
	}
	win.Clear(colornames.White)

	// since the game board is square, rows and cols will be the same
	rows := int(*windowSize) / *size

	gridDraw := imdraw.New(nil)
	game := life.NewLife(rows, *size)
Nathan's avatar
Nathan committed
	tick := time.Tick(*frameRate)
Nathan's avatar
Nathan committed
	for !win.Closed() {
		// game loop
Nathan's avatar
Nathan committed
		select {
		case <-tick:
Nathan's avatar
Nathan committed
			gridDraw.Clear()
			game.A.Draw(gridDraw)
			gridDraw.Draw(win)
			game.Step()
		}
		win.Update()
	}
}