From 746653dcb3bef16dd3e1c95eea3535af4d21ff0e Mon Sep 17 00:00:00 2001 From: Andrew Gerrand Date: Tue, 5 Jan 2016 12:15:20 +1100 Subject: [PATCH] example/flappy: add simple example game This game was developed for and presented at GoCon Winter 2015 in Tokyo. Change-Id: I08148e16a54355b79f634dce867b3c3c0a0153cb Reviewed-on: https://go-review.googlesource.com/18245 Reviewed-by: Nigel Tao --- example/flappy/assets/README | 2 + example/flappy/assets/sprite.png | Bin 0 -> 76531 bytes example/flappy/game.go | 354 +++++++++++++++++++++++++++++++ example/flappy/main.go | 98 +++++++++ example/flappy/main_x.go | 10 + 5 files changed, 464 insertions(+) create mode 100644 example/flappy/assets/README create mode 100644 example/flappy/assets/sprite.png create mode 100644 example/flappy/game.go create mode 100644 example/flappy/main.go create mode 100644 example/flappy/main_x.go diff --git a/example/flappy/assets/README b/example/flappy/assets/README new file mode 100644 index 0000000..cd66fc6 --- /dev/null +++ b/example/flappy/assets/README @@ -0,0 +1,2 @@ +The sprites were created by Renee French and are distributed +under the Creative Commons Attributions 3.0 license. diff --git a/example/flappy/assets/sprite.png b/example/flappy/assets/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..197e590adb13fcbf27d12aad09ba4527620ab927 GIT binary patch literal 76531 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 G;r|Dx1c?s- literal 0 HcmV?d00001 diff --git a/example/flappy/game.go b/example/flappy/game.go new file mode 100644 index 0000000..7edf5b1 --- /dev/null +++ b/example/flappy/game.go @@ -0,0 +1,354 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin linux + +package main + +import ( + "image" + "log" + "math" + "math/rand" + + _ "image/png" + + "golang.org/x/mobile/asset" + "golang.org/x/mobile/exp/f32" + "golang.org/x/mobile/exp/sprite" + "golang.org/x/mobile/exp/sprite/clock" +) + +const ( + tileWidth, tileHeight = 16, 16 // width and height of each tile + tilesX, tilesY = 16, 16 // number of horizontal tiles + + gopherTile = 1 // which tile the gopher is standing on (0-indexed) + + initScrollV = 1 // initial scroll velocity + scrollA = 0.001 // scroll accelleration + gravity = 0.1 // gravity + jumpV = -5 // jump velocity + flapV = -1.5 // flap velocity + + deadScrollA = -0.01 // scroll deceleration after the gopher dies + deadTimeBeforeReset = 240 // how long to wait before restarting the game + + groundChangeProb = 5 // 1/probability of ground height change + groundWobbleProb = 3 // 1/probability of minor ground height change + groundMin = tileHeight * (tilesY - 2*tilesY/5) + groundMax = tileHeight * tilesY + initGroundY = tileHeight * (tilesY - 1) + + climbGrace = tileHeight / 3 // gopher won't die if it hits a cliff this high +) + +type Game struct { + gopher struct { + y float32 // y-offset + v float32 // velocity + atRest bool // is the gopher on the ground? + flapped bool // has the gopher flapped since it became airborne? + dead bool // is the gopher dead? + deadTime clock.Time // when the gopher died + } + scroll struct { + x float32 // x-offset + v float32 // velocity + } + groundY [tilesX + 3]float32 // ground y-offsets + groundTex [tilesX + 3]int // ground texture + lastCalc clock.Time // when we last calculated a frame +} + +func NewGame() *Game { + var g Game + g.reset() + return &g +} + +func (g *Game) reset() { + g.gopher.y = 0 + g.gopher.v = 0 + g.scroll.x = 0 + g.scroll.v = initScrollV + for i := range g.groundY { + g.groundY[i] = initGroundY + g.groundTex[i] = randomGroundTexture() + } + g.gopher.atRest = false + g.gopher.flapped = false + g.gopher.dead = false + g.gopher.deadTime = 0 +} + +func (g *Game) Scene(eng sprite.Engine) *sprite.Node { + texs := loadTextures(eng) + + scene := &sprite.Node{} + eng.Register(scene) + eng.SetTransform(scene, f32.Affine{ + {1, 0, 0}, + {0, 1, 0}, + }) + + newNode := func(fn arrangerFunc) { + n := &sprite.Node{Arranger: arrangerFunc(fn)} + eng.Register(n) + scene.AppendChild(n) + } + + // The ground. + for i := range g.groundY { + i := i + // The top of the ground. + newNode(func(eng sprite.Engine, n *sprite.Node, t clock.Time) { + eng.SetSubTex(n, texs[g.groundTex[i]]) + eng.SetTransform(n, f32.Affine{ + {tileWidth, 0, float32(i)*tileWidth - g.scroll.x}, + {0, tileHeight, g.groundY[i]}, + }) + }) + // The earth beneath. + newNode(func(eng sprite.Engine, n *sprite.Node, t clock.Time) { + eng.SetSubTex(n, texs[texEarth]) + eng.SetTransform(n, f32.Affine{ + {tileWidth, 0, float32(i)*tileWidth - g.scroll.x}, + {0, tileHeight * tilesY, g.groundY[i] + tileHeight}, + }) + }) + } + + // The gopher. + newNode(func(eng sprite.Engine, n *sprite.Node, t clock.Time) { + a := f32.Affine{ + {tileWidth * 2, 0, tileWidth*(gopherTile-1) + tileWidth/8}, + {0, tileHeight * 2, g.gopher.y - tileHeight + tileHeight/4}, + } + var x int + switch { + case g.gopher.dead: + x = frame(t, 16, texGopherDead1, texGopherDead2) + animateDeadGopher(&a, t-g.gopher.deadTime) + case g.gopher.v < 0: + x = frame(t, 4, texGopherFlap1, texGopherFlap2) + case g.gopher.atRest: + x = frame(t, 4, texGopherRun1, texGopherRun2) + default: + x = frame(t, 8, texGopherRun1, texGopherRun2) + } + eng.SetSubTex(n, texs[x]) + eng.SetTransform(n, a) + }) + + return scene +} + +// frame returns the frame for the given time t +// when each frame is displayed for duration d. +func frame(t, d clock.Time, frames ...int) int { + total := int(d) * len(frames) + return frames[(int(t)%total)/int(d)] +} + +func animateDeadGopher(a *f32.Affine, t clock.Time) { + dt := float32(t) + a.Scale(a, 1+dt/20, 1+dt/20) + a.Translate(a, 0.5, 0.5) + a.Rotate(a, dt/math.Pi/-8) + a.Translate(a, -0.5, -0.5) +} + +type arrangerFunc func(e sprite.Engine, n *sprite.Node, t clock.Time) + +func (a arrangerFunc) Arrange(e sprite.Engine, n *sprite.Node, t clock.Time) { a(e, n, t) } + +const ( + texGopherRun1 = iota + texGopherRun2 + texGopherFlap1 + texGopherFlap2 + texGopherDead1 + texGopherDead2 + texGround1 + texGround2 + texGround3 + texGround4 + texEarth +) + +func randomGroundTexture() int { + return texGround1 + rand.Intn(4) +} + +func loadTextures(eng sprite.Engine) []sprite.SubTex { + a, err := asset.Open("sprite.png") + if err != nil { + log.Fatal(err) + } + defer a.Close() + + m, _, err := image.Decode(a) + if err != nil { + log.Fatal(err) + } + t, err := eng.LoadTexture(m) + if err != nil { + log.Fatal(err) + } + + const n = 128 + // TODO(adg,nigeltao): remove +1's and -1's below once texture bleed issue is fixed + return []sprite.SubTex{ + texGopherRun1: sprite.SubTex{t, image.Rect(n*0, 0, n*1, n)}, + texGopherRun2: sprite.SubTex{t, image.Rect(n*1, 0, n*2, n)}, + texGopherFlap1: sprite.SubTex{t, image.Rect(n*2, 0, n*3, n)}, + texGopherFlap2: sprite.SubTex{t, image.Rect(n*3, 0, n*4, n)}, + texGopherDead1: sprite.SubTex{t, image.Rect(n*4, 0, n*5, n)}, + texGopherDead2: sprite.SubTex{t, image.Rect(n*5, 0, n*6-1, n)}, + texGround1: sprite.SubTex{t, image.Rect(n*6+1, 0, n*7-1, n)}, + texGround2: sprite.SubTex{t, image.Rect(n*7+1, 0, n*8-1, n)}, + texGround3: sprite.SubTex{t, image.Rect(n*8+1, 0, n*9-1, n)}, + texGround4: sprite.SubTex{t, image.Rect(n*9+1, 0, n*10-1, n)}, + texEarth: sprite.SubTex{t, image.Rect(n*10+1, 0, n*11-1, n)}, + } +} + +func (g *Game) Press(down bool) { + if g.gopher.dead { + // Player can't control a dead gopher. + return + } + + if down { + switch { + case g.gopher.atRest: + // Gopher may jump from the ground. + g.gopher.v = jumpV + case !g.gopher.flapped: + // Gopher may flap once in mid-air. + g.gopher.flapped = true + g.gopher.v = flapV + } + } else { + // Stop gopher rising on button release. + if g.gopher.v < 0 { + g.gopher.v = 0 + } + } +} + +func (g *Game) Update(now clock.Time) { + if g.gopher.dead && now-g.gopher.deadTime > deadTimeBeforeReset { + // Restart if the gopher has been dead for a while. + //g.reset() + } + + // Compute game states up to now. + for ; g.lastCalc < now; g.lastCalc++ { + g.calcFrame() + } +} + +func (g *Game) calcFrame() { + g.calcScroll() + g.calcGopher() +} + +func (g *Game) calcScroll() { + // Compute velocity. + if g.gopher.dead { + // Decrease scroll speed when the gopher dies. + g.scroll.v += deadScrollA + if g.scroll.v < 0 { + g.scroll.v = 0 + } + } else { + // Increase scroll speed. + g.scroll.v += scrollA + } + + // Compute offset. + g.scroll.x += g.scroll.v + + // Create new ground tiles if we need to. + for g.scroll.x > tileWidth { + g.newGroundTile() + + // Check whether the gopher has crashed. + // Do this for each new ground tile so that when the scroll + // velocity is >tileWidth/frame it can't pass through the ground. + if !g.gopher.dead && g.gopherCrashed() { + g.killGopher() + } + } +} + +func (g *Game) calcGopher() { + // Compute velocity. + g.gopher.v += gravity + + // Compute offset. + g.gopher.y += g.gopher.v + + g.clampToGround() +} + +func (g *Game) newGroundTile() { + // Compute next ground y-offset. + next := g.nextGroundY() + nextTex := randomGroundTexture() + + // Shift ground tiles to the left. + g.scroll.x -= tileWidth + copy(g.groundY[:], g.groundY[1:]) + copy(g.groundTex[:], g.groundTex[1:]) + last := len(g.groundY) - 1 + g.groundY[last] = next + g.groundTex[last] = nextTex +} + +func (g *Game) nextGroundY() float32 { + prev := g.groundY[len(g.groundY)-1] + if change := rand.Intn(groundChangeProb) == 0; change { + return (groundMax-groundMin)*rand.Float32() + groundMin + } + if wobble := rand.Intn(groundWobbleProb) == 0; wobble { + return prev + (rand.Float32()-0.5)*climbGrace + } + return prev +} + +func (g *Game) gopherCrashed() bool { + return g.gopher.y+tileHeight-climbGrace > g.groundY[gopherTile+1] +} + +func (g *Game) killGopher() { + g.gopher.dead = true + g.gopher.deadTime = g.lastCalc + g.gopher.v = jumpV * 1.5 // Bounce off screen. +} + +func (g *Game) clampToGround() { + if g.gopher.dead { + // Allow the gopher to fall through ground when dead. + return + } + + // Compute the minimum offset of the ground beneath the gopher. + minY := g.groundY[gopherTile] + if y := g.groundY[gopherTile+1]; y < minY { + minY = y + } + + // Prevent the gopher from falling through the ground. + maxGopherY := minY - tileHeight + g.gopher.atRest = false + if g.gopher.y >= maxGopherY { + g.gopher.v = 0 + g.gopher.y = maxGopherY + g.gopher.atRest = true + g.gopher.flapped = false + } +} diff --git a/example/flappy/main.go b/example/flappy/main.go new file mode 100644 index 0000000..2274993 --- /dev/null +++ b/example/flappy/main.go @@ -0,0 +1,98 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin linux + +// Flappy Gopher is a simple one-button game that uses the +// mobile framework and the experimental sprite engine. +package main + +import ( + "math/rand" + "time" + + "golang.org/x/mobile/app" + "golang.org/x/mobile/event/key" + "golang.org/x/mobile/event/lifecycle" + "golang.org/x/mobile/event/paint" + "golang.org/x/mobile/event/size" + "golang.org/x/mobile/event/touch" + "golang.org/x/mobile/exp/gl/glutil" + "golang.org/x/mobile/exp/sprite" + "golang.org/x/mobile/exp/sprite/clock" + "golang.org/x/mobile/exp/sprite/glsprite" + "golang.org/x/mobile/gl" +) + +func main() { + rand.Seed(time.Now().UnixNano()) + + app.Main(func(a app.App) { + var glctx gl.Context + var sz size.Event + for e := range a.Events() { + switch e := a.Filter(e).(type) { + case lifecycle.Event: + switch e.Crosses(lifecycle.StageVisible) { + case lifecycle.CrossOn: + glctx, _ = e.DrawContext.(gl.Context) + onStart(glctx) + a.Send(paint.Event{}) + case lifecycle.CrossOff: + onStop() + glctx = nil + } + case size.Event: + sz = e + case paint.Event: + if glctx == nil || e.External { + continue + } + onPaint(glctx, sz) + a.Publish() + a.Send(paint.Event{}) // keep animating + case touch.Event: + if down := e.Type == touch.TypeBegin; down || e.Type == touch.TypeEnd { + game.Press(down) + } + case key.Event: + if e.Code != key.CodeSpacebar { + break + } + if down := e.Direction == key.DirPress; down || e.Direction == key.DirRelease { + game.Press(down) + } + } + } + }) +} + +var ( + startTime = time.Now() + images *glutil.Images + eng sprite.Engine + scene *sprite.Node + game *Game +) + +func onStart(glctx gl.Context) { + images = glutil.NewImages(glctx) + eng = glsprite.Engine(images) + game = NewGame() + scene = game.Scene(eng) +} + +func onStop() { + eng.Release() + images.Release() + game = nil +} + +func onPaint(glctx gl.Context, sz size.Event) { + glctx.ClearColor(1, 1, 1, 1) + glctx.Clear(gl.COLOR_BUFFER_BIT) + now := clock.Time(time.Since(startTime) * 60 / time.Second) + game.Update(now) + eng.Render(scene, now, sz) +} diff --git a/example/flappy/main_x.go b/example/flappy/main_x.go new file mode 100644 index 0000000..3d440e7 --- /dev/null +++ b/example/flappy/main_x.go @@ -0,0 +1,10 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !darwin,!linux + +package main + +func main() { +}