雷霆战机
前言
多年前,你我在一起"打飛機(jī)"。為了實(shí)現(xiàn)真正的打飛機(jī),在下一年前踏足帝都學(xué)習(xí)了無(wú)所不能的Python,辣么接下來(lái)帶你在倆個(gè)小時(shí)用200行代碼學(xué)會(huì)打飛機(jī)。
python中提供了一個(gè)pygame的模塊能夠讓我們快速編寫(xiě)一個(gè)游戲。接下來(lái),簡(jiǎn)要?jiǎng)?chuàng)建一個(gè)目錄結(jié)構(gòu),存放代碼(規(guī)范的目錄結(jié)構(gòu)可以讓代碼保持高度的靈活性及可讀性),如下:
""" PlayPlane/ |-- bin/ | |-- main.py 程序運(yùn)行主體程序 |-- config/ | |-- settings.py 程序配置(例如: 游戲背景音樂(lè)的加載等) |-- material 程序素材放置(打飛機(jī)游戲素材放置)|-- ... |-- src/ 程序主體模塊存放 | |-- __init__.py | |-- bullet.py 我方飛機(jī)發(fā)射子彈實(shí)現(xiàn)代碼存放 | |-- enemy.py 敵方飛機(jī)實(shí)現(xiàn)代碼存放 | |-- plane.py 我方飛機(jī)實(shí)現(xiàn)代碼存放 |-- manage.py 程序啟動(dòng)文件 |-- README.md """?打飛機(jī)啦
一、首先在 config/settings.py 中進(jìn)行以下功能的實(shí)現(xiàn)
游戲素材滑動(dòng)到文章底部點(diǎn)擊鏈接即可下載
- 游戲初始化
- 游戲混音器初始化
- 背景音樂(lè)初始化
- 我方飛機(jī)掛了音樂(lè)
- 敵方飛機(jī)掛了音樂(lè)
- 子彈發(fā)射音樂(lè)
二、小試牛刀
飛機(jī)和子彈都是可移動(dòng)的,那么怎么實(shí)現(xiàn)讓它們動(dòng)起來(lái)呢(我方飛機(jī)可以玩家進(jìn)行操控,敵機(jī)就是隨機(jī)性的出現(xiàn),子彈暫由我方飛機(jī)發(fā)射)。
在Pygame中,所有移動(dòng)對(duì)象都可看做是一個(gè)精靈(sprite),精靈之間能夠進(jìn)行相互的交互通信,例如如何讓碰撞檢測(cè)更加精準(zhǔn)等等。
那么先讓我們先在屏幕上制作一個(gè)游戲板,根據(jù) settings.py 配置,并讓它有聲音播放,首先我們?cè)?bin/main.py 中這么寫(xiě):
我們可以直接運(yùn)行它,那么我們會(huì)看到以下畫(huà)面,并且還會(huì)有激情的聲音吆!!!但是我們要將文件配置為絕對(duì)路徑才可以運(yùn)行,因?yàn)閯倓傇趕ettings中的加載的音樂(lè)文件為相對(duì)路徑。
?DEMO接下來(lái)呢,我們將要制作我方飛機(jī),敵方飛機(jī)和子彈如何讓它們展示在游戲畫(huà)板上,繼而讓它們變得可移動(dòng)起來(lái),請(qǐng)看代碼實(shí)現(xiàn)方案...
從游戲畫(huà)板上添加飛機(jī),首先我們應(yīng)怎樣在屏幕上輸出飛機(jī)???
上述講過(guò),pygame中的 sprite(精靈)可使一張圖片或者一個(gè)靜態(tài)物體動(dòng)起來(lái),那么制作飛機(jī)需要考慮并做些什么呢?
那么如何實(shí)現(xiàn)以上的功能呢?接下來(lái)結(jié)合上述的示例代碼我們先將我方飛機(jī)繪制到畫(huà)板上方,并且我們通過(guò)按鍵 J 判定我方飛機(jī)的存活狀態(tài)為死亡,繪制飛機(jī)的死亡畫(huà)面并重置飛機(jī)
"""創(chuàng)建飛機(jī)在pygame中, 所有可移動(dòng)的對(duì)象均叫可看作一個(gè)精靈(sprite)該類并實(shí)現(xiàn)了碰撞方法 spritecollide我方飛機(jī)和敵方飛機(jī)指定掩膜屬性以及生存狀態(tài)標(biāo)志位 添加 self.mask 屬性(可以實(shí)現(xiàn)更精準(zhǔn)的碰撞效果) """# 倒入精靈模塊, 使飛機(jī)可以動(dòng)起來(lái) import pygameclass OurPlane(pygame.sprite.Sprite):def __init__(self, bg_size):super(OurPlane, self).__init__()# 確定我方飛機(jī)背景圖(有倆張,可以讓它們不停的切換,形成動(dòng)態(tài)效果)self.image_one = pygame.image.load("material/image/hero1.png")self.image_two = pygame.image.load("material/image/hero2.png")# 獲取我方飛機(jī)的位置self.rect = self.image_one.get_rect()# 本地化背景圖片的尺寸self.width, self.height = bg_size[0], bg_size[1]# 獲取飛機(jī)圖像的掩膜用以更加精確的碰撞檢測(cè)self.mask = pygame.mask.from_surface(self.image_one)# 定義飛機(jī)初始化位置,底部預(yù)留60像素self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, (self.height - self.rect.height - 60)# 設(shè)置飛機(jī)移動(dòng)速度self.speed = 10# 設(shè)置飛機(jī)存活狀態(tài)(True為存活, False為死亡)self.active = True# 加載飛機(jī)損毀圖片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):"""飛機(jī)向上移動(dòng)的操作函數(shù),其余移動(dòng)函數(shù)方法類似"""if self.rect.top > 0: # 如果飛機(jī)尚未移動(dòng)出背景區(qū)域self.rect.top -= self.speedelse: # 若即將移動(dòng)出背景區(qū)域,則及時(shí)糾正為背景邊緣位置self.rect.top = 0def move_down(self):"""飛機(jī)向下移動(dòng)"""if self.rect.bottom < self.height - 60:self.rect.top += self.speedelse:self.rect.bottom = self.height - 60def move_left(self):"""飛機(jī)向左移動(dòng)"""if self.rect.left > 0:self.rect.left -= self.speedelse:self.rect.left = 0def move_right(self):"""飛機(jī)向右移動(dòng)"""if self.rect.right < self.width:self.rect.right += self.speedelse:self.rect.right = self.widthdef reset(self):# 初始化飛機(jī)(飛機(jī)掛了, 初始化到初始位置)self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, (self.height - self.rect.height - 60)# 重置飛機(jī)的存活狀態(tài)self.active = True上面的代碼寫(xiě)了一個(gè) 我們的飛機(jī) (OurPlane) 類,它初始化了一些屬性以及 上下左右 移動(dòng)的方法和重置方法,接下來(lái)將要運(yùn)用它展示到游戲畫(huà)板上面
由于飛機(jī)是一直存在的,接下我們主程序 main 下面的死循環(huán)中這樣寫(xiě)
?1.在屏幕上繪制飛機(jī) ?2.讓飛機(jī)上下左右動(dòng)起來(lái) ?3.按鍵為 j 繪制飛機(jī)的死亡狀態(tài)那么上述的功能都已經(jīng)實(shí)現(xiàn)了,接下來(lái)就開(kāi)始真正的"打飛機(jī)"
三、接下來(lái)可以制作我方飛機(jī),敵方戰(zhàn)機(jī),子彈等,這些功能均在 src/ 目錄下實(shí)現(xiàn)
- 我方飛機(jī)根據(jù)按鍵上下左右進(jìn)行移動(dòng),初始化位置,噴氣式圖片加載切換及重置效果等
- 敵方飛機(jī)隨機(jī)移動(dòng)出現(xiàn)及重置(制作出我方飛機(jī)之后,敵機(jī)和子彈其實(shí)都是大同小異的)
- 子彈按照我方飛機(jī)正中上方發(fā)射及頻率調(diào)控,重置
在上面的內(nèi)容中,使用面向?qū)ο蟮男问街谱髁擞螒蛑锌梢苿?dòng)的對(duì)象并繼承 pygame.sprite.Sprite?
四、繼而在 bin/main.py 中進(jìn)行主體功能的實(shí)現(xiàn)
- 初始化背景圖及大小
- 我方飛機(jī)移動(dòng)及發(fā)射子彈
- 敵方飛機(jī)移動(dòng)
- 我方飛機(jī)和敵方飛機(jī)碰撞檢測(cè)
- 鍵盤(pán)按鍵監(jiān)測(cè)效果
- 我方飛機(jī)和敵方飛機(jī)掛了效果繪制
五、暢汗淋漓,一氣呵成打飛機(jī)
組合一下,running起來(lái)
from bin.main import mainif __name__ == '__main__':"""環(huán)境: python3 + pygamerunning 起來(lái)就可以打飛機(jī)了O(∩_∩)O~."""main()原文來(lái)自:https://www.cnblogs.com/leguan1314/p/7927595.html
github下載:https://github.com/1352282824shy/-Lightning-Fighter-Game
?
轉(zhuǎn)載于:https://www.cnblogs.com/shanghongyun/p/10541727.html
總結(jié)
- 上一篇: 【SQL Server 学习系列】--
- 下一篇: 6.5 开始进入设计 … Transit