| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- // 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.
- //go: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)
- }
|