飛機大戰(zhàn)(pygame)開發(fā)實錄九

上一篇講解了背景和音效的操作,本篇繼續(xù)添加游戲暫停節(jié)目、游戲信息展示、游戲開始確認(rèn)畫面,以及敵機刷新控制。


添加游戲暫停
 #暫停游戲  exp9添加
def Paused(screen):
    pygame.image.save(screen, Image_Pausedbg)
    #保存當(dāng)前游戲圖像作為背景
    pygame.mixer.music.pause()
    #暫停背景音樂
    PlaySound(Sound_Pause)
    isPause = True
    pausedBg   = BackGround(screen,Image_Pausedbg,"")                 #創(chuàng)建相關(guān)按鈕
    cbContinue = Button(screen, Image_ButtonResume, Image_ButtonResume, (210, 360),"dislocation")
    cbRestart  = Button(screen, Image_ButtonRestart, Image_ButtonRestart, (180, 410),"dislocation")
    cbExit     = Button(screen, Image_ButtonQuit, Image_ButtonQuit, (180, 460),"dislocation")

    while isPause:
        pausedBg.display()
        cbContinue.display()
        cbRestart.display()
        cbExit.display()
        pygame.display.update()
        for event in pygame.event.get():
            # 對不同按鈕進(jìn)行相應(yīng)
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            elif event.type == pygame.MOUSEBUTTONDOWN and cbContinue.isOver():
                PlaySound(Sound_ButtonOnClicked)
                return 'continue'
            elif event.type == pygame.MOUSEBUTTONDOWN and cbRestart.isOver():
                PlaySound(Sound_ButtonOnClicked)
                return 'restart'
            elif event.type == pygame.MOUSEBUTTONDOWN and cbExit.isOver():
                PlaySound(Sound_ButtonOnClicked)
                return 'exit'
            elif event.type == KEYDOWN :
                if event.key == K_ESCAPE:
                    return 'continue'
MainControl函數(shù)已經(jīng)有暫停界面的調(diào)用

MainControl函數(shù)中調(diào)用 Paused函數(shù)就可以加載暫停界面了,運行效果如圖:

image.png

Paused函數(shù)把用戶對按鈕的操作,返回給MainControl函數(shù),MainControl函數(shù)在返回給Main函數(shù)

        #exp9 添加對暫停界面操作的相應(yīng)
        getReturn = MainControl(hero, screen, cbSound, cbMusic)
        if getReturn:
            if getReturn == 'restart':
                break
            elif getReturn == 'exit':
                exit()
            else:
                pygame.mixer.music.unpause()

返回的是 'restart' ,即重新開始游戲,程序是直接跳出出循環(huán),那么程序也就停止了,所以要有重啟的效果,要把程序入口改成循環(huán)。也就是調(diào)出循環(huán),再次調(diào)用Main函數(shù)開始游戲。

if __name__ == '__main__' :
    while True:   #exp 9  添加循環(huán),重新開始游戲才會起作用
        Main()

展示游戲信息

添加玩家生命數(shù)、當(dāng)前得分、飛行里程數(shù)等等信息

添加玩家生命數(shù)展示類

# exp9 添加類 展示玩家生命數(shù)
class ShowHealth(object):
    def __init__(self,screen_temp,hero):
        self.screen    = screen_temp
        self.hero      = hero
        self.image     = pygame.image.load(Image_ShowHealth)
        self.w, self.h = self.image.get_size()
    def display(self):
        for i in range(self.hero.live):
            self.screen.blit(self.image, (12 + i * 13, 830))

得分、飛行里程數(shù)數(shù)使用 ShowText 類來創(chuàng)建 (在Main函數(shù)中創(chuàng)建)。

    # ex9 Main 函數(shù) 添加 展示游戲信息
    showScores     = ShowText(screen,str("%010d" % scores),Font_Icmblk,(80,80,80),(420, 20))
    showFlyMileage = ShowText(screen,str("%010d" % flyMileage) + "Km",Font_Icmblk,(80,80,80),(70, 20))
    showHealth     = ShowHealth(screen,hero)

Main函數(shù)循環(huán)部分,刷新展示的信息,在函數(shù)開始部分添加 變量flyMileage

        # 刷新戰(zhàn)斗信息顯示 ex9 添加
        flyMileage += 1    #刷新飛行里程數(shù)
        showScores.text = str("%010d" % scores)
        showScores.display()
        showFlyMileage.text = str("%010d" % flyMileage) + "Km"
        showFlyMileage.display()
        showHealth.display()
        pygame.display.update()

這樣就完成了游戲信息的展示

游戲信息展示

