在Python《外星人入侵》游戏中我们已经完善游戏的结束功能。至此,游戏的基本功能已经完成。
我们还将继续完善游戏,添加一个开始按钮,在游戏开始前出现,并在游戏结束后再次出现,让玩家可以重新开始游戏。
修改游戏状态布尔值变量的值,使游戏一开始处于非活动状态,只有我们在点击了开始按钮之后,布尔值变量game_active的值变为True,游戏处于活动状态。
game_stats.py
def __init__(self,ai_settings): """初始化统计信息""" self.ai_settings = ai_settings self.reset_stats() """让游戏一开始处于非活动状态""" self.game_active = False
创建Button类:
我们创建一个Button类,用于创建带标签的实心矩形。在游戏中可以使用这个类创建任何按钮。
button.py
"""开始按钮类"""import pygame.fontclass 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) # 创建按钮的属性,并使其居中 self.rect = pygame.Rect(0,0,self.width,self.height) self.rect.center = self.screen_rect.center # 按钮的标签只需要创建一次 self.prep_msg(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 def draw_button(self): self.screen.fill(self.button_color,self.rect) self.screen.blit(self.msg_image,self.msg_image_rect)
在Button类中,对我们创建的按钮和显示的文本进行了设置。
在屏幕上绘制按钮:
alien_invasion.py
from button import Buttondef run_game(): # 初始化游戏并创建一个屏幕对象 pygame.init() ...... """创建外星人群""" gf.create_fleet(ai_settings,screen,ship, aliens) """创建开始按钮""" play_button = Button(ai_settings,screen,"Play") # 开始游戏的主循环 while True: ...... gf.update_screen(ai_settings,stats,screen,ship,aliens,bullets,play_button)
首先创建一个Button实例对象play_button,然后将play_button传递给更新屏幕的函数update_screen()。
game_functions.py
def update_screen(ai_settings,stats,screen,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()
开始游戏和重置游戏:
game_functions.py
def check_events(ai_settings,screen,stats,play_button,ship,aliens,bullets): """响应按键和鼠标事件""" for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: check_keydown_events(event,ai_settings,screen,ship,bullets) elif event.type == KEYUP: check_keyup_events(event,ship) elif event.type == MOUSEBUTTONDOWN: mouse_x,mouse_y = pygame.mouse.get_pos() check_play_button(ai_settings,screen,stats,play_button,ship,aliens,bullets,mouse_x,mouse_y)"""检测是否按下开始按钮"""def check_play_button(ai_settings,screen,stats,play_button,ship,aliens,bullets,mouse_x,mouse_y): """在玩家单击Play按钮的时候,开始游戏""" button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y) if button_clicked and not stats.game_active: """隐藏光标""" pygame.mouse.set_visible(False) """重置游戏统计信息""" stats.reset_stats() stats.game_active = True """清空外星人和子弹列表""" aliens.empty() bullets.empty() """创建一群新的外星人,并让飞船居中""" create_fleet(ai_settings,screen,ship,aliens) ship.ship_center()
游戏结束后,再次点击开始按钮的时候,需要重置游戏信息,但必须是游戏处于非活动状态时,才可以,即game_active的值为False。
if button_clicked and not stats.game_active:
需要重置的信息:重置统计信息、删除现有的外星人和子弹、创建一群新的外星人,并让飞船居中。
"""重置游戏统计信息""" stats.reset_stats() stats.game_active = True """清空外星人和子弹列表""" aliens.empty() bullets.empty() """创建一群新的外星人,并让飞船居中""" create_fleet(ai_settings,screen,ship,aliens) ship.ship_center()
此时我们需要修改alien_invasion.py中的check_events()函数,需要传入实参stats、play_button和aliens。
游戏过程中,设置光标不可见:
"""隐藏光标"""pygame.mouse.set_visible(False)
游戏结束后,重新显示光标:
game_functions.py
def ship_hit(ai_settings,stats,score_board,screen,ship,aliens,bullets,bg_music): """响应被外星人撞到的飞船""" if stats.ships_left > 0: ...... else: stats.game_active = False pygame.mouse.set_visible(True)
文章参考书籍《Python编程:从入门到实践》
运行之后,开始屏幕上出现一个开始按钮,只有玩家点击按钮的时候,游戏开始运行。当玩家失去所有的飞船之后,按钮再次出现,游戏暂停。
Python游戏
外星人入侵
Pong游戏
贪吃蛇