// 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) }