2016-06-30 10 views
0

私のボタン用の機能を作成しました。私は1回のクリックでそれを実行しようとしているので、pygame.event.get()とpygame.MOUSEBUTTONDOWNのイベントのための行を統合して、ワンクリックを登録し、一度実行してから次のクリックまで停止します。しかし今は全く動作しません。 1.どうすれば実行するのですか 2.クリックごとに1回実行され、次にクリックまで実行されるようにリセットする方法を確認します。ボタンが何も印刷されていません

def Button(msg, x, y, w, h, ic, ac, action=None): 
    mouse = pygame.mouse.get_pos()  
     if x+w > mouse[0] > x and y+h > mouse[1] > y: 
      pygame.draw.rect(window, ac, (x, y, w, h)) 
      for event in pygame.event.get(): 
       if event.type == pygame.MOUSEBUTTONDOWN: 
        pygame.draw.rect(window, lightgrey, (x, y, w, h)) 
        if action == "undo": 
         print("hey") 
        if action == "reset": 
         for row in range(6): 
          for column in range(7): 
           board[row][column] = 0   
        elif action == "quit": 
         pygame.quit() 
         quit() 
+0

何が問題なのですか?エラーはありますか? –

答えて

0

あなたはボタンの関数内でイベントキューを確認したいのではなく、どこかにあなたのゲームのメインループで、その後場合はボタンの機能を呼び出すことはありません。ここで

コードがある例を示してください。クリックが発生しました。また、あなたが持っているButton関数が、onClickのような異なるメソッドを持つButtonクラスとしてより賢明に実装されるように見えます。

は、ここでボタンクラスと2つのボタンとコードの小さな例です:

import pygame 
from pygame.locals import * 

# Screen size 
SCREEN_HEIGHT = 350 
SCREEN_WIDTH = 500 

# Colors 
BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 
GREY = (150, 150, 150) 
RED = (255,0,0) 


# our Button class 
class Button(object): 
    def __init__(self, msg, x, y, w, h, col, action=None): 
     self.msg = msg 
     self.rect = pygame.Rect(x, y, w, h) 
     self.color = col 
     self.action = action # function that will be called on click 

    def draw(self, surface): 
     pygame.draw.rect(surface, self.color, self.rect) 

    def onClick(self, event): 
     # check whether the click was on the button 
     if self.rect.collidepoint(event.pos): 
      print("Button", self.msg, "clicked!") 
      # if an action has been set, do that action 
      if self.action: 
       self.action() 


# initialisation 
pygame.init() 
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) 
done = False 
clock = pygame.time.Clock() 

# list to keep track of our buttons 
buttons = [] 


# define an undo function (will be passed to a button) 
def undo(): 
    print("I'm an undo function!") 

# fill screen with background 
screen.fill(WHITE) 

# button with no function 
btn1 = Button("btn1", 50, 50, 50, 50, GREY) 
btn1.draw(screen) 
buttons.append(btn1) 

# button with an undo function 
btn2 = Button("btn2", 150, 50, 50, 50, RED, undo) 
btn2.draw(screen) 
buttons.append(btn2) 

pygame.display.update() 

while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     if event.type == MOUSEBUTTONDOWN: # mouse was clicked 
      # check for every button whether the mouse click was on the button 
      for button in buttons: 
       button.onClick(event) 

    # do whatever else needs doing 

    pygame.display.flip() #update display (currently not strictly necessary) 

    clock.tick(60) # ensures a maximum of 60 frames per second 

pygame.quit() 

Buttonオブジェクトは、矩形を持っています。これを使用してボタン(指定されたボタンの色で塗りつぶされている)を描画し、ボタンがクリックされたことをマウスがクリックしたかどうかをチェックします。メッセージは、現在、ボタンがクリックされたときにボタンの名前を出力するためにのみ使用されますが、それを使用してボタンやその他の必要なテキストを表示することができます。

ボタンにも関連する機能があります。この関数は、ボタンがクリックされると呼び出されます。 Pythonに関する素晴らしい点の1つは、関数を引数として渡すことができるため、ボタンがクリックされた場合に実行されるアクションをButtonクラスに指定する必要はありません。代わりに、新しいボタンを作成する必要があるときにその関数を定義します。これはコードを非常に汎用性のあるものにします。その部分を単純な文字列に置き換えて、self.action()onClickに呼び出す代わりに、投稿されたコードスニペットのようにif elseのケースを行うことができます。

私たちのメインクラスでは、pygameを初期化してから、2つのボタンを作成します(1つのグレーは機能なし、もう1つは元に戻す機能)。それらを追跡しやすくするために、私たちはそれらを後で繰り返すことができるリストに投げます。

メインループでは、イベントキューをチェックし、発生したイベントがある場合は処理します。マウスがクリックされた場合は、リスト内のすべてのボタンに行き、onClickと呼び出します。次に、すべてのボタンはマウスのボタンがボタンの矩形内にあるかどうかをチェックし、そうであれば指定された関数を実行します(デバッグのprint文も出力します)。 onClickの機能は、ボタンの色を変更するなど、ボタンがクリックされたときに必要な機能に変更できます。

ゲーム内で追跡する必要がある他のイベントがある場合は、メインイベントキューと同様に処理してください。その後、スプライトの移動や変更された画面の部分の再描画など、何をする必要があるかを実行します。

+0

あなたは私の最も重要な最終的な学校の授業を、おめでとうございました。 –

関連する問題