package lib import ( "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/ebitenutil" "github.com/hajimehoshi/ebiten/v2/inpututil" ) // Scenes: Main Menu // Game Mode //Scene - is the highest-level element of state the game can be in. type GameEvent struct { Type int } type HandleResult int const ( EventNoOp int = iota EventKeyRelease ) const ( DoNothing HandleResult = iota EndProgram ) type Scene interface { HandleEvent(*GameEvent) HandleResult Draw(screen *ebiten.Image) } // Implements ebiten.Game type TetrisGame struct { activeScene Scene } type MainMenuScene struct { selections [1]string currentSelectionIndex int } func (menu *MainMenuScene) HandleEvent(e *GameEvent) HandleResult { if e.Type == 1 { if menu.selections[menu.currentSelectionIndex] == "Quit" { return EndProgram } } return DoNothing } func (menu *MainMenuScene) Draw(screen *ebiten.Image) { ebitenutil.DebugPrint(screen, menu.selections[menu.currentSelectionIndex]) } func NewGame() (*TetrisGame, error) { return &TetrisGame{ activeScene: &MainMenuScene{ selections: [1]string{"Quit"}, currentSelectionIndex: 0, }, }, nil } func (g *TetrisGame) Layout(outsideWidth, outsideHeight int) (int, int) { //TODO: Make this do whatever it is supposed to do : resizing etc return 640, 480 } func (g *TetrisGame) Update() error { //while there are events var keys []ebiten.Key keys = inpututil.AppendJustReleasedKeys(keys) var event GameEvent if len(keys) > 0 { event = GameEvent{Type: EventKeyRelease} } else { event = GameEvent{Type: EventNoOp} } switch g.activeScene.HandleEvent(&event) { case EndProgram: return ebiten.Termination case DoNothing: return nil default: return nil } return nil } func (g *TetrisGame) Draw(screen *ebiten.Image) { g.activeScene.Draw(screen) }