Python简易游戏菜单教程

一个完整的游戏在它启动的时候,通常设计者还会设计一个电子菜单进行选择。最简单的情况是有一个开始游戏按钮,一个帮助说明按钮,一个退出游戏按钮。每个按钮都有共同的行为,比如能接受单击。当鼠标指针碰到按钮时会换造型。所以在按钮类的设计中就应该给它添加了两个image。在下面的例子中,我们把一个叫image0,另一个叫image1。这两个image放在一个元组中。当鼠标指针在按钮上或移开时,通过设定索引号为0或为1让按钮呈现不同的外观。这个检测是在按钮的update方法中完成的。通过矩形对象的collidepoint方法从而检测鼠标指针的坐标是否在按钮的矩形范围内。

为了能共同刷新及渲染每一个按钮,把它们装到一个容器组中是必然的。在下面的程序中通过pygame.sprite.Group新建了一个名叫menu的角色组。这样,把三个按钮都添加到了menu这个组中,在while循环中就能通过调用menu.update()对所有按钮进行更新,更新后通过调用menu.draw(screen)把所有按钮画在screen上了。

每个按钮都有一个clicked属性。当鼠标指针不在按钮范围内,它的值是False。当鼠标指针在按钮范围内并且单击了时,它的值变成了True。为什么要设计这个属性呢?它能向“外界”表明自己的状态。在同一个时期,只会有一个按钮被选中。这个按钮被单击了应该发生什么行为呢?其实,我们可以给在按钮初始化的时候传递一个回调函数,这样直接执行它的这个回调函数就行了。不过,在本例中,并没有这样做,而只是简单的在while循环中进行判断。如果翻译成汉语大概就是下面的意思:如果帮助按钮被单击了,则在屏幕上渲染帮助信息。如果结束按钮被单击了,则把running设置为False。如果启动游戏的按钮被单击了,那么不仅仅把running设置为False,还会把一个名为start_name的变量的值设为True。这个名为start_name是用来标记是否进入游戏的逻辑变量,以下是电子菜单的代码:

"""
   电子菜单制作,本程序设计了Button类,菜单则由一个组完成。
   每个实例化的按钮有两个造型,以便当碰到鼠标指针时会切换造型。
   
"""
import pygame
from pygame.locals import *

class Button(pygame.sprite.Sprite):
    """
       按钮类型,它有两个造型,当碰与未碰到鼠标指针时会切换到不同造型
    """
    def __init__(self,size,pos,title,bgcolors):
        """
           size:宽高二元组,pos:渲染坐标
           title:标题,bgcolor:背景颜色
           本函数新建两个image,把title贴到这两个image的中心位置。
           
        """
        pygame.sprite.Sprite.__init__(self)
        self.bgcolors= bgcolors           # 两种颜色轮换
        self.index = 0                    # 相当于造型索引
        self.image0 = pygame.Surface(size)# 新建第一个造型
        self.image0.fill(bgcolors[0])
        self.image1 = pygame.Surface(size)# 新建第二个造型
        self.image1.fill(bgcolors[1])
        # 由于两个造型大小相同,这里让它们共用一个中心点
        self.rect = self.image0.get_rect(center=pos)
        x = self.rect.width//2           # 矩形对象中心点x坐标
        y = self.rect.height//2          # 矩形对象中心点y坐标
        
        r = title.get_rect()             # 标题的矩形对象
        r.center = (x,y)                 # 把标题的中心点设为(x,y)
        
        self.image0.blit(title,r)        # 把标题渲染到image0中心
        self.image1.blit(title,r)        # 把标题渲染到image1中心
        self.images = self.image0,self.image1
        self.image = self.images[self.index]         
        self.clicked = False
        
    def update(self):
        """
           更新造型
        """        
        mpos = pygame.mouse.get_pos()      # 获取指针坐标
        if self.rect.collidepoint(mpos):   # 碰到鼠标指针
            ms = pygame.mouse.get_pressed()
            self.index = 1
            self.image = self.images[self.index]          
            if ms[0] and not self.clicked:
                self.clicked = True
        else:
            self.index = 0
            self.image = self.images[self.index]            
            self.clicked = False

You must log in to read the rest of this article. Please log in or register as a user.