あなたはボタンの関数内でイベントキューを確認したいのではなく、どこかにあなたのゲームのメインループで、その後場合はボタンの機能を呼び出すことはありません。ここで
コードがある例を示してください。クリックが発生しました。また、あなたが持っている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
の機能は、ボタンの色を変更するなど、ボタンがクリックされたときに必要な機能に変更できます。
ゲーム内で追跡する必要がある他のイベントがある場合は、メインイベントキューと同様に処理してください。その後、スプライトの移動や変更された画面の部分の再描画など、何をする必要があるかを実行します。
何が問題なのですか?エラーはありますか? –