gomoblie flappy 源碼分析:遊戲邏輯

來源:互聯網
上載者:User

標籤:

本文主要討論遊戲規則邏輯,具體繪製技術請參看相關文章:

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
 
  • g.gopher.y
遊戲初始時,地鼠的 y 軸被定義在 0 這個位置。 func (g *Game) reset() {
g.gopher.y = 0
  • tileHeight    地磚的高度。
地鼠站的位置需要減去地磚的 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 源碼分析:遊戲邏輯

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.