飛機(jī)大戰(zhàn)(pygame)開發(fā)實(shí)錄四

上一篇已經(jīng)創(chuàng)建了基類讨阻,接下來繼承基類創(chuàng)建動(dòng)態(tài)背景偎蘸、飛機(jī)的基礎(chǔ)類料按。

創(chuàng)建背景基類

class BackGround(Base):
    def __init__(self, pygame_screen, image_name,type):
        Base.__init__(self,pygame_screen, (0, 0), image_name)
        self.movedistance = 852 // 200            #動(dòng)態(tài)背景每次移動(dòng)的距離
        self.type         = type                  #背景類型:"dynamic" 動(dòng)態(tài)奄侠,為空或任意字符都為靜態(tài)
    def display(self):
        if self.type == "dynamic":                #動(dòng)態(tài)背景
            self.y += self.movedistance
            self.y2 = self.y - self.h
            if self.y >= 852:
                self.y = 0
            self.screen.blit(self.image, (self.x, self.y2))
        self.screen.blit(self.image, (self.x, self.y))

type 屬性:用來區(qū)分創(chuàng)建的背景是動(dòng)態(tài)的還是靜態(tài),因?yàn)橛螒驎和1尘笆庆o態(tài)的载矿。

動(dòng)態(tài)背景是飛機(jī)俯瞰地面的圖像垄潮,我們會(huì)讓它不停的向下移動(dòng),這樣看上去就像飛機(jī)往上飛闷盔。
動(dòng)態(tài)背景就是兩張相同的背景圖循環(huán)向下移動(dòng)弯洗。畫框部分是顯示的圖像。

加上創(chuàng)建對象及相關(guān)測試腳本

def main():
    screen = pygame.display.set_mode((480, 852), 0, 32)
    # 添加背景
    Bg = BackGround(screen, Image_Background, 'dynamic')
    while True:
        Bg.display()
        pygame.display.update()
        for event in pygame.event.get():
            pass
if __name__ == '__main__' :
    main()
運(yùn)行效果

創(chuàng)建背景使用了一個(gè)變量Image_Background逢勾,來指定圖片文件

Bg = BackGround(screen, Image_Background, 'dynamic')

Image_Background 是已經(jīng)聲明好的變量,在程序的開頭部分牡整,集中聲明了大量這種類似的變量。
實(shí)際開發(fā)中溺拱,也建議大家這樣做逃贝,易于閱讀,也易于維護(hù)迫摔。

#靜態(tài)資源集中聲明
Font_Icmblk             = "./res/Interstate Cond Mono - Blk.ttf"
Font_Consola            = "consola.ttf"
#暫停背景圖片沐扳,系統(tǒng)保存暫停前的最后一個(gè)畫面作為背景
Image_Pausedbg          = "pausedbg.png"
#背景
Image_Background        = "./res/background.png"
#顯示當(dāng)前剩余Live
Image_ShowHealth        = "./res/health2.png"
Image_Logo              = "./res/name.png"
Image_Sound             = "./res/sound.png"
Image_SoundNor          = "./res/sound_nor.png"
Image_Music             = "./res/music.png"
Image_MusicNor          = "./res/music_nor.png"
#飛機(jī)的血量(一格)
Image_HeroHealth        = "./res/health.png"
#玩家飛機(jī)正常狀態(tài)
Image_HeroPlane         = "./res/hero2.png"
#玩家飛機(jī)向前飛行
Image_HeroPlaneUp       = "./res/hero1.png"
#玩家飛機(jī)子彈
Image_HeroBullet        = "./res/bullet2.png"
#補(bǔ)給包1
Image_Reward1           = "./res/prop_type_0.png"
#補(bǔ)給包2
Image_Reward2           = "./res/prop_type_1.png"
#敵機(jī)子彈
Image_EnemyBullet       = "./res/bullet1.png"
#敵機(jī)1
Image_EnemyPlane_1      = "./res/enemy0.png"
#Boss1
Image_BossPlane1        = "./res/enemy2.png"
#Boss1 一半血量
Image_BossPlane1Half    = "./res/enemy2_down1.png"
#帶獎(jiǎng)勵(lì)的敵機(jī)
Image_RewardPlane1      = "./res/enemy1.png"

#飛機(jī)爆炸
Sound_Boom              = "./music/enemy1_down.wav"
#開火
Sound_HeroFire          = "./music/bullet.wav"
#敵機(jī)1刷新
Sound_EnemyPlane_1      = "./music/enemy2_out.wav"
#飛機(jī)中彈
Sound_Hit               = "./music/enemy3_down.wav"
#游戲暫停
Sound_Pause             = "./music/game_achievement.wav"
#按鈕點(diǎn)擊
Sound_ButtonOnClicked   = "./music/enemy4_down.wav"
#背景音樂
Music_backgroud         = "./music/game_music.mp3"
#繼續(xù)按鈕
Image_ButtonResume      = "./res/resume_nor.png"
Image_ButtonRestart     = "./res/restart_nor.png"
Image_ButtonQuit        = "./res/quit_nor.png"
Image_ButtonStart       = "./res/game_resume_pressed.png"
Image_ButtonStart2      = "./res/game_resume_nor.png"
#全局變量
#是否播放音效
Sound_IsPlay            = True

