這款游戲的起源是越南獨立開發者開發的手機游戲,短時間內占據了全球各大手機軟體商店免費排行榜的第一位,游戲中玩家控制一只小鳥飛過一個個柱子的間隙,飛的越遠分數越高,看玩家能使小鳥在空中堅持飛多久,初始界面如圖1所示,
完整原始碼+檔案+視頻 :原始碼+論文 下載

玩家在上圖所示界面任意位置,按下滑鼠左鍵,開始游戲,
游戲開始以后,玩家需要不斷控制點擊螢屏的頻率來調節小鳥的飛行高度和降落速度,讓小鳥順利的通過畫面右端的柱子間隙,如果玩家不小心碰到了柱子或者落到了地面上,則結束游戲,如圖2所示,
如圖2所示的左上角顯示了用戶的得分,每通過一個柱子間隙得1分,另外,此時玩家可以在如圖2所示的任意位置,按下滑鼠左鍵,重新開始游戲,
2、步驟
步驟一:新建工程和包
新建名為teduBirdGame的的Java工程,然后,在工程下的src目錄下新建包cn.tedu.bird,最后,將該工程所需的圖片拷貝至該包下,工程結構如圖4所示:
在專案中,包的名字一般為公司域名倒寫,再加上專案名字,即為包名,
步驟二:構建工程的結構
首先,新建BirdGame類,然后新建Groud類,表示游戲中的地面;新建Column表示游戲中的柱子;新建Bird類表示游戲中的鳥,這些類繼承Jpanel類,都繼承自Jpanel類,游戲中的各個物件如圖5所示,
Jpanel是Java圖形界面化(GUI)工具包swing中的面板容器類,可以理解為畫板,包含在javax.swing包中,是一種輕量級容器,可以加入到JFrame表單中,
步驟三:為BirdGame類添加屬性
其中,background屬性是游戲背景貼圖,
步驟四:為Ground類添加屬性
Ground類中,各個屬性表示的含義如圖7所示:
在Ground類中添加的代碼如圖8所示:
其中,image屬性為地面的貼圖,
步驟五:為Column類添加屬性
Column類中,各個屬性表示的含義如圖9所示,
在Column類中添加的代碼如圖10所示:
其中,image屬性表示柱子貼圖,
步驟六:為Bird類添加屬性
代碼如圖11所示:
image屬性表示Bird類的貼圖,x,y表示鳥的中心位置,width和height表示鳥圖片的寬度和高度,在本實訓專案中,小鳥的大小用一個正方形區域來表示,size即表示該正方形的邊長,用于后續的碰撞檢測,
步驟七:為BirdGame類添加構造方法,初始化屬性
通過圖12大家可以看出實體化Column類的時候,出現了編譯錯誤,這是因為還沒有為Column類撰寫一個帶引數的構造器,
步驟八:為Column類添加構造方法,初始化屬性
下面介紹一下x、y坐標的計算方式,第一個柱子的x坐標為x= 432+118=550,第二根主子的x坐標為x=550+245,因此,柱子的x軸坐標可以總結為x = 550+245*(n-1),其中n表示第幾根柱子,
可以看出,柱子y的坐標范圍在132至350之間隨機分布,使用Random類的nextInt方法生成[0-218)之間的亂數,然后再加上132,這樣就能得到132至350之間的亂數了,
步驟十:為Bird類添加構造方法,初始化屬性
步驟九:為Ground類添加構造方法,初始化屬性
步驟十一:撰寫main方法
在main方法中,設定視窗的大小、居中、點擊視窗的右上角“X”關閉視窗以及設定視窗可見,代碼如圖20所示,
步驟十二:繪制界面
在BirdGame類中重寫paint方法,繪制界面,首先繪制地面,代碼如圖21所示,
使用Graphics的drawImage方法,繪制背景界面的時候,繪制的起點坐標是(0,0),然后,繪制2個柱子,代碼如圖22所示,
繪制兩個柱子的時候,繪制的起點坐標與Column類的屬性x,y的值不同,需要做一些更改,具體見圖23,
步驟十三:運行
運行BirdFrame類,顯示的界面效果如圖26所示,
步驟十四:實作地面的運動
步驟十五:實作柱子的移動
步驟十六:實作鳥的運動
經過時間t的位移s的計算公式:
s = v0 * t + g * t * t / 2;
從圖33可以看出,經過時間t后小鳥的縱坐標位置y1的計算公式為:
y1 = y - s;
經過t時間后,小鳥的運行速度v為:
v = v0 - g * t ;
此時,Bird類中添加的代碼如下所示:
然后,實作鳥的影片處理,使用陣列,存盤要顯示的圖片,共計8張,鳥每運動一次換一張圖片,以達到鳥的影片效果,此時,Bird類中添加的代碼如下:
從上述代碼中可以看出,fly方法實作了鳥的飛翔,一個數對8取余,能夠得到0到7之間的數字,正好是images陣列中的下標,index/12的目的是 使鳥的揮動翅膀次數變慢,即切換照片的頻率變慢,
接著,在BirdGame類的action方法中,呼叫Bird類的fly方法和step方法,運行后,會發現鳥可以動起來了,代碼如圖34所示,
最后,計算傾角,假設水平移動的位移固定為8,那么傾角 = 反正切s/8,在Bird類中添加的代碼如下所示:
上述代碼中,呼叫Java API提供的反正切方法atam,計算傾角,
接著,在BirdGame類的paint中,為達到鳥的飛翔效果,使用Java API,使小鳥旋轉,代碼如圖36所示,
步驟十七:實作滑鼠監聽事件
要實作滑鼠的按下事件,步驟如下:
- 使用“匿名內部類”宣告事件
- 處理方法,即在BirdGame類的action方法宣告事件的處理方法;
2、首先,在Bird類中添加flappy以實作鳥的飛翔,然后,在處理方法中,呼叫Bird類的flappy方法,
3、注冊事件監聽,即在BirdGame類的action方法中,注冊監聽事件,
在BirdGame類中添加的代碼如圖37所示,
在Bird類添加的代碼如圖38所示:
從圖38可以看出,實作flappy方法,只需要將速度設定為初始速度v0即可,
步驟十八:實作計分
要實作計分,需要進行以下操作:
1、在BirdGame類中增加屬性score,用于計分,score初始化為0,
2、在BirdGame類的action方法的主回圈中,添加邏輯判斷,當柱子的x坐標與鳥的x坐標重合時,則加1分,
3、在BirdGame類的paint方法中將分數畫出來,
在BirdGame類中增加的代碼如下圖所示:
步驟十九:實作鳥的碰撞檢測
1、實作鳥碰撞地面,
1)為BirdGame類增加boolean變數gameOver,該變數用于標識游戲是否結束,如果gameOver的值為true,則表示游戲結束了;如果gameOver的值為false,則表示游戲沒有結束,gameOver的默認值設定為fasle,
2)當檢測到碰到地面的時候,即gameOver的值為TRUE,在回圈中檢測是否碰到地面,在Bird類中增加方法hit(Ground)檢測鳥是否碰地面,當鳥的y坐標減去size/2大于等于地面的y坐標時,則與地面發生碰撞,
3)修改BirdGame類的action方法中的主回圈,當游戲沒有結束的時,執行鳥和柱子的移動,也就是說,如果游戲結束了,鳥和柱子就不移動了,
4)在BirdGame類的paint方法添加gameOver的值為true時,顯示游戲結束界面
從圖40可以看出,小鳥與柱子發生碰撞的x的坐標計算入如下:
x1 = column.x - width/2 - size/2;
x2 = column.x + width/2 + size/2;
當鳥的x坐標大于x1(x > x1)并且小于x2(x < x2)時與柱子發生碰撞,但是如果在縫隙中,則不發生碰撞,請看如圖41,
從圖41可以總結出,小鳥在柱子的縫隙中時y坐標計算如下:
y1 = column.y - gap/2 + size/2;
y2 = column.y + gap/2 - size/2;
當鳥的y坐標大于y1(y>y1)并且小于y2(y<y2)時,鳥在縫隙中,
在Bird類添加hit(column)方法,用于判斷鳥是否碰撞柱子,代碼如圖42所示:
修改BirdGame類的action方法,修改的代碼如圖43所示,
完成上述代碼,即完成了判斷鳥的碰撞功能,
步驟二十:實作游戲的開始、結束及重新開始
首先,把游戲分成三種狀態,分別是start、running以及game_over,start狀態的界面效果如圖44所示:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/382974.html
標籤:其他
上一篇:【游戲開發面經】我在阿里HRG面這關跪掉了,游戲客戶端開發崗,總結一下(阿里 | 游戲 | 涼面面經)
下一篇:【游戲開發實戰】教你在Unity中實作模型消融化為灰燼飄散的效果(ShaderGraph | 消融 | 粒子系統 | 特效)
