this repo has no description

add screenmanager poc

voigt.tngl.sh ab56031d f6c40d91

verified
+357
+19
screenmanager/README.md
··· 1 + # Screen Manager 2 + 3 + This is an example on how to use multiple screens within a game. 4 + 5 + Each screen owns its own 6 + 7 + * `Update()` logic 8 + * `Render()` logic 9 + * `OnEnter()` logic 10 + 11 + A possible extension would be an `OnExit()` logic. 12 + 13 + ## Screens 14 + 15 + - `ScreenGame`: The main game screen/Start Screen. Obviously this is up to you whether you want to have a splash screen here or draw the main game. 16 + - `ScreenE`: The screen for the "E" key. 17 + - `ScreenS`: The screen for the "S" key. 18 + - `ScreenN`: The screen for the "N" key. 19 + - `ScreenW`: The screen for the "W" key.
screenmanager/eg_6x10.fff

This is a binary file and will not be displayed.

+8
screenmanager/firefly.toml
··· 1 + author_id = "voigt" 2 + app_id = "screenmanager" 3 + author_name = "Christoph Voigt" 4 + app_name = "Screenmanager" 5 + lang = "go" 6 + 7 + [files] 8 + font = { path = "eg_6x10.fff", url = "https://fonts.fireflyzero.com/fonts/ascii/eg_6x10.fff" }
+49
screenmanager/game.go
··· 1 + package main 2 + 3 + import ( 4 + "github.com/firefly-zero/firefly-go/firefly" 5 + ff "github.com/firefly-zero/firefly-go/firefly" 6 + ) 7 + 8 + type Game struct { 9 + Screen ScreenManager 10 + } 11 + 12 + func (g *Game) OnEnter() { 13 + } 14 + 15 + func (g *Game) Draw() { 16 + xCenter := GetTextCenterAtX(firefly.Width, ScreenGame.String(), FONT) 17 + 18 + firefly.DrawText( 19 + ScreenGame.String(), 20 + FONT, 21 + firefly.Point{X: xCenter, Y: 10}, 22 + firefly.ColorWhite, 23 + ) 24 + } 25 + 26 + func (g *Game) HandleInput() { 27 + buttons := firefly.ReadButtons(ff.Combined) 28 + 29 + if buttons.N { 30 + GAME.Screen.SetScreen(ScreenN) 31 + } 32 + if buttons.E { 33 + GAME.Screen.SetScreen(ScreenE) 34 + } 35 + if buttons.S { 36 + GAME.Screen.SetScreen(ScreenS) 37 + } 38 + if buttons.W { 39 + GAME.Screen.SetScreen(ScreenW) 40 + } 41 + } 42 + 43 + func (g *Game) Update() { 44 + g.HandleInput() 45 + } 46 + 47 + func (g *Game) Render() { 48 + g.Draw() 49 + }
+7
screenmanager/go.mod
··· 1 + module screenmanager 2 + 3 + go 1.25.7 4 + 5 + require github.com/firefly-zero/firefly-go v0.11.0 6 + 7 + require github.com/orsinium-labs/tinymath v1.1.0 // indirect
+4
screenmanager/go.sum
··· 1 + github.com/firefly-zero/firefly-go v0.11.0 h1:+Y5EE0sXxjylZo9H3U3+VpPU1bCXdq0q7xnrpn207pg= 2 + github.com/firefly-zero/firefly-go v0.11.0/go.mod h1:osit9/kxcqSUBVozePb7LNzOHy3FQ7ii1Z0mL82pWu0= 3 + github.com/orsinium-labs/tinymath v1.1.0 h1:KomdsyLHB7vE3f1nRAJF2dyf1m/gnM2HxfTeV1vS5UA= 4 + github.com/orsinium-labs/tinymath v1.1.0/go.mod h1:WPXX6ei3KSXG7JfA03a+ekCYaY9SWN4I+JRl2p6ck+A=
+7
screenmanager/helpers.go
··· 1 + package main 2 + 3 + import "github.com/firefly-zero/firefly-go/firefly" 4 + 5 + func GetTextCenterAtX(x int, text string, font firefly.Font) int { 6 + return (x / 2) - (font.LineWidth(text) / 2) 7 + }
+24
screenmanager/main.go
··· 1 + package main 2 + 3 + import "github.com/firefly-zero/firefly-go/firefly" 4 + 5 + var ( 6 + FONT firefly.Font 7 + GAME = Game{} 8 + ) 9 + 10 + func init() { 11 + firefly.Boot = boot 12 + firefly.Update = GAME.Screen.Update 13 + firefly.Render = GAME.Screen.Render 14 + } 15 + 16 + func boot() { 17 + FONT = firefly.LoadFile("font", nil).Font() 18 + 19 + GAME.Screen.Register(ScreenGame, &GAME) 20 + GAME.Screen.Register(ScreenE, &EScreen{}) 21 + GAME.Screen.Register(ScreenS, &SScreen{}) 22 + GAME.Screen.Register(ScreenN, &NScreen{}) 23 + GAME.Screen.Register(ScreenW, &WScreen{}) 24 + }
+43
screenmanager/screen_e.go
··· 1 + package main 2 + 3 + import firefly "github.com/firefly-zero/firefly-go/firefly" 4 + 5 + type EScreen struct{} 6 + 7 + func (es *EScreen) OnEnter() {} 8 + 9 + func (es *EScreen) Draw() { 10 + xCenter := GetTextCenterAtX(firefly.Width, ScreenE.String(), FONT) 11 + 12 + firefly.DrawText( 13 + ScreenE.String(), 14 + FONT, 15 + firefly.Point{X: xCenter, Y: 10}, 16 + firefly.ColorWhite, 17 + ) 18 + } 19 + 20 + func (es *EScreen) HandleInput() { 21 + buttons := firefly.ReadButtons(firefly.Combined) 22 + 23 + if buttons.N { 24 + GAME.Screen.SetScreen(ScreenN) 25 + } 26 + if buttons.E { 27 + GAME.Screen.SetScreen(ScreenE) 28 + } 29 + if buttons.S { 30 + GAME.Screen.SetScreen(ScreenS) 31 + } 32 + if buttons.W { 33 + GAME.Screen.SetScreen(ScreenW) 34 + } 35 + } 36 + 37 + func (es *EScreen) Update() { 38 + es.HandleInput() 39 + } 40 + 41 + func (es *EScreen) Render() { 42 + es.Draw() 43 + }
+67
screenmanager/screen_manager.go
··· 1 + package main 2 + 3 + import ( 4 + "github.com/firefly-zero/firefly-go/firefly" 5 + ff "github.com/firefly-zero/firefly-go/firefly" 6 + ) 7 + 8 + type ScreenID uint8 9 + 10 + const ( 11 + ScreenGame ScreenID = iota 12 + ScreenE 13 + ScreenS 14 + ScreenN 15 + ScreenW 16 + ) 17 + 18 + func (s ScreenID) String() string { 19 + switch s { 20 + case ScreenGame: 21 + return "Start Screen" 22 + case ScreenE: 23 + return "E-Screen" 24 + case ScreenS: 25 + return "S-Screen" 26 + case ScreenN: 27 + return "N-Screen" 28 + case ScreenW: 29 + return "W-Screen" 30 + default: 31 + return "Start Screen" 32 + } 33 + } 34 + 35 + type IScreen interface { 36 + Update() 37 + Render() 38 + OnEnter() 39 + } 40 + 41 + type ScreenManager struct { 42 + current ScreenID 43 + screens map[ScreenID]IScreen 44 + } 45 + 46 + func (sm *ScreenManager) Register(id ScreenID, s IScreen) { 47 + if sm.screens == nil { 48 + sm.screens = make(map[ScreenID]IScreen) 49 + } 50 + ff.LogDebug("Register " + id.String()) 51 + sm.screens[id] = s 52 + } 53 + 54 + func (sm *ScreenManager) SetScreen(id ScreenID) { 55 + sm.current = id 56 + ff.LogDebug("Setting Screen " + id.String()) 57 + sm.screens[id].OnEnter() 58 + } 59 + 60 + func (sm *ScreenManager) Update() { 61 + sm.screens[sm.current].Update() 62 + } 63 + 64 + func (sm *ScreenManager) Render() { 65 + firefly.ClearScreen(firefly.ColorBlack) 66 + sm.screens[sm.current].Render() 67 + }
+43
screenmanager/screen_n.go
··· 1 + package main 2 + 3 + import firefly "github.com/firefly-zero/firefly-go/firefly" 4 + 5 + type NScreen struct{} 6 + 7 + func (ns *NScreen) OnEnter() {} 8 + 9 + func (ns *NScreen) Draw() { 10 + xCenter := GetTextCenterAtX(firefly.Width, ScreenN.String(), FONT) 11 + 12 + firefly.DrawText( 13 + ScreenN.String(), 14 + FONT, 15 + firefly.Point{X: xCenter, Y: 10}, 16 + firefly.ColorWhite, 17 + ) 18 + } 19 + 20 + func (ns *NScreen) HandleInput() { 21 + buttons := firefly.ReadButtons(firefly.Combined) 22 + 23 + if buttons.N { 24 + GAME.Screen.SetScreen(ScreenN) 25 + } 26 + if buttons.E { 27 + GAME.Screen.SetScreen(ScreenE) 28 + } 29 + if buttons.S { 30 + GAME.Screen.SetScreen(ScreenS) 31 + } 32 + if buttons.W { 33 + GAME.Screen.SetScreen(ScreenW) 34 + } 35 + } 36 + 37 + func (ns *NScreen) Update() { 38 + ns.HandleInput() 39 + } 40 + 41 + func (ns *NScreen) Render() { 42 + ns.Draw() 43 + }
+43
screenmanager/screen_s.go
··· 1 + package main 2 + 3 + import firefly "github.com/firefly-zero/firefly-go/firefly" 4 + 5 + type SScreen struct{} 6 + 7 + func (ss *SScreen) OnEnter() {} 8 + 9 + func (ss *SScreen) Draw() { 10 + xCenter := GetTextCenterAtX(firefly.Width, ScreenS.String(), FONT) 11 + 12 + firefly.DrawText( 13 + ScreenS.String(), 14 + FONT, 15 + firefly.Point{X: xCenter, Y: 10}, 16 + firefly.ColorWhite, 17 + ) 18 + } 19 + 20 + func (ss *SScreen) HandleInput() { 21 + buttons := firefly.ReadButtons(firefly.Combined) 22 + 23 + if buttons.N { 24 + GAME.Screen.SetScreen(ScreenN) 25 + } 26 + if buttons.E { 27 + GAME.Screen.SetScreen(ScreenE) 28 + } 29 + if buttons.S { 30 + GAME.Screen.SetScreen(ScreenS) 31 + } 32 + if buttons.W { 33 + GAME.Screen.SetScreen(ScreenW) 34 + } 35 + } 36 + 37 + func (ss *SScreen) Update() { 38 + ss.HandleInput() 39 + } 40 + 41 + func (ss *SScreen) Render() { 42 + ss.Draw() 43 + }
+43
screenmanager/screen_w.go
··· 1 + package main 2 + 3 + import firefly "github.com/firefly-zero/firefly-go/firefly" 4 + 5 + type WScreen struct{} 6 + 7 + func (ws *WScreen) OnEnter() {} 8 + 9 + func (ws *WScreen) Draw() { 10 + xCenter := GetTextCenterAtX(firefly.Width, ScreenW.String(), FONT) 11 + 12 + firefly.DrawText( 13 + ScreenW.String(), 14 + FONT, 15 + firefly.Point{X: xCenter, Y: 10}, 16 + firefly.ColorWhite, 17 + ) 18 + } 19 + 20 + func (ws *WScreen) HandleInput() { 21 + buttons := firefly.ReadButtons(firefly.Combined) 22 + 23 + if buttons.N { 24 + GAME.Screen.SetScreen(ScreenN) 25 + } 26 + if buttons.E { 27 + GAME.Screen.SetScreen(ScreenE) 28 + } 29 + if buttons.S { 30 + GAME.Screen.SetScreen(ScreenS) 31 + } 32 + if buttons.W { 33 + GAME.Screen.SetScreen(ScreenW) 34 + } 35 + } 36 + 37 + func (ws *WScreen) Update() { 38 + ws.HandleInput() 39 + } 40 + 41 + func (ws *WScreen) Render() { 42 + ws.Draw() 43 + }