当前位置:   article > 正文

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

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

系列文章目录

星际争霸之小霸王之小蜜蜂(十二)--猫有九条命

 星际争霸之小霸王之小蜜蜂(十一)--杀杀杀

 星际争霸之小霸王之小蜜蜂(十)--鼠道

星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾

 星际争霸之小霸王之小蜜蜂(八)--蓝皮鼠和大脸猫

 星际争霸之小霸王之小蜜蜂(七)--消失的子弹

 星际争霸之小霸王之小蜜蜂(六)--让子弹飞

 星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速

 星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来


目录

系列文章目录

文章目录

前言

一、设置开始按钮

二、绘制开始按钮

 三、添加点击响应

 四、重置游戏进程

总结


前言

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


一、设置开始按钮

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

首先我们让游戏处于一个静止状态,就是我们之前设置的game_active,将其赋值为False

然后我们就需要在屏幕上放置一个开始按钮了,但是pygame没有直接创建按钮的方法,我们需要自己创建按钮的模块。

  1. import pygame.font
  2. class Button():
  3. def __init__(self,new_setting,screen,msg):
  4. self.screen = screen
  5. self.screen_rect =screen.get_rect()
  6. #设置按钮的尺寸
  7. self.width,self.height = 200,50
  8. self.button_color = (0,255,0)
  9. self.text_color = (255,255,255)
  10. self.font = pygame.font.SysFont(None,48)
  11. #创建按钮的rect对象
  12. self.rect = pygame.Rect(0,0,self.width,self.height)
  13. self.rect.center = self.screen_rect.center
  14. self.prep_msg(msg)

 pygame.font.SysFont(None, 48)是用于创建一个新的字体对象,其中None表示默认字体,48是字体的大小。

 我们还调用了prep_msg函数,这个函数的目的是将文字变成图片,然后我们要将变成图片的文字显示在按钮的中间位置。

  1. def prep_msg(self,msg):
  2. self.msg_image= self.font.render(msg,True,self.text_color,self.button_color)
  3. self.msg_image_rect = self.msg_image.get_rect()
  4. 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类里创建一个显示函数,然后主函数里调用这个函数。

  1. def draw_button(self):
  2. self.screen.fill(self.button_color,self.rect)
  3. 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是指定的目标位置。

 

 然后我们在主函数中调用它

  1. play_button = Button(new_setting,screen,'开始')
  2. while True:
  3. gf.check_events(new_setting,screen,ship,bullets)
  4. if stats.game_active:
  5. ship.update()
  6. gf.update_bullets(new_setting,screen,bullets,aliens)
  7. gf.update_aliens(new_setting,stats,screen,ship,aliens,bullets)
  8. gf.update_screen(new_setting,screen,ship,bullets,aliens,play_button)

 我们首先创建了Button类的实例,然后我们希望每次刷新屏幕的绘制按钮,所以我们将play_button作为传参传入update_screen,我们希望的是游戏静止还没有开始的时候调用,显示开始按钮,所以要加个判断,在stats.game_active等于False的时候执行代码。因此update_screen要加一个传参stats。

 

  1. def update_screen(new_setting,screen,stats,ship,bullets,aliens,play_button):
  2. screen.fill(new_setting.bg_color)
  3. for bullet in bullets.sprites():
  4. bullet.draw_bullet()
  5. ship.blitme()
  6. aliens.draw(screen)
  7. if not stats.game_active:
  8. play_button.draw_button()
  9. pygame.display.flip()

 运行的时候发现中文不显示,也许是字体不对,我们先按照书上用英文play代替。

 

 三、添加点击响应

 我们现在已经在屏幕上绘制出开始按钮了,但是它只是显示出来,并没有什么作用。之前我们是监听键盘输入,现在我们需要监听鼠标的点击,当鼠标点击开始按钮的位置时候,我们就开始游戏。

  1. def check_events(new_setting,screen,ship,bullets,stats,play_button):
  2. for event in pygame.event.get():
  3. if event.type == pygame.QUIT:
  4. sys.exit()
  5. elif event.type==pygame.KEYDOWN:
  6. check_keydown_events(event,new_setting,screen,ship,bullets)
  7. elif event.type==pygame.KEYUP:
  8. check_keyup_events(event, ship)
  9. elif event.type == pygame.MOUSEBUTTONDOWN:
  10. mouse_x,mouse_y = pygame.mouse.get_pos()
  11. check_play_button(stats,play_button,mouse_x,mouse_y)
  12. def check_play_button(stats,play_button,mouse_x,mouse_y):
  13. if play_button.rect.collidepoint(mouse_x,mouse_y):
  14. 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。这可以用于判断用户是否点击了按钮,以便在游戏中执行相应的操作。

经执行代码,点击开始游戏便开始了,游戏结束后恢复到原始状态,再点击开始又执行。

 四、重置游戏进程

 在玩游戏的过程中,我们发现游戏结束后,我们再点击开始,小花猫的生命值没有恢复,只有最后一条命,失败一次就重新开始了。因此我们需要在点击开始按钮后,对游戏进行重置。

  1. def check_play_button(stats,play_button,mouse_x,mouse_y,new_setting,aliens,bullets,ship,screen):
  2. if play_button.rect.collidepoint(mouse_x,mouse_y):
  3. stats.reset_stats()
  4. stats.game_active = True
  5. aliens.empty()
  6. bullets.empty()
  7. create_fleet(new_setting,screen,aliens)
  8. ship.center_ship()

 我们对check_play_button函数进行了修改,在相关调用的时候,参数都要修改这里就不一一列出来了,按照这个修改之后,运行又出现新的问题,之前因为结束将代表活动的参数stats.game_active设置为False,所以开始按钮一直保持在休眠状态,游戏结束后再出现,现在的开始按钮会一直处于活动状态,游戏开始后虽然看不见,但是点击开始按钮的位置,还是能实现点击开始按钮的效果,游戏可以重置,这显然是不合理的,因此我们要加个判断,只有游戏处于非活动状态时,点击才有效。

  1. def check_play_button(stats,play_button,mouse_x,mouse_y,new_setting,aliens,bullets,ship,screen):
  2. if play_button.rect.collidepoint(mouse_x,mouse_y) and not stats.game_active:
  3. stats.reset_stats()
  4. stats.game_active = True
  5. aliens.empty()
  6. bullets.empty()
  7. create_fleet(new_setting,screen,aliens)
  8. ship.center_ship()

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/134445
推荐阅读
相关标签
  

闽ICP备14008679号