9

我正在 pygame 中制作游戏,在第一个屏幕上我希望有一些按钮,您可以按下这些按钮来 (i) 开始游戏,(ii) 加载带有说明的新屏幕,以及 (iii) 退出程序。

我在网上找到了这个用于制作按钮的代码,但我不太明白(我不太擅长面向对象的编程)。如果我能得到一些关于它在做什么的解释,那就太好了。此外,当我使用它并尝试使用文件路径在我的计算机上打开文件时,我收到错误 sh: filepath :Permission denied,我不知道如何解决。

#load_image is used in most pygame programs for loading images
def load_image(name, colorkey=None):
    fullname = os.path.join('data', name)
    try:
        image = pygame.image.load(fullname)
    except pygame.error, message:
        print 'Cannot load image:', fullname
        raise SystemExit, message
    image = image.convert()
    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image, image.get_rect()
class Button(pygame.sprite.Sprite):
    """Class used to create a button, use setCords to set 
        position of topleft corner. Method pressed() returns
        a boolean and should be called inside the input loop."""
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = load_image('button.png', -1)

    def setCords(self,x,y):
        self.rect.topleft = x,y

    def pressed(self,mouse):
        if mouse[0] > self.rect.topleft[0]:
            if mouse[1] > self.rect.topleft[1]:
                if mouse[0] < self.rect.bottomright[0]:
                    if mouse[1] < self.rect.bottomright[1]:
                        return True
                    else: return False
                else: return False
            else: return False
        else: return False
def main():
    button = Button() #Button class is created
    button.setCords(200,200) #Button is displayed at 200,200
    while 1:
        for event in pygame.event.get():
            if event.type == MOUSEBUTTONDOWN:
                mouse = pygame.mouse.get_pos()
                if button.pressed(mouse):   #Button's pressed method is called
                    print ('button hit')
if __name__ == '__main__': main()

感谢任何可以帮助我的人。

4

6 回答 6

12

我没有适合您的代码示例,但我会怎么做:

  1. 创建一个 Button 类,将按钮上的文本作为构造函数参数
    1. 创建一个 PyGame 表面,可以是图像或填充的 Rect
    2. 使用 Pygame 中的 Font.Render 内容在其上渲染文本
  2. Blit到游戏屏幕,保存那个矩形。
  3. 在鼠标单击时检查,以查看 mouse.get_pos() 与矩形中的坐标匹配,该坐标由按钮的 blit 返回到主表面。

这与您的示例所做的类似,尽管仍然不同。

于 2012-04-16T05:26:51.140 回答
2

在 pygame(在 Python 中)上创建按钮的另一种好方法是安装名为pygame_widgets ( pip3 install pygame_widgets) 的包。

# Importing modules
import pygame as pg
import pygame_widgets as pw

# Creating screen
pg.init()
screen = pg.display.set_mode((800, 600))
running = True
button = pw.Button(
    screen, 100, 100, 300, 150, text='Hello',
    fontSize=50, margin=20,
    inactiveColour=(255, 0, 0),
    pressedColour=(0, 255, 0), radius=20,
    onClick=lambda: print('Click')
)

在跑步的时候:

events = pg.event.get()
for event in events:
    if event.type == pg.QUIT:
        running = False
button.listen(events)
button.draw()
pg.display.update()
于 2020-07-16T17:03:35.103 回答
1

您在网上找到的“代码”不是那么好。您只需要制作一个按钮就是这个。将其放在代码的开头附近:

def Buttonify(Picture, coords, surface):
    image = pygame.image.load(Picture)
    imagerect = image.get_rect()
    imagerect.topright = coords
    surface.blit(image,imagerect)
    return (image,imagerect)

将以下内容放入您的游戏循环中。同样在你的游戏循环中的某个地方:

