星际争霸之小霸王之小蜜蜂(十三)--接着奏乐接着舞

简介: 星际争霸之小霸王之小蜜蜂(十三)--接着奏乐接着舞

前言

前面我们已经完成了游戏主体部分,现在我们要打磨游戏的细节,增加游戏的可玩性。


一、设置开始按钮

我们需要添加一个开始按钮,在我们点击开始按钮之前,游戏静止不动,当我们点击开始之后,游戏正常运行,当游戏结束后,回到初始状态,并出现开始按钮。


首先我们让游戏处于一个静止状态,就是我们之前设置的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()

总结

我们实现了游戏的开始可以按钮控制。点赞!!!

相关文章
星际争霸之小霸王之小蜜蜂(十六)--狂奔的花猫
星际争霸之小霸王之小蜜蜂(十六)--狂奔的花猫
星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾
星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾
星际争霸之小霸王之小蜜蜂(十五)--剧将终场
星际争霸之小霸王之小蜜蜂(十五)--剧将终场
星际争霸之小霸王之小蜜蜂(十四)--资本家的眼泪
星际争霸之小霸王之小蜜蜂(十四)--资本家的眼泪
星际争霸之小霸王之小蜜蜂(十一)--杀杀杀
星际争霸之小霸王之小蜜蜂(十一)--杀杀杀
星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速
星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速
星际争霸之小霸王之小蜜蜂(十二)--猫有九条命
星际争霸之小霸王之小蜜蜂(十二)--猫有九条命
星际争霸之小霸王之小蜜蜂(二)--类的使用
星际争霸之小霸王之小蜜蜂(二)--类的使用
星际争霸之小霸王之小蜜蜂(十七)--究极体
星际争霸之小霸王之小蜜蜂(十七)--究极体