From 4695338323e3c07f8ce70cb1237ddd299cfcaacd Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Thu, 6 Jun 2024 19:55:16 +0200 Subject: [PATCH] added key bindings help screen, reachable via menu --- src/config.go | 19 +++++++++ src/game.go | 1 + src/keybindings.go | 98 ++++++++++++++++++++++++++++++++++++++++++++++ src/menu.go | 6 +++ src/scene.go | 1 + 5 files changed, 125 insertions(+) create mode 100644 src/keybindings.go diff --git a/src/config.go b/src/config.go index 09cdd21..672f074 100644 --- a/src/config.go +++ b/src/config.go @@ -52,6 +52,25 @@ const ( DEFAULT_GEOM = "640x384" ) +const KEYBINDINGS string = ` +- SPACE: pause or resume the game +- N: while game is paused: forward one step +- PAGE UP: speed up +- PAGE DOWN: slow down +- MOUSE WHEEL: zoom in or out +- LEFT MOUSE BUTTON: use to drag canvas, keep clicked and move mouse +- I: enter "insert" (draw) mode: use left mouse to set cells alife and right + button to dead. Leave with "space". While in insert mode, use middle mouse + button to drag grid. +- R: reset to 1:1 zoom +- ESCAPE: open menu, o: open options menu +- S: save game state to file (can be loaded with -l) +- C: enter mark mode. Mark a rectangle with the mouse, when you + release the mouse buttonx it is being saved to an RLE file +- D: toggle debug output +- Q: quit game +` + func (config *Config) SetupCamera() { config.Zoomfactor = DEFAULT_ZOOMFACTOR diff --git a/src/game.go b/src/game.go index a7313f4..e5b229f 100644 --- a/src/game.go +++ b/src/game.go @@ -26,6 +26,7 @@ func NewGame(config *Config, startscene SceneName) *Game { game.Scenes[Play] = NewPlayScene(game, config) game.Scenes[Menu] = NewMenuScene(game, config) game.Scenes[Options] = NewOptionsScene(game, config) + game.Scenes[Keybindings] = NewKeybindingsScene(game, config) // setup environment ebiten.SetWindowSize(game.ScreenWidth, game.ScreenHeight) diff --git a/src/keybindings.go b/src/keybindings.go new file mode 100644 index 0000000..db68f60 --- /dev/null +++ b/src/keybindings.go @@ -0,0 +1,98 @@ +package main + +import ( + "image/color" + + "github.com/ebitenui/ebitenui" + "github.com/ebitenui/ebitenui/widget" + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/inpututil" +) + +type SceneKeybindings struct { + Game *Game + Config *Config + Next SceneName + Prev SceneName + Whoami SceneName + Ui *ebitenui.UI + FontColor color.RGBA + First bool +} + +func NewKeybindingsScene(game *Game, config *Config) Scene { + scene := &SceneKeybindings{ + Whoami: Keybindings, + Game: game, + Next: Keybindings, + Config: config, + FontColor: color.RGBA{255, 30, 30, 0xff}, + } + + scene.Init() + + return scene +} + +func (scene *SceneKeybindings) GetNext() SceneName { + return scene.Next +} + +func (scene *SceneKeybindings) SetPrevious(prev SceneName) { + scene.Prev = prev +} + +func (scene *SceneKeybindings) ResetNext() { + scene.Next = scene.Whoami +} + +func (scene *SceneKeybindings) SetNext(next SceneName) { + scene.Next = next +} + +func (scene *SceneKeybindings) Update() error { + scene.Ui.Update() + + if inpututil.IsKeyJustPressed(ebiten.KeyEscape) || inpututil.IsKeyJustPressed(ebiten.KeyQ) { + scene.Config.DelayedStart = false + scene.Leave() + } + + return nil + +} + +func (scene *SceneKeybindings) IsPrimary() bool { + return false +} + +func (scene *SceneKeybindings) Draw(screen *ebiten.Image) { + scene.Ui.Draw(screen) +} + +func (scene *SceneKeybindings) Leave() { + scene.SetNext(Play) +} + +func (scene *SceneKeybindings) Init() { + rowContainer := NewRowContainer("Key Bindings") + + bindings := widget.NewText( + widget.TextOpts.WidgetOpts(widget.WidgetOpts.LayoutData(widget.RowLayoutData{ + Stretch: true, + })), + widget.TextOpts.Text(KEYBINDINGS, *FontRenderer.FontSmall, color.NRGBA{0xdf, 0xf4, 0xff, 0xff})) + + cancel := NewMenuButton("Back", + func(args *widget.ButtonClickedEventArgs) { + scene.Leave() + }) + + rowContainer.AddChild(bindings) + rowContainer.AddChild(cancel) + + scene.Ui = &ebitenui.UI{ + Container: rowContainer.Container(), + } + +} diff --git a/src/menu.go b/src/menu.go index 0c4d8db..b8e4f8e 100644 --- a/src/menu.go +++ b/src/menu.go @@ -104,6 +104,11 @@ func (scene *SceneMenu) Init() { scene.SetNext(Options) }) + bindings := NewMenuButton("Show Key Bindings", + func(args *widget.ButtonClickedEventArgs) { + scene.SetNext(Keybindings) + }) + separator1 := NewSeparator(3) separator2 := NewSeparator(3) separator3 := NewSeparator(10) @@ -123,6 +128,7 @@ func (scene *SceneMenu) Init() { rowContainer.AddChild(separator1) rowContainer.AddChild(options) rowContainer.AddChild(copy) + rowContainer.AddChild(bindings) rowContainer.AddChild(separator2) rowContainer.AddChild(cancel) rowContainer.AddChild(separator3) diff --git a/src/scene.go b/src/scene.go index 86caf39..ac1818c 100644 --- a/src/scene.go +++ b/src/scene.go @@ -24,4 +24,5 @@ const ( Menu = iota // main top level menu Play // actual playing happens here Options + Keybindings )