/
game_state_machine.go
83 lines (70 loc) · 2.55 KB
/
game_state_machine.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package game_manager
import (
// "fmt"
)
type GameStateMachine struct {
game *Game
gameStates []GameState
}
//*****************************************************************************
// NewGameStateMachine
//*****************************************************************************
func NewGameStateMachine(game *Game) *GameStateMachine {
return &GameStateMachine{game: game}
}
//*****************************************************************************
// pushState
//*****************************************************************************
func (gsm *GameStateMachine) pushState(state GameState) {
gsm.gameStates = append(gsm.gameStates, state)
state.onEnter(gsm.game)
}
//*****************************************************************************
// popState
//*****************************************************************************
func (gsm *GameStateMachine) popState() {
if len(gsm.gameStates) > 0 {
gsm.gameStates[len(gsm.gameStates)-1].onExit(gsm.game)
gsm.gameStates = gsm.gameStates[:len(gsm.gameStates)-1]
}
gsm.gameStates[len(gsm.gameStates)-1].resume(gsm.game)
}
//*****************************************************************************
// changeState
//*****************************************************************************
func (gsm *GameStateMachine) changeState(state GameState) {
if len(gsm.gameStates) > 0 {
if gsm.gameStates[len(gsm.gameStates)-1].getStateID() == state.getStateID() {
return
}
gsm.gameStates[len(gsm.gameStates)-1].onExit(gsm.game)
gsm.gameStates = gsm.gameStates[:len(gsm.gameStates)-1]
}
state.onEnter(gsm.game)
gsm.gameStates = append(gsm.gameStates, state)
}
//*****************************************************************************
// clean
//*****************************************************************************
func (gsm *GameStateMachine) clean() {
if len(gsm.gameStates) > 0 {
gsm.gameStates[len(gsm.gameStates)-1].onExit(gsm.game)
gsm.gameStates = nil
}
}
//*****************************************************************************
// update
//*****************************************************************************
func (gsm *GameStateMachine) update() {
if len(gsm.gameStates) > 0 {
gsm.gameStates[len(gsm.gameStates)-1].update(gsm.game)
}
}
//*****************************************************************************
// render
//*****************************************************************************
func (gsm *GameStateMachine) render() {
if len(gsm.gameStates) > 0 {
gsm.gameStates[len(gsm.gameStates)-1].render(gsm.game)
}
}