2013-12-21 2 views
1

У меня проблема, которую я не могу решить, я попытался найти способ добавить функцию, например, выйти из программы в прямоугольник в pygame. вот код, который у меня есть до сих пор, и я хотел бы добавить функцию закрытия щелчка в поле quit в углу.Pygame, добавление функции quit в прямоугольник

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() 

См я он работает с битами над й ржали и это сделать «Выход» изображение в нижнем углу, где мне нужно, однако Im снова застрял на функцию!

+0

Возможный дубликат [Pygame action при нажатии кнопки мыши на .rect?] (Http: // stackoverflow.com/questions/12150957/pygame-action-when-mouse-click-on-rect) –

ответ

0

Я сделал что-то очень похожее на это, и так, как я его обработал, я составил список в основной программе, в которой были все «внутренние окна» или все, что вы хотите назвать. Всякий раз, когда основная программа получила сигнал от окна, чтобы закрыть его, он удалил его из списка.

Чтобы сделать сигнал, вы захотите создать прямоугольник в том месте, где вы хотите, чтобы кнопка была. Сделайте функцию для «внутреннего окна» и проверите ее для щелчка. Если щелкнуть, функция возвращает что-то вроде 'closed' или что угодно. В основной программе скажите что-то вроде

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

чтобы удалить все закрытые окна.

EDIT:

После просмотра кода немного больше в глубину, это выглядит, как вы делаете это не будет работать. Чтобы добавить прямоугольник, вам нужно будет что-то в вашем главном коде, чтобы сохранить, есть ли прямоугольник. Чтобы закрыть окно, вам придется изменить эту переменную.

Чтобы проверить, следует ли закрыть прямоугольник, создайте еще один прямоугольник, в котором должен быть закрыт текст. Когда этот текст будет нажат, функция возвращает то, что должно быть интерпретировано основным кодом, чтобы закрыть окно.

Ниже приведен базовый пример.

Класс:

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)) 

Обратите внимание, что я объединил свои два оригинальных классов в один, так как я не вижу причин, почему вы никогда не хотите, прямоугольник, но не текст или наоборот. Это довольно простое изменение, если вам это не нравится.

Также обратите внимание, что это закроет окно, если мышь нажата на кнопку, а затем перетащить на нее. Чтобы этого избежать, вам нужно будет передать список, полученный от pygame.event.get(), в качестве аргумента для функции update и выполнить поиск по нему для события MOUSEBUTTONDOWN, но это вызовет ненужные осложнения, которые я пытался избежать.

Основной код:

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

Чтобы сделать прямоугольник появится снова после того, как он был закрыт, просто установите rectOn в True.

+0

Я понял немного, вы могли бы просто объяснить чуть подробнее, пожалуйста, im слегка новый для pygame и python вообще – user3033788

+0

@ user3033788 Дай мне несколько минут, и я отредактирую свой пост. – PygameNerd

+0

Хорошо, спасибо, – user3033788

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()