發(fā)布時(shí)間:2023-11-27 15:07:10 瀏覽量:94次
今天小編就來(lái)教你如何用 Python 制作飛機(jī)大戰(zhàn)的游戲項(xiàng)目 !
項(xiàng)目開發(fā)代碼免費(fèi)獲取【見文末】
請(qǐng)相信我是一個(gè)單純的孩子 ,也相信大家明白我說(shuō)的打飛機(jī)是指啥意思 ,對(duì)吧 ? 嗯 ,沒(méi)毛病 。就是 用 pygame 實(shí)現(xiàn)一個(gè)飛機(jī)大戰(zhàn)的游戲 ,優(yōu)秀的我啊 !
我們知道 pygame 框架可以用于管理圖形 、動(dòng)畫聲音等 ,能夠利用它來(lái)輕松地開發(fā)復(fù)雜的游戲 ,可以讓我們更加專注于面向?qū)ο缶幊?。此項(xiàng)目是基于 pygame 框架搭建的一個(gè)小游戲 ,在此文中將實(shí)現(xiàn)此項(xiàng)目的 50% ,后續(xù)會(huì)有跟進(jìn) ,源代碼已經(jīng)放在我的 GitHub 中 ,并在進(jìn)行中將會(huì)不斷對(duì)代碼結(jié)構(gòu)進(jìn)行優(yōu)化 ,對(duì)樣式進(jìn)行優(yōu)化 。在本例中將會(huì)接觸簡(jiǎn)單的面向?qū)ο缶幊毯屠^承 。面向?qū)ο缶幊淌翘崛№?xiàng)目中某種事物的關(guān)鍵屬性進(jìn)行抽象 ,抽象模型中包括數(shù)據(jù)和行為 ,類是對(duì)象的抽象 ,對(duì)象是類的實(shí)例 。
項(xiàng)目開發(fā)代碼免費(fèi)獲取【見文末】
先送上一波效果圖(被壓縮的時(shí)間略短)
效果圖
游戲簡(jiǎn)介 :在游戲《外星人入侵》中 ,玩家控制著一艘最初出現(xiàn)在屏幕底部中央的飛船 。玩家可以使用箭頭鍵左右移動(dòng)飛船 ,還可使用空格鍵進(jìn)行射擊 。游戲開始時(shí) ,一群外星人出現(xiàn)在天空中 ,他們?cè)谄聊恢邢蛳乱苿?dòng) 。玩家的任務(wù)是射殺這些外星人 。玩家將所有外星人都消滅干凈后 ,將出現(xiàn)一群新的外星人 ,他們移動(dòng)的速度更快 。只要有外星人撞到了玩家的飛船或到達(dá)了屏幕底部 ,玩家就損失一艘飛船 。玩家損失三艘飛船后 ,游戲結(jié)束 。
游戲用例圖(第一次畫用例圖,不是很準(zhǔn)確……)
例圖
析該項(xiàng)目 ,飛船 、子彈 、外星人可以分別劃分為具有共同屬性的一類 ,類中定義各自的屬性 ,包括圖像 、形狀 、位置 、更新位置 、繪制圖像等 ;在主函數(shù)中將對(duì)象實(shí)例化 ,對(duì)對(duì)象中的成員變量和函數(shù)進(jìn)行調(diào)用實(shí)現(xiàn)移動(dòng) 、擊殺等操作 ;本節(jié)實(shí)現(xiàn)飛船和子彈類和基本功能 。
在構(gòu)建子彈類時(shí) ,用到了繼承的概念 ,當(dāng)在參與大型項(xiàng)目開發(fā)設(shè)計(jì)時(shí) ,繼承是一個(gè)非常關(guān)鍵的概念 。繼承是對(duì)已有類的一種復(fù)用 ,子類繼承父類 ,可以對(duì)父類中的方法和數(shù)據(jù)進(jìn)行重寫 ,也可以新定義只屬于子類的成員變量 。當(dāng)項(xiàng)目中有許多類具有相同的基本屬性時(shí) ,可以考慮將這些基本屬性抽象為一個(gè)父類 ,子類通過(guò)繼承父類而擁有父類中的數(shù)據(jù)和方法 ,這會(huì)提高代碼的可讀性 ,也省去很多重復(fù)的代碼 。
新建以下幾個(gè)文件 :
其目錄結(jié)構(gòu)如下 :
方法 1——
方法2——
代碼
alien-invasion.py
import pygame from settings import Settings from ship import Ship import game_functions as gf from pygame.sprite import Group def run_game(): pygame.init() # 獲取配置 game_settings = Settings() # 繪制屏幕 screen = pygame.display.set_mode((game_settings.screen_width,game_settings.screen_height)) backgound_color = (220,230,230) pygame.display.set_caption("Alien Invasion") # 飛船實(shí)例化 ship = Ship(game_settings,screen) # 子彈編組,管理屏幕中所有的子彈,保存繼承Sprite類的Bullet實(shí)例 bullets = Group() while True: # 檢測(cè)飛船事件:左移右移發(fā)射子彈 gf.check_events(ship,game_settings,screen,bullets) # 修改飛船移動(dòng)標(biāo)志 ship.update() # 根據(jù)飛船移動(dòng)標(biāo)志重新計(jì)算飛船中心位置 # 更新所有子彈位置 gf.update_bullets(bullets) # 繪制飛船子彈 gf.update_screen(game_settings,screen,ship,bullets) run_ame()
ship.py類
import pygame class Ship(object): """docstring for Ship""" def __init__(self, game_settings,screen): super(Ship, self).__init__() self.game_settings = game_settings self.screen = screen # screen游戲界面 self.image = pygame.image.load('images/外星飛船.png').convert_alpha() # 加載飛船圖像 # 修改圖像大小 self.width,self.height = self.image.get_size() self.image = pygame.transform.smoothscale(self.image,(self.width//2,self.height//2)) self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() # 獲取游戲界面的中心x坐標(biāo)和底部位置便可確定飛船位置 self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom - game_settings.screen_height / 5 self.center = float(self.rect.centerx) # centerx中只能表示整數(shù) # 移動(dòng)標(biāo)志 self.moving_right = False self.moving_left = False ef update(self): """ 根據(jù)移動(dòng)標(biāo)志調(diào)整飛船位置 更改為根據(jù)self.center更新位置 """ if self.moving_right and self.rect.right < self.screen_rect.right: # self.rect.centerx += 1 self.center += self.game_settings.ship_speed_factor if self.moving_left and self.rect.left > 0: # self.rect.centerx -= 1 self.center -= self.game_settings.ship_speed_factor # 更新centerx,因?yàn)槔L制圖形是根據(jù)self.rect() # self.rect()定位需要根據(jù)centerx,bottom self.rect.centerx = self.center de blitme(self): """在self.rect位置繪制圖像""" self.screen.blit(self.image,self.rect)
bullet.py
在子彈類中尤為需要說(shuō)明的是該類繼承了Sprite精靈類 ,繼承精靈類中的方法 。
import pygame from pygame.sprite import Sprite # 繼承Spite類,完善自己的代碼 class Bullet(Sprite): """docstring for Bullet""" def __init__(self, game_settings,screen,ship): super(Bullet, self).__init__() self.screen = screen # # 在0,0位置創(chuàng)建bullet,并設(shè)置寬高 # self.rect = pygame.Rect(0,0,game_settings.bullet_width,game_settings.bullet_height) # # 調(diào)整子彈位置到飛船所在位置,調(diào)整top相同,中心x坐標(biāo)相同 # self.rect.centerx = ship.rect.centerx # self.rect.top = ship.rect.top # # 將y坐標(biāo)存儲(chǔ)為小數(shù)值,以便能夠微調(diào)子彈的速度 # self.y = float(self.rect.y) # self.color = game_settings.bullet_color # self.speed_factor = game_settings.bullet_speed_factor # 把子彈換成一個(gè)好玩的圖片,把圖片轉(zhuǎn)換成位圖 self.image = pygame.image.load('images/生氣.png').convert_alpha() # 修改圖像大小 self.width,self.height = self.image.get_size() self.image = pygame.transform.smoothscale(self.image,(self.width//10,self.height//10)) self.rect = self.image.get_rect() # 調(diào)整子彈位置到飛船所在位置,調(diào)整top相同,中心x坐標(biāo)相同 self.rect.centerx = ship.rect.centerx self.rect.top = ship.rect.top # 將y坐標(biāo)存儲(chǔ)為小數(shù)值,以便能夠微調(diào)子彈的速度 self.y = float(self.rect.y) self.speed_factor = game_settings.bullet_speed_factor def udate(self): """向上移動(dòng)子彈""" # 更新一次坐標(biāo)y向上移動(dòng)speed_factor個(gè)像素 self.y -= self.speed_factor # 更新子彈的rect位置 self.rect.y = self.y def daw_bullet(self): # """ # API:rect(Surface,color,Rect,width=0)->Rect # draw a rectangular shape on the Surgace # The width argument is the thickness to draw the outer edge. # If width is zero then the rectangle will be filled. # """ # pygame.draw.rect(self.screen,self.color,self.rect) """在self.rect位置繪制圖像""" self.screen.blit(self.image,self.rect)
game_functions.py
import pygame import sys from bullet import Bullet def check_eydown_events(event,ship,game_settings,screen,bullets): """ 按下鍵盤事件:右移,左移,發(fā)射子彈 """ if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = True elif event.key == pygame.K_SPACE: fire_bullet(game_settings,screen,ship,bullets) def fire_bulet(game_settings,screen,ship,bullets): """ 如果沒(méi)有超過(guò)當(dāng)前屏幕顯示的最多子彈數(shù),實(shí)例化子彈,添加到子彈編組中 """ if(len(bullets) < game_settings.bullet_allowed): bullet = Bullet(game_settings,screen,ship) bullets.add(bullet) def check_keyp_events(event,ship): """ 抬起鍵,抬起空格不發(fā)生任何事 """ if event.key == pygame.K_RIGHT: ship.moving_right = False elif event.key == pygame.K_LEFT: ship.moving_left = False def check_evets(ship,game_settings,screen,bullets): for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: check_keydown_events(event,ship,game_settings,screen,bullets) elif evnt.type == pygame.KEYUP: check_keyup_events(event,ship) def update_scren(game_settings,screen,ship,bullets): screen.fill(game_settings.background_color) ship.blitme() """ API:pygame.sprite.Group.sprites sprites() -> sprite_list bullet迭代器 """ for bullet in bullets.sprites(): bullet.draw_bullet() pygame.display.flip() def update_bulletbullets): bullets.update() # 超出屏幕邊界移除子彈 # 子彈編組副本 for bullet in bullets.copy(): if bullet.rect.bottom <= 0: bullets.remove(bullet) # 注釋掉,調(diào)試用,耗時(shí) # print(len(bullets))
settings.py配置文件
將常量變量繼承在配置文件中 ,當(dāng)需要修改常量提高游戲體驗(yàn)時(shí) ,直接修改該文件即可
class Settings(object): """docstring for Settings""" def __init__(self): super(Settings, self).__init__() self.screen_width = 1200 self.screen_height = 800 self.background_color = (230,230,230) self.ship_speed_factor = 1.5 # 飛船一個(gè)while循環(huán)走1.5像素 # 子彈配置 self.bullet_width = 3 self.bullet_height = 15 self.bullet_color = (120,120,120) self.bullet_speed_factor = 3 self.bullet_allowed = 5 # 最大子彈數(shù)
pygame接口文檔總結(jié)
1. 轉(zhuǎn)發(fā)文章+關(guān)注小編
2. 私信回復(fù)“ Python ”獲取本套游戲源碼+視頻學(xué)習(xí)資料
熱門資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設(shè)計(jì)領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點(diǎn)擊咨詢報(bào)名。
2. 手機(jī)游戲如何開發(fā)(如何制作傳奇手游,都需要準(zhǔn)備些什么?)
?如何制作傳奇手游,都需要準(zhǔn)備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說(shuō)明時(shí)代在進(jìn)步游戲在更新,更趨于方便化移動(dòng)化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費(fèi)、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費(fèi)、一鍵制作炫酷特效,適合新手小白??靵?lái)試試!
4. Steam值得入手的武俠游戲盤點(diǎn),各具特色的快意江湖
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個(gè)抉定都將觸發(fā)更多愛恨糾葛的精彩奇遇。《天命奇御》具有多線劇情多結(jié)局,不限主線發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟(jì)體系揭秘,不同玩家角色的經(jīng)濟(jì)活動(dòng)
Bigtime加密游戲經(jīng)濟(jì)模型分析,探討游戲經(jīng)濟(jì)特點(diǎn),幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動(dòng)漫建模全過(guò)程,不是一般人能學(xué)的會(huì)的,會(huì)的多不是人?
步驟01:面部,頸部,身體在一起這次我不準(zhǔn)備設(shè)計(jì)圖片,我從雕刻進(jìn)入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
7. 3D動(dòng)畫軟件你知道幾個(gè)?3ds Max、Blender、Maya、Houdini大比拼
當(dāng)提到3D動(dòng)畫軟件或動(dòng)畫工具時(shí),指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動(dòng)畫的軟件程序。但是,在3D動(dòng)畫軟件中還包含了其他類型的...
?三昧動(dòng)漫對(duì)于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會(huì)推出《巫師4》。因?yàn)椤段讕煛废盗性诓邉澋臅r(shí)候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
9. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅(jiān)固
想讓你的3D打印模型更堅(jiān)固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計(jì)技巧,讓你輕松掌握!
10. Unity3D入門:手把手帶你開發(fā)一款坦克大戰(zhàn)的游戲
Unity工程創(chuàng)建完成后如圖所示: 接下來(lái)應(yīng)該導(dǎo)入此項(xiàng)目所需的Unity Package文件,要用到的Unity package文件大家可以去Unity3D的官方網(wǎng)站下載(地址:ht...
最新文章
同學(xué)您好!