Pygame,将退出函数添加到矩形

时间:2013-12-21 20:19:45

标签: python function pygame exit

我有一个我似乎无法解决的问题。我试图找到一种方法来添加一个函数,如退出程序到Pygame中的矩形。这是我到目前为止的代码。我想在点击退出框中添加一个单击退出功能。

def addRect(self):
    self.rect = pygame.draw.rect(self.screen, (white), (300, 200, 300, 200), 2)
    pygame.display.update()


def addText(self):
    self.screen.blit(self.font.render('Quit', True, (84,84,84)), (550, 375))
    pygame.display.update()

我使用它上面和下面的位,它确实在我需要它的底角做了一个“退出”图像。但是,我再次坚持这个功能!

2 个答案:

答案 0 :(得分:0)

我做了一些与此非常相似的事情,我处理它的方式是我在主程序中创建了一个列表,其中包含所有“内部窗口”或者您想要的任何内容。每当主程序从窗口接收到关闭它的信号时,它就会从列表中删除它。

要制作信号,您需要在按钮所在的位置创建一个矩形。为“内部窗口”创建一个函数,让它测试被点击的矩形。如果单击它,则让函数返回类似'closed'或任何您想要的内容。在主程序中,说出类似

的内容
for window in windows:
    if window.update()=='closed':
        windows.remove(window)

删除任何已关闭的窗口。

编辑:

在更深入地查看您的代码之后,看起来您的工作方式将无法正常工作。要添加一个矩形,您需要在主代码中包含一些东西来存储矩形是否存在。要关闭窗口,您必须更改该变量。

要检查是否应该关闭rect,请创建另一个矩形,该矩形应该是关闭窗口的文本。单击此文本时,让函数返回主代码应解释的内容以关闭窗口。

基本示例如下所示。

班级:

def update(self):
    #set up the test rect
    text=self.font.render('Quit', True, (84,84,84))
    textrect=text.get_rect()
    textrect.topleft=(550, 375)
    #see if the button is pressed
    if textrect.collidepoint(pygame.mouse.get_pos()) and pygame.mouse.get_pressed()[0]:
        return 'closed'
    #render stuff
    self.rect = pygame.draw.rect(self.screen, (white), (300, 200, 300, 200), 2)
    self.screen.blit(text, (550, 375))

请注意,我将两个原始类合并为一个,因为我没有看到你为什么想要使用rect而不是文本的原因,反之亦然。如果您不喜欢,这是一个非常简单的变化。

另请注意,如果从按钮上按下鼠标,然后将鼠标拖到按钮上,这将关闭窗口。为避免这种情况,您必须将pygame.event.get()中获得的列表作为update函数的参数传递,并在其中搜索MOUSEBUTTONDOWN事件,但这会导致不必要的复杂化我试图避免。

主要代码:

rectOn=False
while True:
    if rectOn:
        if rect.update()=='closed':
            rectOn=False

要在矩形关闭后再次显示,只需将rectOn设置为True

答案 1 :(得分:0)

A做了一个小例子,你可以继续工作。它们不是按钮返回点击的东西,而是为点击分配了一个功能。

import pygame,sys
from pygame.locals import *

screen_color = (0,0,0)

class Button:
    def __init__(self,pos,action):
        self.rect = pygame.Rect(pos)
        self.action = action
    def draw(self,screen):
        pygame.draw.rect(screen, (255,255,255), self.rect)
    def checkCollide(self,x,y):
        return self.rect.collidepoint(x,y)

    def do(self):
        self.action()


def action():
    global screen_color
    screen_color = (255,255,0)


pygame.init()

screen = pygame.display.set_mode((640,360),0,32)
buttons = []

buttons.append(Button((10,10,50,50),action))

while True:
    screen.fill(screen_color)
    for button in buttons:
        button.draw(screen)

    pygame.display.flip()

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == MOUSEBUTTONDOWN:
            x,y = pygame.mouse.get_pos()
            for button in buttons:
                if (button.checkCollide(x,y)):
                    button.do()