使用带有pygame混音器的pygame keyDown事件时出错

时间:2015-12-01 23:36:49

标签: python-3.x pygame

所以我试图弄乱Pygame模块,并使用pygame.mixerpygame.key。但是,当我运行以下代码块时,它会生成错误。

代码:

import pygame, sys
pygame.mixer.init()

# Assume the sound files exist and are found
kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
    keyPressed = pygame.key.get_pressed()
    if keyPressed[pygame.K_a]:
       pygame.mixer.Sound.play(kick)
    if keyPressed[pygame.K_d]:
       pygame.mixer.Sound.play(clap)

错误讯息:

*** error for object 0x101008fd0: pointer being freed was not allocated

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:2)

您的代码无法正常工作的原因有很多,请参阅下文。

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()

首先,您必须为要运行的pygame创建一个显示窗口。

window = pygame.display.set_mode((600,400))

第二次,请注意您将一个Sound对象分配给kick和clap变量。这些是具有play()方法的Sound对象,可以使用点运算符引用它。这不是一个错误,只是有点不必要。阅读documentation以查看声音和播放()参数。你可以这样做:

kick.play()

最后,这是一种更传统的事件处理方式。

   for event in pygame.event.get():
       if event.type == pygame.KEYDOWN:
           if event.key == pygame.K_a:

答案 1 :(得分:0)

我尝试了修改后的代码,它可以运行 - Linux Mint,Python 2.7.10

import pygame

pygame.init() # init all modules

window = pygame.display.set_mode((600,400)) # required by event

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
    pygame.event.get() # required by get_pressed()

    keyPressed = pygame.key.get_pressed()
    if keyPressed[pygame.K_a]:
        print "A"
        pygame.mixer.Sound.play(kick)
    if keyPressed[pygame.K_d]:
        print "D"
        pygame.mixer.Sound.play(clap)

但是你可以遇到不同的问题我无法帮助你。

答案 2 :(得分:0)

这是一个malloc"双免费"错误。

Multiple people看到了这个错误,在查看了很多网站之后,他们基本上也说了同样的话:

  

当您在调试器中断时,您将了解对象是什么。只需查看调用堆栈,您就会找到释放它的位置。那将告诉你它是哪个对象。   

设置断点的最简单方法是:

     
    
        
  1. 转到“运行” - >显示 - >断点( ALT - 命令 - B
  2.     
  3. 滚动到列表底部并添加符号malloc_error_break
  4.        

以上是链接链接的接受答案。