標籤:
本文主要討論遊戲規則邏輯,具體繪製技術請參看相關文章:
gomoblie flappy 源碼分析:圖片素材和大小的處理
http://www.cnblogs.com/ghj1976/p/5222289.html
繪製時間間隔控制
繪製是按照 60 FPS 的節奏繪製的(即每秒鐘 60 幀), FPS : frames per second(幀率)
代碼中的控制注意是通過 golang.org/x/mobile/exp/sprite/clock 下的 Time 控制的。
Time實際是 int32 的別名
type Time int32
應用程式初始化好,可以開始繪圖時 這個值初始化成 FPS 的時間間隔。
這裡 now 計算的是到現在為止, 有多少個 1/60 秒(time for 60 FPS)。
然後在 game.update 中傳入
只有滿足 FPS 時才重新計算, 否則不重新計算。
g.lastCale 也是 clock.Time 類型。
至於 paint.Event 事件被調起的頻率,請參考這篇文字: http://www.cnblogs.com/ghj1976/p/5230576.html
簡單來說,螢幕解析度為60Hz, 那每秒鐘 scan 60 次, 每次輪到時,就是下面的邏輯。
情境繪製
整個情境是繪製在 19*16 個地磚的地區, 地鼠是 2*2 地磚大小, 每個地磚是 16pt*16pt。 這樣繪圖區域就是 304pt*256pt 。
要能在手機上顯示下完整高度, 螢幕的高度需要是 305pt/72*2.54 = 10.76 cm , 寬度由於不足,可以顯示部分,但是美觀期間,不應該大於 256pt/72*2.54 = 9.03 cm ,否則會螢幕裡有部分沒有繪圖。
注意, Android 裝置的 pt 值,並不是精準的 1/72 英寸, 有關原因請看: http://www.cnblogs.com/ghj1976/p/5238193.html
整個繪製的邏輯如:
從上到下是邏輯順序:
整個情境以 初始化速度為每 1/60 秒 1pt,每次增加 0.001 的速度在不斷加速移動。
如, 每次 reset 遊戲時, 捲軸速度為 1pt;
遊戲沒結束前, 每次加速 0.001,這樣遊戲捲軸越來越快, 難度越來越難。
每當捲軸距離超過一個瓷磚的長度, 觸發產生新瓷磚的邏輯。
注意, g.scroll.x 這個值最大是一個瓷磚的長度, 再長就自動減去,見如下代碼:
精靈的位置繪製
flappy 這個遊戲有三類元素需要繪製,他們繪製的位置邏輯資訊如下:
gopher 精靈的初始位置
gopher 的大小是 32pt*32pt , 它的位置代碼是在下面函數中定義的:
func (g *Game) Scene(eng sprite.Engine) *sprite.Node {
X軸座標
gopher 的左上方點的x軸座標是固定的: 2pt 的位置,計算公式如下:
tileWidth*(gopherTile-1) + tileWidth/8
其中的參數說明如下:
- gopherTile: Gopher站在那塊磚上,注意這是從0開始的索引,1代表第二塊。 地鼠顯示的位置,判斷地鼠是否被撞死了、地鼠跳起來後在落地的位置等資訊都依賴這個全域常量進行計算。
- tileWidth : 每塊地磚的寬度。
從上可知,地鼠站在第一塊地磚的 1/8 處。
Y軸座標:
繪地鼠圖的y軸座標計算公式為: g.gopher.y - tileHeight + tileHeight/4
遊戲初始時,地鼠的 y 軸被定義在 0 這個位置。 func (g *Game) reset() {
g.gopher.y = 0
地鼠站的位置需要減去地磚的 3/4 的高度,這樣看起來地鼠是站在草上。
注意:減去 3/4 的地磚高度,只是繪製的時候繪效果用的, 跟計算精靈的高度無關。
精靈跳起相關
每當有觸屏事件或者空格鍵按下時,觸發精靈跳起。
當這個動作發生時,如果精靈在地面, 則起跳加速度為 –5 ,
如果精靈在飛起狀態, 則 加速度為 -1.5(這個每次蹦起只能觸發一次,蹦起時用過一次後 g.gopher.flapped = true, 在落地時 g.gopher.flapped = false) 。
注意,不按時,加速度立即變成 0 。
而每次計算精靈資訊時, 則需要根據重力減少 加速度, 重力的值為 0.1 。
按照這個邏輯, 如果只按一次的話, 最高能蹦 5+4.9+4.8+…+0.2+0.1 = 127.5 pt 高。 如果最牛操作,在蹦到頂點時再次按下,會再蹦起 1.5+1.4+1.3+…+0.2+0.1=12 pt
是否落地的判斷
注意:繪製時,會在精靈高度上減去 3/4 的地磚高度,只是繪製的時候繪效果用的, 跟計算精靈的高度無關。而且繪製時,不管是不是在地面,都會減去的。
精靈死亡的判斷
精靈是否死亡,是在背景轉換時判斷的,而不是精靈自身跳起、落地時判斷的。
每次需要新加一塊地磚時,先做地磚增加邏輯,然後判斷是否死亡。
死亡後,捲軸速度逐步降低到停止。
當精靈撞到高於地磚 1/3 高度時,觸發死亡。
climbGrace = tileHeight / 3
精靈死亡的動畫
每次完成判斷死亡後, 精靈標誌死亡,然後讓精靈跳起做死亡動畫,跳起速度是之前正常跳起速度的 1.5 倍。
精靈的跳起 y 軸變換邏輯跟之前一樣,只是加速度變大。
顯示時,顯示死亡圖片, 同時做死亡旋轉動畫。
具體的旋轉動畫, 先按照時間逐步放大,同時移動中心點,然後旋轉,然後移動回之前座標系。
從死亡開始, 4秒後 遊戲 reset。
gomoblie flappy 源碼分析:遊戲邏輯