所用技術和軟件python
python 2.7微信
pygame 1.9.3ide
pyCharm函數
準備工做學習
安裝好 pygame 在第一次使用 pygame 的時候,pyCharm 會自動 install pygame。測試
下載好使用的素材。字體
技術實現動畫
初始化 pygame3d
首先要初始化 pygame ,以後設定一些基本的要點,好比窗口大小(儘可能避免魔法數字),窗口標題以及背景圖像。pygame 經過加載圖片,最後返回一個 surface 對象,咱們不須要關係圖片的格式。可是經過 convert() 這個函數,會使咱們的圖片轉換效率提升。對象
默認圖片左上角爲原點 (0,0)。
顯示窗口
若是咱們這樣設定,當咱們運行的時候,窗口會一閃而過,並不會出現咱們想象的畫面。由於窗口只是運行一下就會關閉,因此咱們要寫一個循環,使窗口一直保持出現。固然若是咱們簡單的寫一個 while True那麼咱們的程序就出現了死循環,卡死。
因此還須要寫個退出。
顯示飛機
首先咱們要初始化咱們的主角飛機
仍舊須要加載咱們須要的資源,咱們的資源文件裏已經準備好各類各樣的飛機,可是他們都在一張切圖上。
同時咱們的資源文件裏還有一個叫作 shoot.pack 的文件,裏面記錄了每一個圖片所在的位置。
咱們經過下面的代碼加載資源圖片,而且得到咱們須要的主角飛機。
效果以下
讓飛機 「飛」 起來
飛機已經出如今咱們的屏幕上了,如今須要讓飛機動起來讓他能夠上下左右的移動。
首先要獲取鍵盤事件,獲取鍵盤上什麼按鍵被按下。
key_pressed = pygame.key.get_pressed()
經過 key_pressed 獲取當前的鍵盤按鍵。並進行判斷,這裏寫了四個函數進行對 player 移動。
下一步就是完善這四個方法。
簡單的說就是按下方向鍵的時候(w,a,s,d)飛機向四周移動,可是不能移動離開屏幕。
此時咱們就應該把咱們的飛機造成一個類,類裏面有控制飛機的方法。
這裏寫類比較麻煩一點
Player的出現
首先要明確一點,這個類須要什麼。
咱們以前對 player 有什麼操做?定義了他的圖片和他出現的位置。因此咱們的構造方法就要初始化這些值。全部的這些對象,咱們在 pygame 裏叫作精靈(sprite),這個概念也在其餘遊戲開發中使用。
簡單的說就是獲取飛機的圖片,初始化飛機的矩形區域。rect 該屬性會得到四個值。分別是左上角 x ,y 座標,矩形的寬度。topleft 初始化飛機的左上角座標,也就是飛機出現的位置。以下圖所示。
player的控制
當飛機出現了,咱們就應該實現咱們在循環裏寫的方法。咱們首先要判斷它還在不在屏幕內,不能讓飛機飛出屏幕。能夠經過 rect.top,rect.bottom,rect.left,rect.right四個方法獲取飛機圖片的上下左右四個邊界值。
這樣咱們就能對飛機進行判斷
這裏的 move 是咱們對飛機的移動的位移定義的常量。
讓子彈飛
子彈要沿着發射方向射出去。能夠在屏幕上一直移動,直到移出屏幕。
咱們只要有定義一個子彈對象,讓這個對象顯示在屏幕上就能夠。先定義飛機子彈類,基本和定義 player 同樣,得到圖片,裁剪圖片,設置圖片初始位置,在屏幕上顯示圖片
運行結果
下一步就是讓飛機的子彈跟隨飛機。咱們須要在 Player 類裏面添加方法。首先咱們規定,按下空格發射子彈。
這樣咱們的子彈就會跟隨飛機出現。
下一步就是讓子彈在屏幕上移動。
建立移動的方法。
player 的飛機就算基本繪製好了
繪製敵機
下一步就是繪製敵機。敵機是從屏幕上方移動到屏幕下方。咱們任就須要一個類來設置敵機。設置類任就和咱們前面的差很少,加載資源,設置 rect,設置位置。
最後在屏幕顯示出來
1
screen.blit(enemy_img, enemy_rect)
如今咱們就應該想一想敵機的特色了,其實他和子彈的特色基本一直,只不過方向不同而已。還有一點是敵機是隨機生成的。
移動實現
碰撞檢測
飛機和敵機還有子彈都有了,咱們如今須要進行完成碰撞檢測。有下面幾種場景。
敵機和玩家碰撞在一塊兒
子彈和敵機碰撞在一塊兒
不管是那種狀況的碰撞,其實就是兩張圖片有了交集。如圖pygame 給咱們提供了碰撞檢測的方法。首先兩個對象必須是 sprite 。經過 pygame.sprite.collide_rect() 進行碰撞檢測。
咱們先進行一個測試
if pygame.sprite.collide_rect(enemy, player):print'檢測成功'
結果
檢測成功
此時咱們就能夠完成,當玩家和敵機發生碰撞,遊戲結束,當子彈和敵機碰撞,敵機消失。
一樣的 pygame 給咱們提供了一個 pygame.sprite.groupcollide() 用於 Group 之間的碰撞檢測.當發生碰撞的時候這兩個對象都會在 Group 中移出。
用於檢測敵機和子彈
pygame.sprite.groupcollide(enemies, player.bullets, 1, 1)
敵機和子彈的關係已經和好的處理。處理敵機和玩家飛機的關係。
咱們須要在 Player 裏添加一個屬性判斷當前玩家是否被擊中的 boolean 值.當集中的時候把屬性改成 True.當爲 True 的時候遊戲結束.也就是咱們一開始設置的循環就會結束.因此咱們須要更改以前寫的一些代碼,使它更加完善。
在 Player 類裏面添加是否擊中屬性。
執行結果
當玩家被擊中的時候,在顯示一張 GameOver 圖片提示
作到這裏基本算是實現了飛機大戰.可是還有不少細節處理。
細節處理
精細的碰撞檢測
從圖上看,當敵機看似尚未和咱們接觸時,可是已經 GameOver 了。實際狀況是這樣的,全部的圖片都是矩形,當兩張圖片的矩形邊框線碰撞的時候,就算兩個對象碰撞,因此咱們要更加精細的使用碰撞檢測。
咱們能夠按着圖片中心的某個長度爲半徑,在這個半徑內發生碰撞纔是碰撞。
pygame 給咱們提供了這樣的方法。pygame.sprite.collide_circle_ratio() 能夠本身算出一個半徑,做爲檢測半徑。而且能夠作出一個有效檢測的百分比。
動畫
作了怎麼就,感受它沒有一點動效,感受死氣沉沉的。不管是飛機飛行,仍是飛機被擊中,都沒有一個明確的反饋。對於2d遊戲,動畫其實就是一張一張的圖片不停的變化。就和電影的原理相似。要想讓咱們的飛機動起來,咱們須要定義一個列表來存放這些圖片,而後寫個循環,讓他一直不停的更換圖片就好。
首先咱們更改咱們的主角 Player任就是老套路,加載圖片。把加載的圖片放到list 裏。
飛機正常飛行的圖片只有兩張。因此咱們要循環變化這兩張圖片。因此每發射一個子彈,圖片變化兩張。
正常發射子彈的動畫效果已經作完。咱們還須要進行被擊中爆炸的動畫效果。
擊中的原理和正常也同樣。只不過先要判斷當前飛機狀態,是否被擊中。
248,30,495,1457 這些數字是什麼?如何計算出來的。先說 495 這個數字。495 這個數字很隨便,只是控制子彈的發射間隔。徹底能夠自定義。可是495這個數字一旦肯定,其餘三個數字基本肯定。248 爲 495 的一半,由於發射一個子彈,圖片要變化兩張。30 這個數字基本也是自定義的,只要比1大就好,他影響告終束動畫出現的時間。
1488 這個數字是經過 248 肯定的,是 248 的 6倍,由於飛機被射擊後會有四張圖片的顯示。同理,把敵機接觸子彈的動畫寫出來。
加載圖片
以後的處理邏輯基本類似,很少介紹
這樣的話基本完成了動畫效果。
音樂
有了動畫還的有音樂。
音樂的處理只要在特定的地方播放音樂就好,好比子彈發射的時候,背景音樂,被擊中的時候,遊戲結束的時候,等等。他們的處理邏輯都同樣。先加載資源,而後在播放。
背景音樂的播放。
pygame 在處理背景音樂的時候都在 pygame.mixer 方法中。其中播放音樂的play中的參數,第一個爲播放幾回,-1 爲循環播放,後面的浮點表示 從第幾秒開始播放。
其餘音樂處理同樣,很少解釋。
分數&等級
分數
首先繪製得分狀況,在屏幕上顯示多少分。
繪製字體基本和繪製精靈是差很少的。首先要生成字體兩個參數分別是字體和字號
等級
有了分數,那麼再加點等級會使遊戲更加有趣味性。
一樣的先繪製等級。
基本到這裏算是寫了一個相對完整的遊戲。
我有一個微信公衆號,常常會分享一些python技術相關的乾貨;若是你喜歡個人分享,能夠用微信搜索「python語言學習」關注
歡迎你們加入千人交流答疑裙:699+749+852