上一篇講解了背景和音效的操作,本篇繼續(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ù)中調(diào)用 Paused函數(shù)就可以加載暫停界面了,運行效果如圖:

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ù)做一個梳理,