所用技術和軟件
python 2.7
pygame 1.9.3
pyCharm
準備工作
安裝好 pygame 在第一次使用 pygame 的時候,pyCharm 會自動 install pygame。
下載好使用的素材。
技術實現(xiàn)
初始化 pygame
首先要初始化 pygame ,之后設定一些基本的要點,比如窗口大?。ūM量避免魔法數(shù)字),窗口標題以及背景圖像。pygame 通過加載圖片,最后返回一個 surface 對象,我們不需要關系圖片的格式。但是通過 convert()這個函數(shù),會使我們的圖片轉換效率提高。
默認圖片左上角為原點 (0,0)。
顯示窗口
如果我們這樣設定,當我們運行的時候,窗口會一閃而過,并不會出現(xiàn)我們想象的畫面。因為窗口只是運行一下就會關閉,所以我們要寫一個循環(huán),使窗口一直保持出現(xiàn)。當然如果我們簡單的寫一個 while True那么我們的程序就出現(xiàn)了死循環(huán),卡死。
所以還需要寫個退出。
將 player 顯示在屏幕上,并且刷新屏幕
效果如下
讓飛機 “飛” 起來
飛機已經出現(xiàn)在我們的屏幕上了,現(xiàn)在需要讓飛機動起來讓他可以上下左右的移動。
首先要獲取鍵盤事件,獲取鍵盤上什么按鍵被按下。
簡單的說就是獲取飛機的圖片,初始化飛機的矩形區(qū)域。 rect
該屬性會獲得四個值。分別是左上角 x
, y
坐標,矩形的寬度。 topleft
初始化飛機的左上角坐標,也就是飛機出現(xiàn)的位置。如下圖所示。
讓子彈飛
子彈要沿著發(fā)射方向射出去??梢栽谄聊簧弦恢币苿?,直到移出屏幕。
我們只要有定義一個子彈對象,讓這個對象顯示在屏幕上就可以。
先定義飛機子彈類,基本和定義 player一樣,獲得圖片,裁剪圖片,設置圖片初始位置,在屏幕上顯示圖片
下一步就是讓飛機的子彈跟隨飛機。
我們需要在 Player 類里面添加方法。
首先我們規(guī)定,按下空格發(fā)射子彈。
下一步就是讓子彈在屏幕上移動。
創(chuàng)建移動的方法。
這個和我們的預期還是有差別的,頻率太快了。
關于pygame 的鍵盤重復事件 官方好像并沒有這個設置。那么我們只能在添加一個計數(shù)器,通過計算器的數(shù)值來判斷子彈是否發(fā)射。這里的數(shù)值是多次測試后,自己感覺一個比較滿意的頻率??梢宰约赫{整。
繪制敵機
下一步就是繪制敵機。敵機是從屏幕上方移動到屏幕下方。我們任就需要一個類來設置敵機。設置類任就和我們前面的差不多,加載資源,設置 rect,設置位置。
現(xiàn)在我們就應該想想敵機的特點了,其實他和子彈的特點基本一直,只不過方向不一樣而已。還有一點是敵機是隨機生成的。
碰撞檢測
飛機和敵機還有子彈都有了,我們現(xiàn)在需要進行完成碰撞檢測。有下面幾種場景。
敵機和玩家碰撞在一起
子彈和敵機碰撞在一起
無論是那種情況的碰撞,其實就是兩張圖片有了交集。
如圖
執(zhí)行結果
當玩家被擊中的時候,在顯示一張 GameOver 圖片提示
細節(jié)處理
精細的碰撞檢測
從圖上看,當敵機看似還沒有和我們接觸時,但是已經 GameOver 了。
實際情況是這樣的,所有的圖片都是矩形,當兩張圖片的矩形邊框線碰撞的時候,就算兩個對象碰撞,所以我們要更加精細的使用碰撞檢測。
我們可以按著圖片中心的某個長度為半徑,在這個半徑內發(fā)生碰撞才是碰撞。
正常發(fā)射子彈的動畫效果已經做完。我們還需要進行被擊中爆炸的動畫效果。
擊中的原理和正常也一樣。只不過先要判斷當前飛機狀態(tài),是否被擊中。
同樣我們需要創(chuàng)建 Group() 來存放被擊中的敵機。
之后的處理邏輯基本相似,不多介紹
音樂
有了動畫還的有音樂。
音樂的處理只要在特定的地方播放音樂就好,比如子彈發(fā)射的時候,背景音樂,被擊中的時候,游戲結束的時候,等等。他們的處理邏輯都一樣。先加載資源,然后在播放。
第一個參數(shù)是寫的文字;第二個參數(shù)是個布爾值,以為這是否開啟抗鋸齒,就是說True的話字體會比較平滑,不過相應的速度有一點點影響;第三個參數(shù)是字體的顏色;第四個是背景色,如果你想沒有背景色(也就是透明),那么可以不加這第四個參數(shù)
字體也有了,文本也有了,下一步就是繪制。通過 get_rect()獲得矩形,之后繪制和精靈繪制方法一樣
基本到這里算是寫了一個相對完整的游戲。