<p>我不确定您的按钮应该如何工作,但我可以告诉您如何修复<code>capitalist</code>函数中的事件处理和逻辑。您的主要问题是使用事件循环来增加数量,而在本例中,您更希望在<code>while</code>循环中使用<code>pygame.mouse.get_pressed</code>,以查看当前按下了哪些鼠标按钮。然后检查<code>mouse_pos</code>是否与某个预定义按钮(<code>pygame.Rect</code>)冲突,并运行所需的代码。你知道吗</p>
<p>绘图代码也应该与事件处理和游戏逻辑分开。我这里有一个完整的工作示例,还有一些补充说明(正如我所说的,我不确定按钮应该如何工作,所以您必须根据需要调整它们):</p>
<pre><code>import pygame, sys
pygame.init()
WHITE = (255,255,255)
BLACK = (0,0,0)
GREEN = pygame.Color('green')
DISPLAYSURF = pygame.display.set_mode((460, 720))
clock = pygame.time.Clock()
cash = 30
amount = 0
barlength = 102
storeBoard = pygame.Surface((102, 40))
storeBoard.fill((100, 100, 250))
# Side note: Define the fonts once here.
Font1 = pygame.font.SysFont('monaco', 24)
Font2 = pygame.font.SysFont('monaco', 40)
def buyDraw(amount, minxbuy, minybuy):
buySurface = Font1.render('{0}'.format(amount), True, BLACK)
buyRect = buySurface.get_rect()
buyRect.midtop = (75, minybuy)
DISPLAYSURF.blit(buySurface, buyRect)
def cashDraw(cash):
cashSurface = Font2.render(' ${0}'.format(cash), True, GREEN)
cashRect = cashSurface.get_rect()
cashRect.midtop = (420, 10)
DISPLAYSURF.blit(cashSurface, cashRect)
# amount of item, cost to buy, time taken to complete action, money per run
def capitalist(amount, cost, timez, gain, minxbuy, maxxbuy, minybuy, maxybuy, minxgain, maxxgain, minygain, maxygain, cash):
pygame.display.set_caption('capitalist loop')
# Define the buttons here.
buy_button = pygame.Rect(minxbuy, minybuy, maxxbuy, maxybuy)
gain_button = pygame.Rect(minxgain, minygain, maxxgain, maxygain)
# Coefficient to calculate the width of the rect for a given time.
coefficient = maxxgain / timez
time = 0
dt = 0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# pygame.mouse.get_pressed() returns a tuple of zeros and ones that
# show you which mouse buttons are currently being held down.
mouse_pressed = pygame.mouse.get_pressed()
mouse_pos = pygame.mouse.get_pos()
# Use the collidepoint method of the rects to see if they collide with the mouse.
# `mouse_pressed[0]` is the left mouse button.
if buy_button.collidepoint(mouse_pos) and mouse_pressed[0] and cash >= cost:
amount += 1
print(cash)
cash -= cost
if gain_button.collidepoint(mouse_pos) and mouse_pressed[0] and amount > 0:
# If the mouse is over the button, increase the timer.
if time < timez: # Stop increasing if max_time is reached.
time += dt
if time >= timez:
time = timez
inc = time * coefficient
# Draw everything and then flip the display.
DISPLAYSURF.fill(WHITE)
pygame.draw.rect(DISPLAYSURF, BLACK, (minxgain, minygain, inc/2, maxygain/2))
pygame.draw.rect(DISPLAYSURF, BLACK, buy_button, 2)
pygame.draw.rect(DISPLAYSURF, BLACK, gain_button, 2)
buyDraw(amount, minxbuy, minybuy)
cashDraw(cash)
pygame.display.flip()
dt = clock.tick(60) / 1000 # dt is the passed time in seconds.
def opening():
pygame.display.set_caption('opening loop')
rect = pygame.Rect(20, 20, 100, 70)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
# Collidepoint with the event.pos to see if the mouse
# collides with the button.
if rect.collidepoint(event.pos):
# Named arguments make the code more readable. Passing
# so many arguments can be a code smell and indicates
# that the code could probably be refactored.
capitalist(
amount=1, cost=10, timez=3, gain=5, minxbuy=21,
maxxbuy=41, minybuy=21, maxybuy=41, minxgain=120,
maxxgain=204, minygain=20, maxygain=41, cash=cash)
DISPLAYSURF.fill(WHITE)
# Draw the orange start button.
pygame.draw.rect(DISPLAYSURF, (200, 100, 10), rect)
pygame.display.flip()
clock.tick(60) # Call clock.tick here as well.
opening()
</code></pre>