summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoop Kiefte <ikojba@gmail.com>2020-11-13 03:39:13 +0200
committerJoop Kiefte <ikojba@gmail.com>2020-11-13 03:39:13 +0200
commitc6a0a549b12cdb6318cbe9db1a8f3be8fba7f5a9 (patch)
treedcc77e67d40bd1e0d2a14b6f58e1d3835ee0905a
parent09349c8a07d11abd063649445918e5ec95e34707 (diff)
Gio hello world
-rw-r--r--go.mod2
-rw-r--r--go.sum28
-rw-r--r--main.go160
3 files changed, 190 insertions, 0 deletions
diff --git a/go.mod b/go.mod
index ecb7134..4c2a9cf 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,5 @@
module git.kiefte.eu/lapingvino/gioco
go 1.15
+
+require gioui.org v0.0.0-20201112145235-3c739323cb4f
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..d2bb660
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,28 @@
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+gioui.org v0.0.0-20201112145235-3c739323cb4f h1:O1WtE27z2GqOJjE0Dl6k2qqts63tqoSwwoWyE7K3RLM=
+gioui.org v0.0.0-20201112145235-3c739323cb4f/go.mod h1:Y+uS7hHMvku1Q+ooaoq6fYD5B2LGoT8JtFgvmYmRzTw=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3 h1:n9HxLrNxWWtEb1cA950nuEEj3QnKbtsCJ6KjcgisNUs=
+golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20200618115811-c13761719519 h1:1e2ufUJNM3lCHEY5jIgac/7UTjd6cgJNdatjPdFWf34=
+golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk=
+golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..181e9e5
--- /dev/null
+++ b/main.go
@@ -0,0 +1,160 @@
+package main
+
+import (
+ // "git.kiefte.eu/clitris/tris"
+ "image/color"
+ "gioui.org/app"
+ "log"
+ "os"
+ "gioui.org/unit"
+ "gioui.org/io/system"
+ "gioui.org/layout"
+ "gioui.org/op"
+ "gioui.org/text"
+ "gioui.org/widget/material"
+
+ "gioui.org/font/gofont"
+// "math/rand"
+)
+
+func main() {
+ go func() {
+ w := app.NewWindow(app.Title("Gioco - another block stacking game"), app.Size(unit.Dp(500), unit.Dp(500)))
+ if err := loop(w); err != nil {
+ log.Fatal(err)
+ }
+ os.Exit(0)
+ }()
+
+ app.Main()
+}
+
+func loop(w *app.Window) error {
+ th := material.NewTheme(gofont.Collection())
+ /*
+ rand.Seed(time.Now().UnixNano()) // to start with truly random pieces
+ f := tris.NewField(20, 10) // the playing field (10x20)
+ var floor, topout, harddrop bool // state machine variables to check special situations
+
+ // define outside of game loop to avoid accidental resets of position
+ // x, y and rot are the values calculated to feed to Move
+ // which then checks collisions and does the wall kicks
+ var x, y int
+ var rot tris.Rotation
+
+ var level, linescleared, score, dropfrom int
+
+ fmt.Print("\033[2J") // Clear screen
+ b := tris.NewBag()
+ b, p := b.Pick()
+ lev := time.NewTicker(time.Second)
+ level = 1
+ for {
+ x, y, rot = p.X, p.Y, p.Rot
+ level = linescleared/10 + 1
+ slevel := fmt.Sprintf("level %d", level)
+ sscore := fmt.Sprintf("score %d", score)
+ slines := fmt.Sprintf("lines %d", linescleared)
+ if !harddrop {
+ ppos(0, 0, "Hold (c)")
+ npos(3, 0, tris.HoldBox)
+ fpos(0, 10, f.Add(p))
+ var next tris.Field
+ b, next = b.Next(5)
+ npos(0, 34, next)
+ ppos(1, 42, sscore)
+ ppos(3, 42, slevel)
+ ppos(5, 42, slines)
+ key = GetKey(t)
+ }
+ switch key[0] {
+ case 27: // Escape, read the arrow key pressed
+ switch key[2] {
+ case 65: // Up
+ rot = (p.Rot + 1) % 4
+ case 66: // Down
+ y = p.Y + 1
+ score += 1
+ case 67: // Right
+ x = p.X + 1
+ case 68: // Left
+ x = p.X - 1
+ default:
+ ppos(22, 0, "...escape, escape!")
+ return
+ }
+ case 'x':
+ rot = (p.Rot + 1) % 4
+ case 'z':
+ rot = (p.Rot + 3) % 4
+ case 'c':
+ b, p = b.Swap(p)
+ continue
+ case ' ':
+ if !harddrop {
+ dropfrom = p.Y
+ }
+ harddrop = true
+ case 'q':
+ ppos(22, 0, "...that was exciting!")
+ return
+ case 'Q':
+ ppos(22, 0, "...never let an engineer pick the name of your software?")
+ return
+ }
+ select {
+ case <-lev.C:
+ y = p.Y + 1
+ lev.Reset(time.Second * 100 / (100 * time.Duration(level)))
+ default:
+ if harddrop {
+ y = p.Y + 1
+ }
+ }
+ p, floor, topout = p.Move(f, rot, x, y) // Check if the piece can move, then do it and communicate back for housekeeping
+
+ // Give some time before actually locking in to enable tucks
+ // This code runs when the time is over
+ if floor && p.Lock.Add(tris.LockDelay).Before(time.Now()) {
+ if harddrop {
+ score += 2 * (p.Y - dropfrom)
+ harddrop = false
+ }
+ var l int
+ f = f.Add(p)
+ l, f = f.Lines() // count and remove full lines
+ if l > 0 {
+ linescleared += l
+ score += 40 * level * l * l
+ }
+ fmt.Print("\033[2J") // Clear screen
+ b, p = b.Pick() // ... and pick a new piece from the bag
+ }
+ // when not touching a piece or floor below yet, reset lock delay
+ if !floor {
+ p.Lock = time.Now()
+ }
+
+ if topout {
+ ppos(4, 15, " GAME OVER ")
+ return
+ }
+ }
+ */
+ var ops op.Ops
+ for {
+ e := <-w.Events()
+ switch e := e.(type) {
+ case system.DestroyEvent:
+ return e.Err
+ case system.FrameEvent:
+ gtx := layout.NewContext(&ops, e)
+ l := material.H1(th, "Hello, Gio")
+ maroon := color.RGBA{127, 0, 0, 255}
+ l.Color = maroon
+ l.Alignment = text.Middle
+ l.Layout(gtx)
+ e.Frame(gtx.Ops)
+ }
+ }
+}