程序開始直接進(jìn)入游戲,會顯得突兀,所以我們添加一個游戲開始確認(rèn)界面。
  # 顯示LOGO及開始游戲按鈕 游戲開始確認(rèn)界面  ex9 添加
    cbStart = Button(screen, Image_ButtonStart2, Image_ButtonStart, (233, 400), "replace")
    cbLogo = Button(screen, Image_Logo, Image_Logo, (24, 220), "")

    showAuthor = ShowText(screen, "Codes By xiaox 2019", Font_Icmblk, (80, 80, 80), (248, 480))
    showTel = ShowText(screen, "Tel:18627472125", Font_Icmblk, (80, 80, 80), (250, 510))
    pause = True
    while pause:
        mainBackGround.display()
        cbStart.display()
        cbLogo.display()
        showAuthor.display()
        showTel.display()
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            elif event.type == pygame.MOUSEBUTTONDOWN and cbStart.isOver():
                PlaySound(Sound_ButtonOnClicked)
                pause = False
    del (cbStart)
    del (cbLogo)

程序邏輯比較簡單,就是在Main函數(shù)中主循環(huán)前面加一個循環(huán),展示一些LOGO信息,添加一個開始確認(rèn)按鈕,跳出這個循環(huán),就達(dá)到開始確認(rèn)的效果。

開始確定界面

當(dāng)前腳本只是在游戲開始,創(chuàng)建了3種不同敵機,作為演示。
實際游戲會按一定規(guī)率或隨機創(chuàng)建敵機對象,實現(xiàn)敵機刷新。具體的實現(xiàn)方法就比較多,比如使用列表、文件、或者幾個變量來保存刷新規(guī)則都可以。這里講解的,使用3個變量,來刷新敵機周期性刷新。

同樣把刷新控制封裝到一個函數(shù)中

#刷新敵機  exp9-2 添加
def BuildEnemyPlane(flymileage, enemyplanes, pygame_screen, enemybulltes):
    buildEnemyTiming   = 200
    buildBossTiming    = 3000
    buildRewardTiming  = 1000    
    if flymileage % buildEnemyTiming == 0 :
        enemyplanes.append(EnemyPlane(pygame_screen,enemybulltes))
    if flymileage % buildBossTiming == 0 :
        enemyplanes.append(BossPlane(pygame_screen, enemybulltes))
    if flymileage % buildRewardTiming == 0 :
        if flymileage // buildRewardTiming % 2 == 0:
            enemyplanes.append(RewardPlane(pygame_screen, enemybulltes,"doublebullet"))
        else:
            enemyplanes.append(RewardPlane(pygame_screen, enemybulltes,'shotbullet'))

BuildEnemyPlane函數(shù)講解
函數(shù)通過buildEnemyTiming buildBossTiming buildRewardTiming 3個變量來保存敵機刷新的頻率。
參照的是傳入的flymileage參數(shù),也就是主循環(huán)的次數(shù)。通過判斷是否可以整除頻率變量,來刷新對應(yīng)的敵機。
比如上面的程序就是,每循環(huán)200次,刷新普通敵機一架,循環(huán)3000次,刷新Boss一架,循環(huán)1000次刷新帶補給飛機一架。

Main函數(shù)中刪除之前創(chuàng)建的3架演示敵機

添加BuildEnemyPlane函數(shù)調(diào)用,來刷新敵機

        # 敵機刷新 exp9添加
        BuildEnemyPlane(flyMileage, enemyPlanes, screen, enemyBullets)
注意:flymileage 變量初始值如果是0,那么要在調(diào)用函數(shù)之前給它+1,不然都能被整除,游戲開始會刷新3架飛機,也可以給它初始值設(shè)置為1

至此游戲開發(fā)已經(jīng)完成,下一篇會對Main函數(shù)做一個梳理,

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,666評論 1 32
  • 借著今年開新人培訓(xùn)的機會改裝了幾個微信小程序、小游戲,尤其是其中的飛機大戰(zhàn)游戲為大家所喜聞樂見,便于加入一些系統(tǒng)設(shè)...
    天空之誠閱讀 6,859評論 0 10
  • 成品已錄制視頻投稿B站(本文目前實現(xiàn)了基礎(chǔ)的游戲功能),點擊觀看本帖曾在百度貼吧直播,但由于人氣低反響差已停更。項...
    大爽老師閱讀 1,677評論 0 3
  • 自言自語:寫這個故事的原因很簡單,這就是我半是虛假半是真實的人生。哈哈哈哈,來一場隨心所欲的胡思亂想三,這大冬天的...
    傅先生和傅暖暖閱讀 211評論 0 1
  • 佛家講智慧,有一個說法,說“智”和“慧”是兩種東西。智是“分別智”,慧是“平等慧”。智,是要把萬事萬物能區(qū)別開來的...
    慧敏教練閱讀 455評論 0 1

友情鏈接更多精彩內(nèi)容