|
|
@ -0,0 +1,98 @@ |
|
|
|
|
|
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) |
|
|
|
|
|
} |