- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,我是一名 Python 菜鸟,我正在尝试自己用 pygame 制作一个刽子手游戏,同时尽可能避免 YouTube 教程的帮助。
我的问题是:
当我将鼠标悬停在按钮上时,按钮会改变颜色(这很好),但即使我仍然将鼠标悬停在按钮上,它也会变回来。此外,当鼠标悬停在多个按钮上时,按钮的响应能力非常差。
当我单击按钮时,程序认为我多次单击该按钮。因为它多次执行 print('clicked!')
行。
最后,当我单击按钮来位图传送 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/
我正在制作刽子手游戏。一切正常,我已经准备好用于使游戏失败并为猜测提供 -1 的代码。虽然将它添加到 else 语句时它会重复等于单词的长度并且它也会给出一个猜测——即使它是正确的?我看不出代码有什么
我是一名 Javascript 学生,正在开发我的 Hangman 游戏。我用于显示 secret 单词的正确破折号数量的循环不起作用。每次只显示一个破折号。感谢帮助。谢谢。 $(document).
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关于您编写的代码问题的问题必须在问题本身中描述具体问题 — 并且包括有效代码 以重现它。参见 SSC
print("Welcome to hangman. Are you ready to have some fun?") def play(): import random List = ["ra
我刚刚开始学习 Java 作为我的第一门编程语言。 在类里面,我们被分配使用 while 和 for 循环制作一个基本的 Hangman 游戏。 到目前为止我有什么 当用户输入第一个猜测时,它确实识别
我是编程新手。我正在做一个经典的刽子手游戏,但我希望它是从节目中猜测一些角色的名字(名字和姓氏)。 我的问题:破折号打印 name 和 surname 之间的空格而不是忽略它,例如: 密语:鲁伯特·吉
我正在尝试创建一个刽子手游戏,其中每个字母都有一个按钮。我用绝对定位和多个 Action 监听器以困难的方式做到了这一点。有什么办法可以用 for 循环同时完成这两个任务吗? 另外,如何使用多态数组实
我是 Java 新手,所以这听起来可能很傻。 我正在尝试从 Java 创建一个基于 GUI 的刽子手游戏。我已经从数组创建了按钮列表,单击时它返回单个字母作为字符。我有要猜测的单词列表,每次按下按钮时
我已经研究这段代码有一段时间了。我尝试了许多不同的方法来查找玩家在随机生成的单词中正确猜测的输入的索引 - 我认为我当前编写的内容应该有效,但我担心我忽略了一个非常简单的错误。事实上,每当我运行代码时
在我的 Hangman 应用程序中,我为用户创建了一组按钮,然后从文件中随机选择 Hangman 应用程序中猜测的单词...该单词使用 JLabel 打印...但是一旦单击按钮时,应用程序会卡住。谁能
我正在为我的 C 课编程编写一个刽子手程序。我似乎不知道如何执行最后一步,即在玩家猜出所有正确的字母后停止游戏。我感觉问题出在播放功能上。 #include #include #inc
用 python 编写一个 Hangman 程序,在传入一个包含多单词字符串和单单词字符串的文件时遇到了一个问题。 文件: 你好棕色狐狸 狗 猫 水 跳跃 #initialize list wordL
所以我在玩这个游戏的特定部分时遇到了问题。这些是我的初始变量: var words = ["sugar","banana","hulk"]; var guessLeft = 12; var wrong
我是一名优秀的程序员,十分优秀!