Image = Buttonify('YOUR_PICTURE.png',THE_COORDS_OF_THE_BUTTON'S_TOP_RIGHT_CORNER, THE_NAME_OF_THE_SURFACE)

也把它放在你的游戏循环中,无论你做了什么for event in pygame.event.get

if event.type == MOUSEBUTTONDOWN and event.button == 1:
     mouse = pygame.mouse.getpos
     if Image[1].collidrect(mouse):
        #code if button is pressed goes here

因此, buttonify 加载将在按钮上的图像。此图像必须是 .jpg 文件或与代码位于同一目录中的任何其他 PICTURE 文件。图片就是它的名字。名称后面必须有 .jpg 或其他任何内容,并且名称必须用引号引起来。Buttonify 中的 coords 参数是从 pygame 打开的屏幕或窗口的右上角坐标。表面是这个东西:

blahblahblah = pygame.surface.set_mode((WindowSize))
 /|\
  |
  Surface's Name

因此,该函数创建了一个名为“image”的东西,它是一个 pygame 表面,它在其周围放置了一个名为“imagerect”的矩形(将其设置在一个位置并在 blitting 时设置第二个参数),然后设置它的位置,然后将它放在倒数第二行。

下一段代码使“Image”成为“image”和“imagerect”的元组。

最后一个代码if event.type == MOUSEBUTTONDOWN and event.button == 1:基本上意味着如果按下鼠标左键。此代码必须在for event in pygame.event.get. 下一行使鼠标成为鼠标位置的元组。最后一行检查鼠标是否与 Image[1] 碰撞,我们知道它是“imagerect”。代码如下。

告诉我是否需要进一步解释。

于 2017-03-31T05:13:25.080 回答
0

这是我多年前制作的按钮类: https ://www.dropbox.com/s/iq5djllnz0tncc1/button.py?dl= 0 据我所知,该按钮是 Windows 7 风格,但我没有去过最近能够测试它,因为我正在使用的计算机上没有 pygame。希望这可以帮助!

于 2017-07-20T09:46:48.143 回答
0

这是由其他人发布的课程的修改版本,该课程对我来说非常相似(但已关闭)的问题。

class Button():
    def __init__(self, color, x,y,width,height, text=''):
        self.color = color
        self.ogcol = color
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.text = text

    def draw(self,win,outline=None):
        #Call this method to draw the button on the screen
        if outline:
            pygame.draw.rect(win, outline, (self.x-2,self.y-2,self.width+4,self.height+4),0)
            
        pygame.draw.rect(win, self.color, (self.x,self.y,self.width,self.height),0)
        
        if self.text != '':
            font = pygame.font.SysFont('Consolas', 24)
            text = font.render(self.text, 1, (0,0,0))
            win.blit(text, (self.x + (self.width/2 - text.get_width()/2), self.y + (self.height/2 - text.get_height()/2)))

    def isOver(self, pos):
        global STATE
        #Pos is the mouse position or a tuple of (x,y) coordinates
        if pos[0] > self.x and pos[0] < self.x + self.width:
            if pos[1] > self.y and pos[1] < self.y + self.height:
                self.color = (128,128,128)
            else:
                self.color = self.ogcol
        else:
            self.color = self.ogcol
        global ev
        for event in ev:
            if event.type == pygame.MOUSEBUTTONDOWN:
                if pos[0] > self.x and pos[0] < self.x + self.width:
                    if pos[1] > self.y and pos[1] < self.y + self.height:
                        return True

变量ev将是事件列表 ( pygame.event.get())。它的一些示例语法是

#class up here
btn = Button((255,0,0),100,100,200,50,text="print hi")
#do above before you start the loop
#all of the pygame init and loop
#Define screen as the window

btn.draw(screen)
if btn.isOver(pygame.mouse.get_pos()) == True:
    print("hi")
pygame.display.update()
于 2021-10-17T18:40:08.403 回答
0

所以你必须创建一个名为 button 的函数,它接收 8 个参数。1)按钮的消息 2)按钮左上角的X位置 3)按钮左上角的Y位置 4)按钮的宽度 5)按钮的高度 6)非活动颜色(背景色) 7)活动颜色(悬停时的颜色) 8)您要执行的操作的名称

def button (msg, x, y, w, h, ic, ac, action=None ):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    if (x+w > mouse[0] > x) and (y+h > mouse[1] > y):
        pygame.draw.rect(watercycle, CYAN, (x, y, w, h))
        if (click[0] == 1 and action != None):
            if  (action == "Start"):
                game_loop()
            elif  (action == "Load"):
                 ##Function that makes the loading of the saved file##
            elif  (action == "Exit"):
                pygame.quit()

    else:
        pygame.draw.rect(watercycle, BLUE, (x, y, w, h))
        smallText = pygame.font.Font("freesansbold.ttf", 20)
        textSurf, textRect = text_objects(msg, smallText)
        textRect.center = ( (x+(w/2)), (y+(h/2)) )
        watercycle.blit(textSurf, textRect)

因此,当您创建游戏循环并调用按钮功能时:

按钮(“开始”、600、120、120、25、蓝色、青色、“开始”)

于 2017-07-20T00:42:37.120 回答