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
+
+![starfield animation](https://user-images.githubusercontent.com/565124/32411599-a5fcba72-c1df-11e7-8730-a570470a4eee.gif)
+
+![starfield screenshot](screenshot.png)
+
+## 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