我为我的按钮创建了一个功能。我试图让它每次点击运行一次所以我在pygame.event.get()和pygame.MOUSEBUTTONDOWN中集成了事件的行,所以它将注册一次点击,运行一次然后停止直到下一次点击。但现在它根本不起作用。 1.我怎么让它运行 2.如何确保每次点击运行一次,然后重置直到下次点击为止。请显示示例
以下是代码:
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功能中的事件队列,而是检查主游戏循环中的某个位置,然后在发生单击时调用Button功能。它也让我觉得你的Button功能可能更合理地实现为具有不同方法的Button类,例如onClick
。
这是一个带有按钮类和两个按钮的代码的小例子:
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的一个好处是你可以将函数作为参数传递,因此你不必在Button类中指定单击一个按钮时可能采取的操作。而是在需要创建新Button时定义该函数。这使您的代码非常通用。您可以使用简单的字符串替换该部分,然后在self.action()
中调用onClick
,而不是像发布的代码段那样执行if else
个案例。
然后在我们的主类中,我们初始化pygame,然后创建两个按钮(一个灰色没有功能,一个红色带有撤销功能)。为了更容易跟踪它们,我们将它们放在一个列表中,我们可以在以后迭代它。
现在在我们的主游戏循环中,我们检查事件队列中的任何事件,如果发生了某些事件,我们会处理它们。如果单击鼠标,我们将遍历列表中的所有按钮并调用onClick
。然后每个按钮检查他们的onClick
方法是否鼠标单击是否在按钮矩形内,如果是,则执行指定的功能(以及输出调试打印语句)。您可以将onClick
功能修改为单击按钮时需要执行的操作,例如更改按钮的颜色。
如果您还需要在游戏中跟踪其他事件,请使用与我们已完成的主事件队列相同的方式处理它们。然后,做你需要做的其他事情,比如移动精灵或重新绘制已经改变的部分屏幕。