大家好,我是一个python noob,我正在尝试自己用pygame制作一个hangman游戏,同时尽量避免来自YouTube教程的帮助
我的问题是:
当我将鼠标悬停在按钮上时,按钮会改变颜色(这很好),但即使我仍将鼠标悬停在按钮上,它也会变回原来的颜色。此外,当鼠标悬停在多个按钮上时,按钮的响应性非常差
当我点击一个按钮时,程序认为我在多次点击该按钮。当它多次执行print('clicked!')
行时
最后,当我点击一个按钮来闪动一个精灵时,它只会闪动精灵一小段时间,并自动取消闪动
这是我的代码:
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上的Tim Hangman技术教程中获得了精灵(我只是在没有看到他编写游戏代码的情况下获得了精灵,因为我想尝试自己编写,以便了解更多)。我从技术部得到了我的button课程的代码,还有Tim的视频
首先,在应用程序循环之前,而不是在循环中连续地初始化按钮
将属性
clicked
添加到存储按钮的按钮(类似于visible
属性):单击按钮时设置属性:
现在,您可以根据按钮的
clicked
状态绘制对象:或者,您还可以存储单击变量(
lastLetterClicked
)的最后一个按钮,并根据变量绘制相关内容:好的,让我们从第一个开始,我想这里的一些变化也可能有助于解决其他问题。 nonice,您正在“while run”循环中创建“初始彩色按钮”,这意味着它将一次又一次地发生,但您在event for循环中重新显示按钮,这仅在新事件出现时才会发生。你看到问题了吗?悬停事件发生后的下一分钟,程序将只绘制一个常规按钮! 我得说这条线
conciderd在OOP中是一个坏习惯,因为您不想在类之外更改对象属性。相反,让我们构建一个“设置颜色”方法
然后启动按钮 字母_1=按钮((255,255,255),字母_x1,字母_y1,25,字母表[i])
在游戏开始之前,在while run循环之外
在while循环中,您可以添加一个循环来绘制它们
相关问题 更多 >
编程相关推荐