石岩网站设计,节约化网站群建设情况,深圳住房和城乡建设厅网站,嘉兴网站推广优化14.1.1 创建 Button 类 由于Pygame没有内置创建按钮的方法#xff0c;我们创建一个Button类#xff0c;用于创建带标签的实心矩形。 你可以在游戏中使用这些代码来创建任何按钮。下面是Button类的第一部分#xff0c;请将这个类保存为 文件button.py#xff1a; button.py …
14.1.1 创建 Button 类 由于Pygame没有内置创建按钮的方法我们创建一个Button类用于创建带标签的实心矩形。 你可以在游戏中使用这些代码来创建任何按钮。下面是Button类的第一部分请将这个类保存为 文件button.py button.py import pygame.font
class Button():
1 def __init__(self, ai_settings, screen, msg):初始化按钮的属性self.screen screenself.screen_rect screen.get_rect()# 设置按钮的尺寸和其他属性
2 self.width, self.height 200, 50self.button_color (0, 255, 0)self.text_color (255, 255, 255)
3 self.font pygame.font.SysFont(None, 48)# 创建按钮的rect对象并使其居中
4 self.rect pygame.Rect(0, 0, self.width, self.height)self.rect.center self.screen_rect.center# 按钮的标签只需创建一次
5 self.prep_msg(msg) 首先我们导入了模块pygame.font它让Pygame能够将文本渲染到屏幕上。方法__init__() 接受参数self对象ai_settings和screen以及msg其中msg是要在按钮中显示的文本见1。 我们设置按钮的尺寸见2然后通过设置button_color让按钮的rect对象为亮绿色并通过设 置text_color让文本为白色。 在见3处我们指定使用什么字体来渲染文本。实参None让Pygame使用默认字体而48 指定了文本的字号。为让按钮在屏幕上居中我们创建一个表示按钮的rect对象见4并将 其center属性设置为屏幕的center属性。 Pygame通过将你要显示的字符串渲染为图像来处理文本。在5处我们调用prep_msg()来处 理这样的渲染。 prep_msg()的代码如下 button.py def prep_msg(self, msg):将msg渲染为图像并使其在按钮上居中
1 self.msg_image self.font.render(msg, True, self.text_color,self.button_color)
2 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中见1。方法font.render()还接受 一个布尔实参该实参指定开启还是关闭反锯齿功能反锯齿让文本的边缘更平滑。余下的两 个实参分别是文本颜色和背景色。我们启用了反锯齿功能并将文本的背景色设置为按钮的颜色 如果没有指定背景色Pygame将以透明背景的方式渲染文本。 在2处我们让文本图像在按钮上居中根据文本图像创建一个rect并将其center属性设 置为按钮的center属性。 最后我们创建方法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对象从而在屏幕上绘制文本图像。至此Button类便创建好了。 14.1.2 在屏幕上绘制按钮 我们将使用Button类来创建一个Play按钮。鉴于只需要一个Play按钮我们直接在 alien_invasion.py中创建它如下所示 alien_invasion.py --snip--
from game_stats import GameStats
from button import Button
--snip--
def run_game():--snip--pygame.display.set_caption(Alien Invasion)# 创建Play按钮
1 play_button Button(ai_settings, screen, Play)
--snip--# 开始游戏主循环while True:--snip--
2 gf.update_screen(ai_settings, screen, stats, ship, aliens, bullets,play_button)
run_game() 我们导入Button类并创建一个名为play_button的实例见1然后我们将play_button传 递给update_screen()以便能够在屏幕更新时显示按钮见2。 接下来修改update_screen()以便在游戏处于非活动状态时显示Play按钮 game_functions.py def update_screen(ai_settings, screen, stats, ship, aliens, bullets,play_button):更新屏幕上的图像并切换到新屏幕--snip--# 如果游戏处于非活动状态就绘制Play按钮if not stats.game_active:play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip() 为让Play按钮位于其他所有屏幕元素上面我们在绘制其他所有游戏元素后再绘制这个按 钮然后切换到新屏幕。如果你现在运行这个游戏将在屏幕中央看到一个Play按钮如图14-1 所示。 14.1.3 开始游戏 为在玩家单击Play按钮时开始新游戏需在game_functions.py中添加如下代码以监视与这 个按钮相关的鼠标事件 game_functions.py def check_events(ai_settings, screen, stats, play_button, ship, bullets):响应按键和鼠标事件for event in pygame.event.get():if event.type pygame.QUIT:--snip--
1 elif event.type pygame.MOUSEBUTTONDOWN:
2 mouse_x, mouse_y pygame.mouse.get_pos()
3 check_play_button(stats, play_button, mouse_x, mouse_y)
def check_play_button(stats, play_button, mouse_x, mouse_y):在玩家单击Play按钮时开始新游戏
4 if play_button.rect.collidepoint(mouse_x, mouse_y):stats.game_active True 我们修改了check_events()的定义在其中添加了形参stats和play_button。我们将使用stats 来访问标志game_active并使用play_button来检查玩家是否单击了Play按钮。 无论玩家单击屏幕的什么地方Pygame都将检测到一个MOUSEBUTTONDOWN事件见1但我 们只想让这个游戏在玩家用鼠标单击Play按钮时作出响应。为此我们使用了pygame.mouse. get_pos()它返回一个元组其中包含玩家单击时鼠标的x和y坐标见2。我们将这些值传递 给函数check_play_button()见3而这个函数使用collidepoint()检查鼠标单击位置是否在 Play按钮的rect内见4。如果是这样的我们就将game_active设置为True让游戏就此开始 在alien_invasion.py中调用check_events()需要传递另外两个实参——stats和play_ button alien_invasion.py # 开始游戏主循环while True:gf.check_events(ai_settings, screen, stats, play_button, ship,bullets)--snip-- 至此你应该能够开始这个游戏了。游戏结束时game_active应为False并重新显示Play 按钮。 14.1.4 重置游戏 前面编写的代码只处理了玩家第一次单击Play按钮的情况而没有处理游戏结束的情况因 为没有重置导致游戏结束的条件。 为在玩家每次单击Play按钮时都重置游戏需要重置统计信息、删除现有的外星人和子弹、 创建一群新的外星人并让飞船居中如下所示 game_functions.py def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,bullets, mouse_x, mouse_y):在玩家单击Play按钮时开始新游戏if play_button.rect.collidepoint(mouse_x, mouse_y):# 重置游戏统计信息
1 stats.reset_stats()stats.game_active True# 清空外星人列表和子弹列表
2 aliens.empty()bullets.empty()# 创建一群新的外星人并让飞船居中
3 create_fleet(ai_settings, screen, ship, aliens)ship.center_ship() 我们更新了check_play_button()的定义使其能够访问ai_settings、stats、ship、aliens 和bullets。为重置在游戏期间发生了变化的设置以及刷新游戏的视觉元素它需要这些对象。 在1处我们重置了游戏统计信息给玩家提供了三艘新飞船。接下来我们将game_active 设置为True这样这个函数的代码执行完毕后游戏就会开始清空编组aliens和bullets见 2创建一群新的外星人并将飞船居中见3。 check_events()的定义需要修改调用check_play_button()的代码亦如此 game_functions.py def check_events(ai_settings, screen, stats, play_button, ship, aliens,bullets):响应按键和鼠标事件for event in pygame.event.get():if event.type pygame.QUIT:--snip--elif event.type pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y pygame.mouse.get_pos()
1 check_play_button(ai_settings, screen, stats, play_button, ship,aliens, bullets, mouse_x, mouse_y) check_events()的定义需要形参aliens以便将它传递给check_play_button()。接下来我 们修改了调用check_play_button()的代码以将合适的实参传递给它见1。 下面来修改alien_invasion.py中调用check_events()的代码以将实参aliens传递给它 alien_invasion.py # 开始游戏主循环while True: gf.check_events(ai_settings, screen, stats, play_button, ship,aliens, bullets)--snip-- 现在每当玩家单击Play按钮时这个游戏都将正确地重置让玩家想玩多少次就玩多少次 往期快速传送门在文章最后
感谢大家的支持欢迎订阅收藏专栏将持续更新