Pygame实战之外星人入侵NO.11——设置开始按钮
程序员文章站
2024-02-16 23:28:22
...
目前的状态是当我们打开游戏时便自动运行了,这样显然不符合逻辑,那我们就设置一个开始按钮,当我们点击它是游戏才开始,这次我们先将这个开始按钮搞出来,后续操作下篇见……
首先我们要将游戏的初始状态设置为非活动状态:
self.game_active=False
在game_sta中将活动状态改为False,这样在主程序中开始时外星人将处于静止状态,接下来我们就要创建一个按钮了,我们在button.py中创建一个Button类,用于创建一个带标签的实心矩形:
import pygame.font
class Button():
def __init__(self,ai_setttings,screen,msg): #msg为要在按钮中显示的文本
"""初始化按钮的属性"""
self.screen=screen
self.screen_rect=screen.get_rect()
self.width,self.height=150,50 #这种赋值方式很不错
self.button_color=(72,61,139) #设置按钮的rect对象颜色为深蓝
self.text_color=(255,255,255) #设置文本的颜色为白色
self.font=pygame.font.SysFont(None,40) #设置文本为默认字体,字号为40
self.rect=pygame.Rect(0,0,self.width,self.height)
self.rect.center=self.screen_rect.center #创建按钮的rect对象,并使其居中
self.deal_msg(msg) #渲染图像
def deal_msg(self,msg):
"""将msg渲染为图像,并将其在按钮上居中"""
self.msg_img=self.font.render(msg,True,self.text_color,self.button_color) #render将存储在msg的文本转换为图像
self.msg_img_rect=self.msg_img.get_rect() #根据文本图像创建一个rect
self.msg_img_rect.center=self.rect.center #将该rect的center属性设置为按钮的center属性
def draw_button(self):
self.screen.fill(self.button_color,self.rect) #填充颜色
self.screen.blit(self.msg_img,self.msg_img_rect) #将该图像绘制到屏幕
Button类一共有三个方法,第一个对按钮的各种属性进行了设置,大家可以查一下pygame中已经写好的几个方法,如pygame.Rect();第二个自定义方法deal_msg()将文本渲染为图像,这里用到了font.render()方法,第一个参数为文本内容,第二个为是否打开反锯齿功能(反锯齿功能会使得文本的边缘更加平滑),第三四个参数分别为文本和按钮的颜色;第三个方法先用fill()方法绘制表示按钮的矩形,然后用blit()方法将其绘制到屏幕,这里blit的两个参数分别表示一幅图像以及与该图像关联的rect对象,时刻注意着我们创建对象时要设置其rect对象……
然后在game_function.py中对update_screen()方法进行修改:
def update_screen(ai_settings,screen,ship,bullets,aliens,sta,button_go):
screen.fill(ai_settings.bg_color) #调用属性设置屏幕的填充颜色
for bullet in bullets.sprites(): #对每个bullets中的小妖怪都调用draw_bullet()方法,重绘所有子弹
bullet.draw_bullet()
ship.blitme() #显示飞船
aliens.draw(screen) #在屏幕上绘制编组中的每个外星人
if not sta.game_active: #如果当前游戏处于非活动状态就调用绘制开始按钮
button_go.draw_button()
pygame.display.flip() #是最近绘制的屏幕可见
倒数两三行是新添加的,button_go对象是在主程序中定义的:
button_go=Button(ai_settings,screen,"GO") #创建开始按钮
在主循环中修改对应方法的参数:
gf.update_screen(ai_settings,screen,ship,bullets,aliens,sta,button_go)
最后别忘了在主程序中导入Button类:
from button import Button
这是运行程序效果是这样的: