<p>pygame使用“更新/绘制循环”模式,通常在游戏开发框架中找到。这个模式由一个大部分是非终止的循环组成,在代码中它是<code>while not gameExit:</code>。在这个循环中,必须通过使用事件标志来处理所有用户输入。例如,您的代码处理<code>QUIT</code>事件。在</p>
<p>但是,您的按钮代码并不是特别适合这种模式。相反,它希望在屏幕上创建一个“按钮”作为某种静态对象,比如基于事件的gui。在</p>
<p>分开第一步,并更新第一步。更新会改变游戏状态,绘图步骤只需检查状态并在屏幕上绘制内容。在您的例子中,更新步骤应该检查鼠标是否在按钮上方,并定义使用的颜色。在</p>
<p>让我们分开:</p>
<pre><code># to be used in the draw step
def draw_button(msg, x, y, width, height, color):
ycrd = int((y + (h / 2)))
r = int(h / 2)
pygame.draw.rect(gameDisplay, color, (x, y, width, height))
pygame.draw.circle(gameDisplay, color, (x, ycrd), r, 0)
pygame.draw.circle(gameDisplay, color, (x + w, ycrd), r, 0)
smallText = pygame.font.SysFont("comicsansms",20)
textSurf, textRect = text_objects(msg, smallText)
textRect.center = ((x + (w / 2)), (y + (h / 2)))
# to be used in the update step
def check_mouse_state_over_box(x, y, width, height):
# I'm returning strings here, but you should use something else like an enum
mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()
if x + (w + (h / 2)) > mouse[0] > x - (h / 2) and y + h > mouse[1] > y:
if click[0] == 1:
return 'click'
else:
return 'hover'
else:
return 'no-relation'
</code></pre>
<p>既然<code>button()</code>函数分离了更新和绘制步骤,您可以在游戏循环中正确地使用它:</p>
^{pr2}$
<hr/>
<p>现在,这应该行得通。但是如果你知道面向对象编程(OOP),你可以定义一个类按钮来保存它的位置和颜色,一个更新方法来检查鼠标并正确地改变按钮的状态,以及一个绘制按钮的draw方法。如果你不懂OOP,这是一个学习OOP的好机会:)</p>