前言
前面我们已经完成了游戏主体部分,现在我们要打磨游戏的细节,增加游戏的可玩性。
一、设置开始按钮
我们需要添加一个开始按钮,在我们点击开始按钮之前,游戏静止不动,当我们点击开始之后,游戏正常运行,当游戏结束后,回到初始状态,并出现开始按钮。
首先我们让游戏处于一个静止状态,就是我们之前设置的game_active,将其赋值为False
然后我们就需要在屏幕上放置一个开始按钮了,但是pygame没有直接创建按钮的方法,我们需要自己创建按钮的模块。
import pygame.font class Button(): def __init__(self,new_setting,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)
pygame.font.SysFont(None, 48)是用于创建一个新的字体对象,其中None表示默认字体,48是字体的大小。
我们还调用了prep_msg函数,这个函数的目的是将文字变成图片,然后我们要将变成图片的文字显示在按钮的中间位置。
def prep_msg(self,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
self.font.render(msg, True, self.text_color, self.button_color)是Pygame中用于渲染文本的方法之一。它的作用是将文本字符串msg渲染成一个图像,以便在游戏中显示。在这个方法中,True表示启用抗锯齿功能,即使用高质量的渲染效果;self.text_color和self.button_color分别表示文本的颜色和按钮的颜色。该方法返回一个Surface对象,表示渲染后的文本图像。可以将这个Surface对象绘制到屏幕上,以显示文本 。
二、绘制开始按钮
我们已经完成按钮和按钮上文字的设置工作,现在我们需要将他们显示在屏幕上,首先我们在Button类里创建一个显示函数,然后主函数里调用这个函数。
def draw_button(self): self.screen.fill(self.button_color,self.rect) self.screen.blit(self.msg_image,self.msg_image_rect)
self.screen.fill(self.button_color, self.rect)是Pygame中用于填充屏幕背景色的方法之一。它的作用是将整个屏幕的背景色设置为指定的颜色,以便在游戏中显示。
该方法接受两个参数:color和rect。其中,color是要设置的颜色,可以是RGB元组或颜色名称;rect是一个Rect对象,表示屏幕的矩形区域。
在这个方法中,self.button_color表示要设置的颜色,self.rect表示整个屏幕的矩形区域。
self.screen.blit(self.msg_image, self.msg_image_rect)是Pygame中用于将一个图像绘制到另一个图像上的方法之一。它的作用是将指定的图像绘制到屏幕上的指定位置。
该方法接受三个参数:source、dest和area。其中,source是要绘制的图像,dest是要绘制到的目标位置,area是一个矩形区域,表示要绘制的区域。如果area为None,则只绘制source图像的左上角部分。
在这个方法中,self.msg_image是要绘制的图像,self.msg_image_rect是指定的目标位置。
然后我们在主函数中调用它
play_button = Button(new_setting,screen,'开始') while True: gf.check_events(new_setting,screen,ship,bullets) if stats.game_active: ship.update() gf.update_bullets(new_setting,screen,bullets,aliens) gf.update_aliens(new_setting,stats,screen,ship,aliens,bullets) gf.update_screen(new_setting,screen,ship,bullets,aliens,play_button)
我们首先创建了Button类的实例,然后我们希望每次刷新屏幕的绘制按钮,所以我们将play_button作为传参传入update_screen,我们希望的是游戏静止还没有开始的时候调用,显示开始按钮,所以要加个判断,在stats.game_active等于False的时候执行代码。因此update_screen要加一个传参stats
。
def update_screen(new_setting,screen,stats,ship,bullets,aliens,play_button): screen.fill(new_setting.bg_color) for bullet in bullets.sprites(): bullet.draw_bullet() ship.blitme() aliens.draw(screen) if not stats.game_active: play_button.draw_button() pygame.display.flip()
运行的时候发现中文不显示,也许是字体不对,我们先按照书上用英文play代替。
三、添加点击响应
我们现在已经在屏幕上绘制出开始按钮了,但是它只是显示出来,并没有什么作用。之前我们是监听键盘输入,现在我们需要监听鼠标的点击,当鼠标点击开始按钮的位置时候,我们就开始游戏。
def check_events(new_setting,screen,ship,bullets,stats,play_button): for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type==pygame.KEYDOWN: check_keydown_events(event,new_setting,screen,ship,bullets) elif event.type==pygame.KEYUP: check_keyup_events(event, ship) elif event.type == pygame.MOUSEBUTTONDOWN: mouse_x,mouse_y = pygame.mouse.get_pos() check_play_button(stats,play_button,mouse_x,mouse_y) def check_play_button(stats,play_button,mouse_x,mouse_y): if play_button.rect.collidepoint(mouse_x,mouse_y): stats.game_active = True
很好理解。首先判断监听的事件是否是鼠标点击,然后获取鼠标点击的位置。这里有一个新函数要学习。
play_button.rect.collidepoint(mouse_x, mouse_y)是Pygame中用于检测鼠标点击是否在按钮矩形区域内的方法。其中,play_button是一个pygame.Rect对象,表示一个矩形区域;mouse_x和mouse_y是鼠标的横坐标和纵坐标。
这个方法会返回一个布尔值,如果鼠标点击的位置在play_button矩形区域内,则返回True,否则返回False。这可以用于判断用户是否点击了按钮,以便在游戏中执行相应的操作。
经执行代码,点击开始游戏便开始了,游戏结束后恢复到原始状态,再点击开始又执行。
四、重置游戏进程
在玩游戏的过程中,我们发现游戏结束后,我们再点击开始,小花猫的生命值没有恢复,只有最后一条命,失败一次就重新开始了。因此我们需要在点击开始按钮后,对游戏进行重置。
def check_play_button(stats,play_button,mouse_x,mouse_y,new_setting,aliens,bullets,ship,screen): if play_button.rect.collidepoint(mouse_x,mouse_y): stats.reset_stats() stats.game_active = True aliens.empty() bullets.empty() create_fleet(new_setting,screen,aliens) ship.center_ship()
我们对check_play_button函数进行了修改,在相关调用的时候,参数都要修改这里就不一一列出来了,按照这个修改之后,运行又出现新的问题,之前因为结束将代表活动的参数stats.game_active设置为False,所以开始按钮一直保持在休眠状态,游戏结束后再出现,现在的开始按钮会一直处于活动状态,游戏开始后虽然看不见,但是点击开始按钮的位置,还是能实现点击开始按钮的效果,游戏可以重置,这显然是不合理的,因此我们要加个判断,只有游戏处于非活动状态时,点击才有效。
def check_play_button(stats,play_button,mouse_x,mouse_y,new_setting,aliens,bullets,ship,screen): if play_button.rect.collidepoint(mouse_x,mouse_y) and not stats.game_active: stats.reset_stats() stats.game_active = True aliens.empty() bullets.empty() create_fleet(new_setting,screen,aliens) ship.center_ship()
总结
我们实现了游戏的开始可以按钮控制。点赞!!!