aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/pexeso/main.go155
1 files changed, 155 insertions, 0 deletions
diff --git a/examples/pexeso/main.go b/examples/pexeso/main.go
new file mode 100644
index 0000000..45ae90e
--- /dev/null
+++ b/examples/pexeso/main.go
@@ -0,0 +1,155 @@
+package main
+
+import (
+ "fmt"
+ "image"
+ "image/color"
+ "image/draw"
+ "math/rand"
+ "time"
+
+ "github.com/faiface/gui"
+ "github.com/faiface/gui/win"
+ "github.com/faiface/mainthread"
+)
+
+func EqualColors(c1, c2 color.Color) bool {
+ r1, g1, b1, a1 := c1.RGBA()
+ r2, g2, b2, a2 := c2.RGBA()
+ return r1 == r2 && g1 == g2 && b1 == b2 && a1 == a2
+}
+
+func HexToColor(hex string) color.Color {
+ var r, g, b uint8
+ fmt.Sscanf(hex, "#%2X%2X%2X", &r, &g, &b)
+ return color.RGBA{r, g, b, 255}
+}
+
+var Colors = []color.Color{
+ HexToColor("#E53935"),
+ HexToColor("#F06292"),
+ HexToColor("#9C27B0"),
+ HexToColor("#673AB7"),
+ HexToColor("#3F51B5"),
+ HexToColor("#2196F3"),
+ HexToColor("#29B6F6"),
+ HexToColor("#00BCD4"),
+ HexToColor("#009688"),
+ HexToColor("#4CAF50"),
+ HexToColor("#8BC34A"),
+ HexToColor("#CDDC39"),
+ HexToColor("#FFEB3B"),
+ HexToColor("#FFC107"),
+ HexToColor("#FF9800"),
+ HexToColor("#8D6E63"),
+ HexToColor("#9E9E9E"),
+ HexToColor("#607D8B"),
+}
+
+type PairMsg struct {
+ Color color.Color
+ Resp chan<- bool
+}
+
+func Tile(env gui.Env, pair chan PairMsg, r image.Rectangle, clr color.Color) {
+ redraw := func(covered float64) func(draw.Image) image.Rectangle {
+ return func(drw draw.Image) image.Rectangle {
+ coveredY := int(float64(r.Dy()) * covered)
+ bottomR := r
+ bottomR.Min.Y = bottomR.Max.Y - coveredY
+ topR := r
+ topR.Max.Y = bottomR.Min.Y
+ draw.Draw(drw, bottomR, &image.Uniform{HexToColor("#37474F")}, image.ZP, draw.Src)
+ draw.Draw(drw, topR, &image.Uniform{clr}, image.ZP, draw.Src)
+ return r
+ }
+ }
+
+ env.Draw() <- redraw(0.0)
+
+ for event := range env.Events() {
+ var x, y int
+ switch {
+ case event.Matches("mo/down/%d/%d", &x, &y):
+ if image.Pt(x, y).In(r) {
+ for c := 32; c >= 0; c-- {
+ env.Draw() <- redraw(float64(c) / 32)
+ time.Sleep(time.Second / 32 / 4)
+ }
+
+ var correct bool
+
+ resp := make(chan bool)
+ select {
+ case pair <- PairMsg{clr, resp}:
+ correct = <-resp
+
+ case msg := <-pair:
+ time.Sleep(time.Second / 2)
+ correct = EqualColors(clr, msg.Color)
+ msg.Resp <- correct
+ }
+
+ if correct {
+ close(env.Draw())
+ return
+ }
+
+ for c := 0; c <= 32; c++ {
+ env.Draw() <- redraw(float64(c) / 32)
+ time.Sleep(time.Second / 32 / 4)
+ }
+ }
+ }
+ }
+}
+
+func run() {
+ rand.Seed(time.Now().UnixNano())
+
+ w, err := win.New(win.Title("Pexeso"), win.Size(600, 600))
+ if err != nil {
+ panic(err)
+ }
+
+ mux, env := gui.NewMux(w)
+
+ var colors []color.Color
+ for _, clr := range Colors {
+ colors = append(colors, clr, clr)
+ }
+
+ rand.Shuffle(len(colors), func(i, j int) {
+ colors[i], colors[j] = colors[j], colors[i]
+ })
+
+ env.Draw() <- func(drw draw.Image) image.Rectangle {
+ r := image.Rect(0, 0, 600, 600)
+ draw.Draw(drw, r, &image.Uniform{HexToColor("#CFD8DC")}, image.ZP, draw.Src)
+ return r
+ }
+
+ pair := make(chan PairMsg)
+
+ i := 0
+ for x := 0; x < 600; x += 100 {
+ for y := 0; y < 600; y += 100 {
+ go Tile(mux.MakeEnv(), pair, image.Rect(
+ x+10, y+10,
+ x+90, y+90,
+ ), colors[i])
+ i++
+ }
+ }
+
+ for event := range env.Events() {
+ switch {
+ case event.Matches("wi/close"):
+ close(env.Draw())
+ }
+ }
+}
+
+func main() {
+ mainthread.Run(run)
+}