Python项目 | 外星人入侵之记分

记分

目标:添加一个Play按钮,让玩家能够开始游戏,以及游戏结束后再玩。每当玩家消灭一群外星人后,加快游戏的节奏,并添加一个记分系统,让游戏更有挑战性和趣味性。

1、添加Play按钮

Play按钮:它在游戏开始前出现,并在游戏结束后再次出现,让玩家能够开始新游戏。

让游戏一开始处于非活动状态,并提示玩家单击Play按钮来开始游戏。在game_stats.py中输入如下代码:


class GameStats():
    # 跟踪游戏的统计信息
    def __init__(self, ai_settings):
        # 初始化统计信息
        self.ai_settings = ai_settings
        self.reset_status()

        # 游戏刚启动时处于非活动状态
        self.game_active = False

    def reset_status(self):
        # skip

现在游戏一开始将处于非活动状态,等我们创建Play按钮后,玩家才能开始游戏。

【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 = (67, 205, 128)
        self.text_color = (255, 255, 255)
        self.font = pygame.font.SysFont(None, 48)   # 实参None 让Pygame 使用默认字体,48指定文本的字号。

         # 创建按钮的rect对象,并使其居中
        self.rect = pygame.Rect(0, 0, self.width, self.height)
        self.rect.center = self.screen_rect.center

        # 按钮的标签只需创建一次
        self.prep_msg(msg)



Pygame通过将你要显示的字符串渲染为图像来处理文本。在❺处,我们调用prep_msg() 来处理这样的渲染。 prep_msg() 的代码如下:

button.py

    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将以透明背景的方式渲染文本)。

创建方法draw_button() ,通过调用它可将这个按钮显示到屏幕上:

button.py

    def draw_button(self):
        # 描绘一个用颜色填充的按钮,再绘制文本
        self.screen.fill(self.button_color, self.rect)
        self.screen.blit(self.msg_image, self.msg_image_rect)

调用screen.fill() 来绘制表示按钮的矩形,再调用screen.blit() ,并向它传递一幅图像以及与该图像相关联的rect 对象,从而在屏幕上绘制文本图像。

【2】在屏幕上绘制按钮

alien_invasion.py

#skip

from button import  Button

def run_game():
    # skip
    pygame.display.set_caption("Alien Invasion")

    # 创建Play按钮
    play_button = Button(ai_settings,screen,"Play")
    # skip

    
    # 开始游戏的主循环
    while True:
        # skip

        gf.update_screen(ai_settings, screen,stats, ship, aliens, bullets, play_button)

run_game()

修改update_screen() ,以便在游戏处于非活动状态时显示Play按钮:

game_function.py

def update_screen(ai_settings, screen,stats, ship, aliens, bullets, play_button):
    # skip

    # 如果游戏处于非活动状态,绘制Play按钮
    if not stats.game_active:
        play_button.draw_button()
    # 不断更新屏幕,让最近绘制的屏幕可见
    pygame.display.flip()

运行游戏:

【3】开始游戏

需在game_functions.py中添加如下代码,以监视与这个按钮相关的鼠标事件:


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值