-
Notifications
You must be signed in to change notification settings - Fork 2
/
scheduler.go
237 lines (192 loc) · 5.33 KB
/
scheduler.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
// 调度器, 这里是一个 MVC 的模型,
// 调度器相当于 C,
// 每个需要显示的页面是 View
// 业务模型,游戏逻辑 是 model
package main
import (
"log"
"sync"
"github.com/ghj1976/HuaRongDao/level"
"github.com/ghj1976/HuaRongDao/model"
"github.com/ghj1976/HuaRongDao/view"
"golang.org/x/mobile/event/size"
"golang.org/x/mobile/event/touch"
"golang.org/x/mobile/exp/f32"
"golang.org/x/mobile/exp/sprite"
"golang.org/x/mobile/exp/sprite/clock"
)
// CurrView 枚举对象,会出现的几个视图
type CurrView byte // 当前正在显示的View
const (
currNoView CurrView = iota
currSplashView
currLoadingView
currListView
currGameView
)
var (
gameScene *sprite.Node // 游戏的绘图根节点, 不同 view 的都是绘制在这个下面的。
splashViewNode *sprite.Node
loadingViewNode *sprite.Node
currView CurrView // 当前是哪个视图
gv *view.GameView // 当前的游戏视图
listv *view.ListView // 当前列表视图
rwMutex *sync.RWMutex // 读写锁
listvPage int // 列表页当前在第几页
)
// Init 初始化, 在 onStart 中完成,
// 手机上再次打开时,如果没有被回收,也会再次进入这里。
func Init(eng sprite.Engine) {
currView = currNoView
rwMutex = new(sync.RWMutex)
gameScene = &sprite.Node{}
eng.Register(gameScene)
eng.SetTransform(gameScene, f32.Affine{
{1, 0, 0},
{0, 1, 0},
})
// 开协程 加载 loading 页
go load(eng)
}
// load 异步协程加载
func load(eng sprite.Engine) {
// 加载 启动页
splashViewNode = view.LoadSplashView(eng)
rwMutex.Lock()
gameScene.AppendChild(splashViewNode)
rwMutex.Unlock()
currView = currSplashView
log.Println("启动页加载完成。")
loadingViewNode = view.LoadLoadingView(eng)
rwMutex.Lock()
gameScene.AppendChild(loadingViewNode)
rwMutex.Unlock()
currView = currLoadingView
log.Println("Loading 页加载完成。")
// 游戏列表页面了,
lm := model.NewListModel(1)
listv = view.NewListView(lm, eng)
// // 这里简单期间, 加载具体一个游戏。
// lv := level.NewLevelInfo(1, "横刀立马", 81, "经典布局",
// ` 赵曹曹马
// 赵曹曹马
// 黄关关张
// 黄甲乙张
// 丙一一丁
// `, level.LevelNotPass)
// gm := model.NewGameModel(lv)
// gv = view.NewGameView(gm, eng)
if gameScene == nil {
log.Println("gameScene nil")
return
}
rwMutex.Lock()
if splashViewNode != nil {
gameScene.RemoveChild(splashViewNode)
}
if loadingViewNode != nil {
gameScene.RemoveChild(loadingViewNode)
}
gameScene.AppendChild(listv.RootViewNode)
rwMutex.Unlock()
currView = currListView
log.Println("游戏列表 页加载完成。")
// 进入死循环,接收chan消息,看是否要切换 游戏页 还是游戏列表页。
for {
select {
case switchView := <-view.SwitchingChan:
if switchView.SwitchingType == view.List2Game {
listViewLoadGameView(switchView.ListCurrPage, switchView.Level)
} else {
gameViewReturnListView()
}
}
}
}
// Update 更新绘图信息
func Update(now clock.Time) {
// 把 update 透传给需要的当前视图
if currView == currGameView {
gv.Update(now)
} else if currView == currListView {
listv.Update(now)
} else {
}
}
// Press 更新拖动事件
func Press(touchEvent touch.Event) {
// 把 touch事件 透传
if currView == currGameView {
gv.Press(touchEvent)
} else if currView == currListView {
listv.Press(touchEvent)
} else {
}
}
// ScreenSizeChange 屏幕尺寸发生变化
func ScreenSizeChange(sz size.Event) {
model.InitScreenSize(sz) // 记录尺寸变化
if currView == currGameView {
// gv
} else if currView == currListView {
listv.OnScreenSizeChange(sz, model.GetDisplayMultiple())
} else {
}
}
// listViewLoadGameView 从游戏列表页加载游戏视图
// listCurrPage 列表页当前在哪页,用于返回时返回该页
// level 要加载的关卡信息
func listViewLoadGameView(listCurrPage int, level *level.LevelInfo) {
listvPage = listCurrPage
// 显示进度中页面
rwMutex.Lock()
if listv != nil && listv.RootViewNode != nil {
//listv.ClearRootViewChildNodes()
gameScene.RemoveChild(listv.RootViewNode)
}
if splashViewNode != nil {
gameScene.AppendChild(splashViewNode)
}
rwMutex.Unlock()
gm := model.NewGameModel(level) // 关卡逻辑对象
if gv == nil {
gv = view.NewGameView(gm, eng)
} else {
gv.Reset(gm)
}
// 切换成列表页
rwMutex.Lock()
if splashViewNode != nil {
gameScene.RemoveChild(splashViewNode)
}
gameScene.AppendChild(gv.RootViewNode)
rwMutex.Unlock()
// 切换成功,更新指向
currView = currGameView
log.Println("游戏页加载完成。")
}
// gameViewReturnListView 从游戏页面返回游戏列表
func gameViewReturnListView() {
// 显示进度中页面
rwMutex.Lock()
if gv != nil && gv.RootViewNode != nil {
gameScene.RemoveChild(gv.RootViewNode)
}
if splashViewNode != nil {
gameScene.AppendChild(splashViewNode)
}
rwMutex.Unlock()
// 由于后续会涉及到过关数据的变化,所以重新构造一个列表对象
lm := model.NewListModel(listvPage)
listv.Reset(lm)
// 切换成列表页
rwMutex.Lock()
if splashViewNode != nil {
gameScene.RemoveChild(splashViewNode)
}
gameScene.AppendChild(listv.RootViewNode)
rwMutex.Unlock()
// 切换成功,更新指向
currView = currListView
log.Println("游戏列表 页加载完成。")
}