上一篇讲解了背景和音效的操作,本篇继续添加游戏暂停节目、游戏信息展示、游戏开始确认画面,以及敌机刷新控制。
添加游戏暂停
#暂停游戏 exp9添加
def Paused(screen):
pygame.image.save(screen, Image_Pausedbg)
#保存当前游戏图像作为背景
pygame.mixer.music.pause()
#暂停背景音乐
PlaySound(Sound_Pause)
isPause = True
pausedBg = BackGround(screen,Image_Pausedbg,"") #创建相关按钮
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():
# 对不同按钮进行相应
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
函数中调用 Paused
函数就可以加载暂停界面了,运行效果如图:
Paused
函数把用户对按钮的操作,返回给MainControl
函数,MainControl
函数在返回给Main
函数
#exp9 添加对暂停界面操作的相应
getReturn = MainControl(hero, screen, cbSound, cbMusic)
if getReturn:
if getReturn == 'restart':
break
elif getReturn == 'exit':
exit()
else:
pygame.mixer.music.unpause()
返回的是 'restart' ,即重新开始游戏,程序是直接跳出出循环,那么程序也就停止了,所以要有重启的效果,要把程序入口改成循环。也就是调出循环,再次调用Main函数开始游戏。
if __name__ == '__main__' :
while True: #exp 9 添加循环,重新开始游戏才会起作用
Main()
展示游戏信息
添加玩家生命数、当前得分、飞行里程数等等信息
添加玩家生命数展示类
# exp9 添加类 展示玩家生命数
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))
得分、飞行里程数数使用 ShowText
类来创建 (在Main
函数中创建)。
# ex9 Main 函数 添加 展示游戏信息
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
函数循环部分,刷新展示的信息,在函数开始部分添加 变量flyMileage
# 刷新战斗信息显示 ex9 添加
flyMileage += 1 #刷新飞行里程数
showScores.text = str("%010d" % scores)
showScores.display()
showFlyMileage.text = str("%010d" % flyMileage) + "Km"
showFlyMileage.display()
showHealth.display()
pygame.display.update()
这样就完成了游戏信息的展示
程序开始直接进入游戏,会显得突兀,所以我们添加一个游戏开始确认界面。
# 显示LOGO及开始游戏按钮 游戏开始确认界面 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
函数中主循环前面加一个循环,展示一些LOGO信息,添加一个开始确认按钮,跳出这个循环,就达到开始确认的效果。
当前脚本只是在游戏开始,创建了3种不同敌机,作为演示。
实际游戏会按一定规率或随机创建敌机对象,实现敌机刷新。具体的实现方法就比较多,比如使用列表、文件、或者几个变量来保存刷新规则都可以。这里讲解的,使用3个变量,来刷新敌机周期性刷新。
同样把刷新控制封装到一个函数中
#刷新敌机 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
函数讲解
函数通过buildEnemyTiming
buildBossTiming
buildRewardTiming
3个变量来保存敌机刷新的频率。
参照的是传入的flymileage
参数,也就是主循环的次数。通过判断是否可以整除频率变量,来刷新对应的敌机。
比如上面的程序就是,每循环200次,刷新普通敌机一架,循环3000次,刷新Boss一架,循环1000次刷新带补给飞机一架。
在Main
函数中删除之前创建的3架演示敌机
添加BuildEnemyPlane
函数调用,来刷新敌机
# 敌机刷新 exp9添加
BuildEnemyPlane(flyMileage, enemyPlanes, screen, enemyBullets)
注意:flymileage
变量初始值如果是0,那么要在调用函数之前给它+1,不然都能被整除,游戏开始会刷新3架飞机,也可以给它初始值设置为1
至此游戏开发已经完成,下一篇会对Main函数做一个梳理,