Skip to content

Instantly share code, notes, and snippets.

@tenntenn
Created June 30, 2016 11:02
Show Gist options
  • Save tenntenn/fe7a0c3701eb11a926fc00896c1f8ba8 to your computer and use it in GitHub Desktop.
Save tenntenn/fe7a0c3701eb11a926fc00896c1f8ba8 to your computer and use it in GitHub Desktop.
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