我有一个我似乎无法解决的问题。我试图找到一种方法来添加一个函数,如退出程序到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()
我使用它上面和下面的位,它确实在我需要它的底角做了一个“退出”图像。但是,我再次坚持这个功能!
答案 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()