在本章中,我们将结束游戏《外星人入侵》的开发。我们将添加一个Play按钮,用于根据需要启动游戏以及在游戏结束后重启游戏。我们还将修改这个游戏,使其在玩家的等级提高时加快节奏,并实现一个记分系统。阅读本章后,你将掌握足够多的知识,能够开始编写随玩家等级提高而加大难度以及显示得分的游戏。
3.1 添加play按钮
在本节中,我们将添加一个Play按钮,它在游戏开始前出现,并在游戏结束后再次出现,让玩家能够开始新游戏。 当前,这个游戏在玩家运行alien_invasion.py时就开始了。下面让游戏一开始处于非活动状态,并提示玩家单击Play按钮来开始游戏。为此,在game_stats.py中输入如下代码:
class GameStats():
# 跟踪游戏的统计信息
def __init__(self,ai_settings):
# 初始化统计信息
self.ai_settings = ai_settings
self.reset_stats()
# 游戏刚启动时处于非活动状态
self.game_active = False
def reset_stats(self):
# 初始化在游戏运行期间可能变化的统计信息
self.ships_left = self.ai_settings.ship_limit
现在游戏一开始属于非活动状态了。
3.1.1 创建Button类
由于Pygame没有内置创建按钮的方法,我们创建一个Button 类,用于创建带标签的实心矩形。你可以在游戏中使用这些代码来创建任何按钮。下面是Button 类的第一部分, 请将这个类保存为文件button.py:
import pygame.font
class Button():
def __init__(self,ai_settings,screen,msg):
# 初始化按钮属性
self.screen = screen
self.screen_rect = screen.get_rect()
# 设置按钮对尺寸和其他属性
self.width,self.height = 200,50
self.button_color = (0,255,0)
self.text_color = (255,255,255)
self.font = pygame.font.SysFont(None,48)
# 按钮的rect对象,并使其居中
self.rect = pygame.Rect(0,0,self.width,self.height)
self.rect.center = self.screen_rect.center
# 按钮的标签只需创建一次
self.prep_msg(msg)
下面我们来写一下prep_msg()函数:
def prep_msg(self,msg):
# 将msg渲染为图像,并使其在按钮上居中
self.msg_image = self.font.render(msg,True,self.text_color,self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
方法prep_msg() 接受实参self 以及要渲染为图像的文本(msg )。调用font.render() 将存储在msg 中的文本转换为图像,然后将该图像存储在msg_image 中。方法font.render() 还接受一个布尔实参,该实参指定开启还是关闭反锯齿功能(反锯齿让文本的边缘更平滑)。余下的两个实参分别是文本颜色和背景色。我们启用了反锯齿功能,并将文本的背景色设置为按钮的颜色(如果没有指定背景色,Pygame将以透明背景的方式渲染文本)。
然后,我们让文本图像在按钮上居中:根据文本图像创建一个rect ,并将其center 属性设置为按钮的center 属性。 最后,我们创建方法draw_button() ,通过调用它可将这个按钮显示到屏幕上:
def draw_button(self):
# 绘制一个用颜色填充的按钮,再绘制文本
self.screen.fill(self.button_color,self.rect)
self.screen.blit(self.msg_image,self.msg_image_rect)
3.1.2 在屏幕上绘制按钮
我们将使用Button 类来创建一个Play按钮。鉴于只需要一个Play按钮,我们直接在alien_invasion.py中创建它,如下所示:
import pygame
from pygame.sprite import Group
from setting import Settings
from game_stats import GameStats
from button import Button
from ship import Ship
from alien import Alien
import game_functions as gf
def rungame():
#初始化游戏并创建一个屏幕对象
pygame.init()
#实例化设置对象
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
# 创建play按钮
play_button = Button(ai_settings, screen, "玩!")
#创建一个用于存储游戏统计信息的实例
stats = GameStats(ai_settings)
#创建一只飞船
ship = Ship(ai_settings,screen)
#创建一个用于存储子弹的编组
bullets = Group()
#创建一个用于存储敌人的编组
aliens = Group()
# #创建一个外星人
# alien = Alien(ai_settings,screen)
# 创建一群敌人
gf.create_fleet(ai_settings,screen,ship,aliens)
#开始游戏主循环
while True:
gf.check_events(ai_settings,screen,ship,bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings,screen,ship,aliens,bullets)
gf.update_aliens(ai_settings,stats,screen,ship,aliens,bullets)
gf.update_screen(ai_settings,screen,stats,ship,aliens,bullets,play_button)
rungame()
接下来,修改update_screen() ,以便在游戏处于非活动状态时显示Play按钮:
def update_screen(ai_settings,screen,stats,ship,aliens,bullets,play_button):
#每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
#在飞船和外星人后面重绘所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
# 屏幕上绘制飞船#
ship.blitme()
# 屏幕上绘制敌人
# alien.blitme()
aliens.draw(screen)
# 如果游戏处于非活动状态,就绘制按钮
if not stats.game_active:
play_button.draw_button()
#让最近绘制的屏幕可见#
pygame.display.flip()
为让Play按钮位于其他所有屏幕元素上面,我们在绘制其他所有游戏元素后再绘制这个按钮,然后切换到新屏幕。如果你现在运行这个游戏,将在屏幕中央看到一个Play按钮。

就先到这里吧~
网友评论