From b50671c353a28ccca4112ad86b3e6a3693997cc3 Mon Sep 17 00:00:00 2001 From: Peter Hellberg <peter@c7.se> Date: Thu, 11 Jan 2018 22:39:45 +0100 Subject: [PATCH] Add starfield experiment to community examples --- examples/community/starfield/README.md | 20 +++ examples/community/starfield/screenshot.png | Bin 0 -> 12550 bytes examples/community/starfield/starfield.go | 165 ++++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 examples/community/starfield/README.md create mode 100644 examples/community/starfield/screenshot.png create mode 100644 examples/community/starfield/starfield.go diff --git a/examples/community/starfield/README.md b/examples/community/starfield/README.md new file mode 100644 index 0000000..9afba9f --- /dev/null +++ b/examples/community/starfield/README.md @@ -0,0 +1,20 @@ +# starfield + +Classic starfield… with [supposedly accurate stellar colors](http://www.vendian.org/mncharity/dir3/starcolor/) + +Made by [Peter Hellberg](https://github.com/peterhellberg/) as part of his [pixel-experiments](https://github.com/peterhellberg/pixel-experiments) + +## Controls + +Arrow up and down to change speed. Space bar to almost stop. + +## Screenshots + + + + + +## Links + + - https://github.com/peterhellberg/pixel-experiments/tree/master/starfield + - https://gist.github.com/peterhellberg/4018e228cced61a0bb26991e49299c96 diff --git a/examples/community/starfield/screenshot.png b/examples/community/starfield/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..513ca6fad330e8cfac80621d90b8e9e02a18c833 GIT binary patch literal 12550 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 literal 0 HcmV?d00001 diff --git a/examples/community/starfield/starfield.go b/examples/community/starfield/starfield.go new file mode 100644 index 0000000..658ecdb --- /dev/null +++ b/examples/community/starfield/starfield.go @@ -0,0 +1,165 @@ +package main + +import ( + "image/color" + "math/rand" + "time" + + "github.com/faiface/pixel" + "github.com/faiface/pixel/imdraw" + "github.com/faiface/pixel/pixelgl" +) + +const w, h = float64(1024), float64(512) + +var speed = float64(200) + +var stars [1024]*star + +func init() { + rand.Seed(4) + + for i := 0; i < len(stars); i++ { + stars[i] = newStar() + } +} + +type star struct { + pixel.Vec + Z float64 + P float64 + C color.RGBA +} + +func newStar() *star { + return &star{ + pixel.V(random(-w, w), random(-h, h)), + random(0, w), 0, Colors[rand.Intn(len(Colors))], + } +} + +func (s *star) update(d float64) { + s.P = s.Z + s.Z -= d * speed + + if s.Z < 0 { + s.X = random(-w, w) + s.Y = random(-h, h) + s.Z = w + s.P = s.Z + } +} + +func (s *star) draw(imd *imdraw.IMDraw) { + p := pixel.V( + scale(s.X/s.Z, 0, 1, 0, w), + scale(s.Y/s.Z, 0, 1, 0, h), + ) + + o := pixel.V( + scale(s.X/s.P, 0, 1, 0, w), + scale(s.Y/s.P, 0, 1, 0, h), + ) + + r := scale(s.Z, 0, w, 11, 0) + + imd.Color = s.C + + if p.Sub(o).Len() > 6 { + imd.Push(p, o) + imd.Line(r) + } + + imd.Push(p) + imd.Circle(r, 0) +} + +func run() { + win, err := pixelgl.NewWindow(pixelgl.WindowConfig{ + Bounds: pixel.R(0, 0, w, h), + VSync: true, + Undecorated: true, + }) + if err != nil { + panic(err) + } + + imd := imdraw.New(nil) + + imd.Precision = 7 + + imd.SetMatrix(pixel.IM.Moved(win.Bounds().Center())) + + last := time.Now() + + for !win.Closed() { + win.SetClosed(win.JustPressed(pixelgl.KeyEscape) || win.JustPressed(pixelgl.KeyQ)) + + if win.Pressed(pixelgl.KeyUp) { + speed += 10 + } + + if win.Pressed(pixelgl.KeyDown) { + if speed > 10 { + speed -= 10 + } + } + + if win.Pressed(pixelgl.KeySpace) { + speed = 100 + } + + d := time.Since(last).Seconds() + + last = time.Now() + + imd.Clear() + + for _, s := range stars { + s.update(d) + s.draw(imd) + } + + win.Clear(color.Black) + imd.Draw(win) + win.Update() + } +} + +func main() { + pixelgl.Run(run) +} + +func random(min, max float64) float64 { + return rand.Float64()*(max-min) + min +} + +func scale(unscaledNum, min, max, minAllowed, maxAllowed float64) float64 { + return (maxAllowed-minAllowed)*(unscaledNum-min)/(max-min) + minAllowed +} + +// Colors based on stellar types listed at +// http://www.vendian.org/mncharity/dir3/starcolor/ +var Colors = []color.RGBA{ + color.RGBA{157, 180, 255, 255}, + color.RGBA{162, 185, 255, 255}, + color.RGBA{167, 188, 255, 255}, + color.RGBA{170, 191, 255, 255}, + color.RGBA{175, 195, 255, 255}, + color.RGBA{186, 204, 255, 255}, + color.RGBA{192, 209, 255, 255}, + color.RGBA{202, 216, 255, 255}, + color.RGBA{228, 232, 255, 255}, + color.RGBA{237, 238, 255, 255}, + color.RGBA{251, 248, 255, 255}, + color.RGBA{255, 249, 249, 255}, + color.RGBA{255, 245, 236, 255}, + color.RGBA{255, 244, 232, 255}, + color.RGBA{255, 241, 223, 255}, + color.RGBA{255, 235, 209, 255}, + color.RGBA{255, 215, 174, 255}, + color.RGBA{255, 198, 144, 255}, + color.RGBA{255, 190, 127, 255}, + color.RGBA{255, 187, 123, 255}, + color.RGBA{255, 187, 123, 255}, +} -- GitLab