gpt4 book ai didi

python - 我怎样才能让 pygame 中的按钮正常工作? (刽子手游戏)

转载 作者:行者123 更新时间:2023-12-02 19:17:12 33 4
gpt4 key购买 nike

嗨,我是一名 Python 菜鸟,我正在尝试自己用 pygame 制作一个刽子手游戏,同时尽可能避免 YouTube 教程的帮助。

我的问题是:

  1. 当我将鼠标悬停在按钮上时,按钮会改变颜色(这很好),但即使我仍然将鼠标悬停在按钮上,它也会变回来。此外,当鼠标悬停在多个按钮上时,按钮的响应能力非常差。

  2. 当我单击按钮时,程序认为我多次单击该按钮。因为它多次执行 print('clicked!') 行。

  3. 最后,当我单击按钮来位图传送 Sprite 时,它只会传送 Sprite 一小会儿,然后会自动取消位图传送。

这是我的代码:

import pygame
pygame.init()

# DISPLAY
WIDTH, HEIGHT = 800, 500
window = pygame.display.set_mode((WIDTH, HEIGHT))
# TITLE BAR
TITLE = "Hangman"
pygame.display.set_caption(TITLE)
# HANGMAN SPRITES
man = [pygame.image.load(f"hangman{frame}.png") for frame in range(0, 7)]


class Button:

def __init__(self, color, x, y, radius, text=""):
self.radius = radius
self.color = color
self.x = x
self.y = y
self.width = 2
self.text = text
self.visible = True

def draw(self, window, outline=None):
if self.visible:
if outline:
# draws a bigger circle behind
pygame.draw.circle(window, outline, (self.x, self.y), self.radius + 2, 0)
pygame.draw.circle(window, self.color, (self.x, self.y), self.radius, 0)

if self.text != "":
if self.visible:
font = pygame.font.SysFont("courier", 30)
text = font.render(self.text, 1, (0, 0, 0))
window.blit(text, (self.x - text.get_width() / 2, self.y - text.get_height() / 2))

def hover(self, pos):
if self.y + self.radius > pos[1] > self.y - self.radius:
if self.x + self.radius > pos[0] > self.x - self.radius:
return True
return False


def main():
run = True
FPS = 60
clock = pygame.time.Clock()
large_font = pygame.font.SysFont("courier", 50)

letters = []
error = 0

def redraw_window():
window.fill((255, 255, 255))

window.blit(man[0], (20, 100))
# DRAWS LETTER BUTTONS
for letter in letters:
letter.draw(window, (0, 0, 0))
pygame.display.update()

while run:
redraw_window()
clock.tick(FPS)

alphabet = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
letter_x1, letter_y1 = 40, 375
letter_x2, letter_y2 = 40, 435
for i in range(13):
letter_1 = Button((255, 255, 255), letter_x1, letter_y1, 25, alphabet[i])
letters.append(letter_1)
letter_x1 += 60
for i in range(13, 26):
letter_2 = Button((255, 255, 255), letter_x2, letter_y2, 25, alphabet[i])
letters.append(letter_2)
letter_x2 += 60

for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == pygame.MOUSEMOTION:
for letter in letters[:]:
if letter.hover(pygame.mouse.get_pos()):
letter.color = (0, 255, 0)
else:
letter.color = (255, 255, 255)
elif event.type == pygame.MOUSEBUTTONDOWN:
for letter in letters:
if letter.hover(pygame.mouse.get_pos()):
print("clicked!")
window.blit(man[1], (20, 100))
pygame.display.update()
quit()
main()

另外,我从 YouTube 上的 Tech With Tim Hangman 教程中获得了 Sprite (我只是在没有看他编写游戏代码的情况下获得了 Sprite ,因为我想尝试自己做,这样我可以了解更多)。我还从 Tech With Tim 的视频中获得了按钮类的代码。

最佳答案

首先在应用程序循环之前初始化按钮,而不是在循环中连续进行

def main():

# init buttons
alphabet = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
letter_x1, letter_y1 = 40, 375
letter_x2, letter_y2 = 40, 435
for i in range(13):
letter_1 = Button((255, 255, 255), letter_x1, letter_y1, 25, alphabet[i])
letters.append(letter_1)
letter_x1 += 60
for i in range(13, 26):
letter_2 = Button((255, 255, 255), letter_x2, letter_y2, 25, alphabet[i])
letters.append(letter_2)
letter_x2 += 60

# application loop
while run:
# [...]

给按钮添加一个属性clicked,用于存储按钮(类似visible属性):

class Button:

def __init__(self, color, x, y, radius, text=""):
# [...]

self.visible = True
self.clicked = False

单击按钮时设置属性:

def main():
# [...]

while run:
# [...]
for event in pygame.event.get():
# [...]
elif event.type == pygame.MOUSEBUTTONDOWN:
for letter in letters:
if letter.hover(pygame.mouse.get_pos()):
letter.clicked = True

现在您可以根据按钮的单击状态绘制对象:

def main():
# [...]

def redraw_window():
window.fill((255, 255, 255))

window.blit(man[0], (20, 100))
# DRAWS LETTER BUTTONS
for letter in letters:
letter.draw(window, (0, 0, 0))

if letter.clicked:
# [...]

pygame.display.update()

# [...]
while run:
redraw_window()
# [...]

或者或者另外,您可以将最后单击的按钮存储到变量(lastLetterClicked)并根据该变量绘制一些内容:

def main():
# [...]

def redraw_window():
# [...]

if lastLetterClicked:
# [...]

pygame.display.update()

lastLetterClicked = None
while run:
redraw_window()
# [...]

for event in pygame.event.get():
# [...]
elif event.type == pygame.MOUSEBUTTONDOWN:
for letter in letters:
if letter.hover(pygame.mouse.get_pos()):
# [...]
lastLetterClicked = letter

# [...]

关于python - 我怎样才能让 pygame 中的按钮正常工作? (刽子手游戏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63547822/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com