Created
June 30, 2016 11:02
-
-
Save tenntenn/fe7a0c3701eb11a926fc00896c1f8ba8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"os" | |
"github.com/nsf/termbox-go" | |
"stepX/engine" | |
"stepX/game" | |
"sync" | |
) | |
type ConsoleBattleSceneFactory struct { | |
*game.BattleSceneFactory | |
} | |
func (f *ConsoleBattleSceneFactory) Create() *engine.Scene { | |
s := f.BattleSceneFactory.Create() | |
s.Renderer = &ConsleRenderer{} | |
return s | |
} | |
var playerMap = map[game.Direction]string{ | |
game.DirUp: "^", | |
game.DirRight: ">", | |
game.DirDown: "v", | |
game.DirLeft: "<", | |
} | |
type ConsleRenderer struct{} | |
func (r *ConsleRenderer) Render(c engine.Camera, o engine.GameObject) { | |
switch o := o.(type) { | |
case *game.Player: | |
x, y := o.Position() | |
printText(x, y, playerMap[o.Direction], termbox.ColorDefault, termbox.ColorDefault) | |
case *game.Bullet: | |
x, y := o.Position() | |
printText(x, y, "*", termbox.ColorRed, termbox.ColorDefault) | |
} | |
} | |
func printText(x0, y0 int, text string, fg, bg termbox.Attribute) { | |
for i, c := range text { | |
termbox.SetCell(x0+i, y0, c, fg, bg) | |
} | |
} | |
func waitEvents() { | |
for { | |
switch ev := termbox.PollEvent(); ev.Type { | |
case termbox.EventKey: | |
switch ev.Key { | |
case termbox.KeyEsc: | |
os.Exit(0) | |
case termbox.KeyArrowUp: | |
setInput(game.InputUp) | |
case termbox.KeyArrowRight: | |
setInput(game.InputRight) | |
case termbox.KeyArrowDown: | |
setInput(game.InputDown) | |
case termbox.KeyArrowLeft: | |
setInput(game.InputLeft) | |
case termbox.KeySpace: | |
setInput(game.InputAttack) | |
} | |
} | |
} | |
} | |
func setInput(v int) { | |
m.RLock() | |
defer m.RUnlock() | |
currentScene.SetInput(v) | |
} | |
var currentScene *engine.Scene | |
var m sync.RWMutex | |
func main() { | |
err := termbox.Init() | |
if err != nil { | |
panic(err) | |
} | |
defer termbox.Close() | |
g := engine.New() | |
g.FPS = 10 | |
g.SceneFactories = append(g.SceneFactories, | |
&ConsoleBattleSceneFactory{ | |
&game.BattleSceneFactory{}, | |
}, | |
) | |
g.OnChangeScene = engine.EventListenerFunc(func(args ...interface{}) { | |
m.Lock() | |
defer m.Unlock() | |
currentScene = g.Scene() | |
}) | |
g.BeforeStart = engine.EventListenerFunc(func(args ...interface{}) { | |
go waitEvents() | |
}) | |
g.BeforeRender = engine.EventListenerFunc(func(args ...interface{}) { | |
termbox.Clear(termbox.ColorDefault, termbox.ColorDefault) | |
}) | |
g.AfterRender = engine.EventListenerFunc(func(args ...interface{}) { | |
if len(args) <= 0 { | |
return | |
} | |
if s, ok := args[0].(*engine.Scene); ok { | |
termbox.Flush() | |
s.ClearInput() | |
} | |
}) | |
g.Start() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment