多年前,你我在一塊兒"打飛機"。爲了實現真正的打飛機,在下一年前踏足帝都學習了無所不能的Python,辣麼接下來帶你在倆個小時用200行代碼學會打飛機。html
python中提供了一個pygame的模塊可以讓咱們快速編寫一個遊戲。接下來,簡要建立一個目錄結構,存放代碼(規範的目錄結構可讓代碼保持高度的靈活性及可讀性),以下: python
""" PlayPlane/ |-- bin/ | |-- main.py 程序運行主體程序 |-- config/ | |-- settings.py 程序配置(例如: 遊戲背景音樂的加載等) |-- material 程序素材放置(打飛機遊戲素材放置) |-- ... |-- src/ 程序主體模塊存放 | |-- __init__.py | |-- bullet.py 我方飛機發射子彈實現代碼存放 | |-- enemy.py 敵方飛機實現代碼存放 | |-- plane.py 我方飛機實現代碼存放 |-- manage.py 程序啓動文件 |-- README.md """
1、首先在 config/settings.py 中進行如下功能的實現git
遊戲素材滑動到文章底部點擊連接便可下載github
2、小試牛刀
ide
飛機和子彈都是可移動的,那麼怎麼實現讓它們動起來呢(我方飛機能夠玩家進行操控,敵機就是隨機性的出現,子彈暫由我方飛機發射)。函數
在Pygame中,全部移動對象均可看作是一個精靈(sprite),精靈之間可以進行相互的交互通訊,例如如何讓碰撞檢測更加精準等等。學習
那麼先讓咱們先在屏幕上製做一個遊戲板,根據 settings.py 配置,並讓它有聲音播放,首先咱們在 bin/main.py 中這麼寫:spa
咱們能夠直接運行它,那麼咱們會看到如下畫面,而且還會有激情的聲音吆!!!可是咱們要將文件配置爲絕對路徑才能夠運行,由於剛剛在settings中的加載的音樂文件爲相對路徑。code
接下來呢,咱們將要製做我方飛機,敵方飛機和子彈如何讓它們展現在遊戲畫板上,繼而讓它們變得可移動起來,請看代碼實現方案...htm
從遊戲畫板上添加飛機,首先咱們應怎樣在屏幕上輸出飛機???
上述講過,pygame中的 sprite(精靈)可以使一張圖片或者一個靜態物體動起來,那麼製做飛機須要考慮並作些什麼呢?
那麼如何實現以上的功能呢?接下來結合上述的示例代碼咱們先將我方飛機繪製到畫板上方,而且咱們經過按鍵 J 斷定我方飛機的存活狀態爲死亡,繪製飛機的死亡畫面並重置飛機
""" 建立飛機 在pygame中, 全部可移動的對象均叫可看做一個精靈(sprite) 該類並實現了碰撞方法 spritecollide 我方飛機和敵方飛機指定掩膜屬性以及生存狀態標誌位 添加 self.mask 屬性(能夠實現更精準的碰撞效果) """ # 倒入精靈模塊, 使飛機能夠動起來 import pygame class OurPlane(pygame.sprite.Sprite): def __init__(self, bg_size): super(OurPlane, self).__init__() # 肯定我方飛機背景圖(有倆張,可讓它們不停的切換,造成動態效果) self.image_one = pygame.image.load("material/image/hero1.png") self.image_two = pygame.image.load("material/image/hero2.png") # 獲取我方飛機的位置 self.rect = self.image_one.get_rect() # 本地化背景圖片的尺寸 self.width, self.height = bg_size[0], bg_size[1] # 獲取飛機圖像的掩膜用以更加精確的碰撞檢測 self.mask = pygame.mask.from_surface(self.image_one) # 定義飛機初始化位置,底部預留60像素 self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, (self.height - self.rect.height - 60) # 設置飛機移動速度 self.speed = 10 # 設置飛機存活狀態(True爲存活, False爲死亡) self.active = True # 加載飛機損毀圖片 self.destroy_images = [] self.destroy_images.extend( [ pygame.image.load("material/image/hero_blowup_n1.png"), pygame.image.load("material/image/hero_blowup_n2.png"), pygame.image.load("material/image/hero_blowup_n3.png"), pygame.image.load("material/image/hero_blowup_n4.png") ] ) def move_up(self): """ 飛機向上移動的操做函數,其他移動函數方法相似 """ if self.rect.top > 0: # 若是飛機還沒有移動出背景區域 self.rect.top -= self.speed else: # 若即將移動出背景區域,則及時糾正爲背景邊緣位置 self.rect.top = 0 def move_down(self): """ 飛機向下移動 """ if self.rect.bottom < self.height - 60: self.rect.top += self.speed else: self.rect.bottom = self.height - 60 def move_left(self): """ 飛機向左移動 """ if self.rect.left > 0: self.rect.left -= self.speed else: self.rect.left = 0 def move_right(self): """ 飛機向右移動 """ if self.rect.right < self.width: self.rect.right += self.speed else: self.rect.right = self.width def reset(self): # 初始化飛機(飛機掛了, 初始化到初始位置) self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, (self.height - self.rect.height - 60) # 重置飛機的存活狀態 self.active = True
上面的代碼寫了一個 咱們的飛機 (OurPlane) 類,它初始化了一些屬性以及 上下左右 移動的方法和重置方法,接下來將要運用它展現到遊戲畫板上面
因爲飛機是一直存在的,接下咱們主程序 main 下面的死循環中這樣寫
那麼上述的功能都已經實現了,接下來就開始真正的"打飛機"
3、接下來能夠製做我方飛機,敵方戰機,子彈等,這些功能均在 src/ 目錄下實現
在上面的內容中,使用面向對象的形式製做了遊戲中可移動的對象並繼承 pygame.sprite.Sprite
4、繼而在 bin/main.py 中進行主體功能的實現
5、暢汗淋漓,一鼓作氣打飛機
組合一下,running起來
from bin.main import main if __name__ == '__main__': """ 環境: python3 + pygame running 起來就能夠打飛機了O(∩_∩)O~. """ main()
原文來自:http://www.javashuo.com/article/p-vxjwovow-d.html
github下載:https://github.com/1352282824shy/-Lightning-Fighter-Game