創(chuàng)建飛機(jī)的基類:

class BasePlane(Base):
    def __init__(self, pygame_screen, postion, image_name, bulletCoolDownSpeed,bullets):
        Base.__init__(self, pygame_screen, postion, image_name) 
        self.bullet_list = bullets
        self.bulletCoolDownSpeed = bulletCoolDownSpeed  #子彈冷卻時(shí)間
        self.bulletCoolDownstate = 0                    #子彈冷卻計(jì)時(shí)
        self.bulletCdOk          = True                 #子彈冷卻好
        self.live                = 1                    #飛機(jī)有幾條命
        self.Health              = 4                    #當(dāng)前血量
        self.MaxHealth           = 4                    #一條命有幾格血
        self.Reward              = ''                   #爆炸后是否有獎(jiǎng)勵(lì)
        self.HealthImage         = pygame.image.load(Image_HeroHealth)#單格血條圖片
        # 爆炸效果
        self.hit                 = False  # 被擊中
        self.bomb_list           = []     # 爆炸分幀圖片組
        self.image_num           = 0      # 顯示刷新多少次換一張圖片
        self.image_index         = 0      # 當(dāng)前顯示圖片的index
  
    def bulletCoolDown(self):
        #子彈冷卻判斷
        if self.bulletCoolDownstate > 0:
            self.bulletCoolDownstate += 1
            if self.bulletCoolDownstate == self.bulletCoolDownSpeed:
                self.bulletCoolDownstate = 0
                self.bulletCdOk = True
    def boom(self):
        self.screen.blit(self.bomb_list[self.image_index], (self.x, self.y))
        self.image_num += 1
        if self.image_num == 8:  # 刷新10次切換1張圖
            self.image_num = 0
            self.image_index += 1
        if self.image_index > 3:
            self.hit         = False  # 爆炸動(dòng)畫播放完成,再修改標(biāo)記
            self.image_num   = 1
            self.image_index = 1

    def display(self):
        if self.hit == True:
            if self.live == 0 :   #被擊中且live=0句占,飛機(jī)爆炸
                self.boom()
                playsound(Sound_Boom)
            else:
                self.Health -= 1         #live   > 0 ,扣一格血
                if self.Health == 0:     #Health = 0 ,扣一條命
                    self.live -= 1
                    if self.live > 0:    #只有玩家飛機(jī)有多條生命沪摄,這部分針對玩家飛機(jī)飛機(jī),扣一條民之后又10秒無敵時(shí)間
                        self.Invincible = True
                        self.Health     = self.MaxHealth
                        self.hit        = False
                else:
                    self.hit = False
        else:
            self.screen.blit(self.image, (self.x, self.y))

bulletCoolDown 方法:控制子彈冷卻時(shí)間纱烘,
boom 方法:顯示飛機(jī)爆炸動(dòng)畫
display 方法:繪制顯示的圖像


本篇講解了背景基類的創(chuàng)建及動(dòng)態(tài)背景原理杨拐,另外創(chuàng)建了飛機(jī)的基類。下一篇繼續(xù)講解玩家飛機(jī)類的創(chuàng)建及其控制方法凹炸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末戏阅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子啤它,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件变骡,死亡現(xiàn)場離奇詭異离赫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)塌碌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門渊胸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人台妆,你說我怎么就攤上這事翎猛。” “怎么了接剩?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵切厘,是天一觀的道長。 經(jīng)常有香客問我懊缺,道長疫稿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任鹃两,我火速辦了婚禮遗座,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俊扳。我一直安慰自己途蒋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布馋记。 她就那樣靜靜地躺著碎绎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抗果。 梳的紋絲不亂的頭發(fā)上筋帖,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音冤馏,去河邊找鬼日麸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛逮光,可吹牛的內(nèi)容都是我干的代箭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼涕刚,長吁一口氣:“原來是場噩夢啊……” “哼嗡综!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杜漠,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤极景,失蹤者是張志新(化名)和其女友劉穎察净,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盼樟,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氢卡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晨缴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片译秦。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖击碗,靈堂內(nèi)的尸體忽然破棺而出筑悴,到底是詐尸還是另有隱情,我是刑警寧澤稍途,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布阁吝,位于F島的核電站,受9級特大地震影響晰房,放射性物質(zhì)發(fā)生泄漏求摇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一殊者、第九天 我趴在偏房一處隱蔽的房頂上張望与境。 院中可真熱鬧韵洋,春花似錦营曼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽共屈。三九已至,卻和暖如春党窜,著一層夾襖步出監(jiān)牢的瞬間拗引,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工幌衣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矾削,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓豁护,卻偏偏與公主長得像哼凯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子楚里,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容