在pygame中创建一个按钮来控制背景音乐的开启和关闭

Posted

技术标签:

【中文标题】在pygame中创建一个按钮来控制背景音乐的开启和关闭【英文标题】:Create a button to control background music on and off in pygame 【发布时间】:2018-12-22 02:39:33 【问题描述】:

我想在我的游戏中创建一个按钮来控制背景音乐的开启和关闭。第一次点击会停止背景音乐,第二次点击可以恢复音乐。现在我的按钮可以控制音乐的开启和关闭,但是我需要多次点击才能让它起作用,似乎每次都没有捕获点击事件,这是我的代码:

 for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            if 20 + 50 > mouse_position[0] > 20 and 20 + 20 > mouse_position[1] > 20:
                play_music = not play_music
                if play_music:
                    pygame.mixer.music.unpause()
                else:
                    pygame.mixer.music.pause()

  pygame.display.flip()
  clock = pygame.time.Clock()
  clock.tick(15)

【问题讨论】:

【参考方案1】:

你们不需要布尔变量,只需要一个小函数

def toggleMusic():
    if pygame.mixer.music.get_busy():
       pygame.mixer.music.pause()

    else:
       pygame.mixer.music.unpause()

pygame.mixer.music.get_busy() 是您需要的布尔值,因为它会检查音乐是否正在播放。如果正在播放音乐,它将返回 True,反之亦然

【讨论】:

OP如何使用toggleMusic函数?该函数不返回任何变量,也没有输入参数。请更新您的答案。【参考方案2】:

J0hn 的回答是正确的。定义一个布尔变量(例如music_paused = False),当用户点击按钮时切换它,调用pygame.mixer.music.pause停止音乐,调用pygame.mixer.music.unpause恢复音乐流的播放。

我还建议在事件循环 (for event in pygame.event.get():) 中进行碰撞检查,因为每个 pygame.MOUSEBUTTONDOWN 事件应该只单击一次按钮。只要鼠标按下,pygame.mouse.get_pressed() 就会一直点击音乐按钮。

import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
BLUE = pg.Color('dodgerblue1')
pg.mixer.music.load('your_music_file.ogg')
pg.mixer.music.play(-1)

button = pg.Rect(100, 150, 90, 30)
music_paused = False

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True
        elif event.type == pg.MOUSEBUTTONDOWN:
            if button.collidepoint(event.pos):
                # Toggle the boolean variable.
                music_paused = not music_paused
                if music_paused:
                    pg.mixer.music.pause()
                else:
                    pg.mixer.music.unpause()

    screen.fill(BG_COLOR)
    pg.draw.rect(screen, BLUE, button)
    pg.display.flip()
    clock.tick(60)

pg.quit()

【讨论】:

我编辑了我的代码,现在它可以工作了,但有时我必须多次点击才能让它工作。我更新了问题中的代码,请查看我的更新。 您的示例不完整(总是发布minimal but complete examples),但我想我知道是什么导致了问题。在事件循环中,您必须检查事件是否是pygame.MOUSEBUTTONDOWN 事件而不是if click[0] == 1:。只需将此行替换为 if event.type == pygame.MOUSEBUTTONDOWN: 即可。 我再次更新了代码,但它并不总是有效。我的意思是当我点击时,它有时可以暂停|取消暂停,有时不能。是因为时钟频率吗? 这仍然不是完整的例子。添加运行它并重现错误所需的所有代码。缩进似乎不正确,但我不确定这是错误的原因还是您在此处粘贴代码时发生的错误。【参考方案3】:

看起来您有一个pygame.mixer.music.pause(),但没有来自resume。我不确定 pygame 的音乐混音器是如何工作的,但我建议使用在按钮单击时更新的标志

music = 0 默认情况下,如果点击,设置music = 1 然后检查if music == 1: pygame.mixer.music.pause()if music == 0: pygame.mixer.music.unpause()。每次单击按钮时,检查和标记都会更改。

【讨论】:

以上是关于在pygame中创建一个按钮来控制背景音乐的开启和关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS8 的通知窗口中创建按钮?

如何在 iOS 的 xamarin 表单中创建渐变按钮背景

如何在pygame中制作具有透明背景的表面

MP3连接到电脑,要打开音乐文件打不开,电脑提示在控制面板中文件夹选项中创建关联,怎么选择呢?

创建一个在颤动中创建小部件的按钮[关闭]

在android中创建带圆角的按钮[重复]