2012-04-18 62 views
0

有时我在游戏中得到这个奇怪的错误:奇怪的声音错误

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
at com.efg.framework_mod::SoundManager/playSound()[/Users/xxx/Documents/Developer/AS3_Flex/game_development/projects/xxx/SpaceGame/libs/src/com/efg/framework_mod/SoundManager.as:106] 
at com.xxx.games.spacegame::Main/soundEventListener()[/Users/xxx/Documents/Developer/AS3_Flex/game_development/projects/xxx/SpaceGame/src/com/xxx/games/spacegame/Main.as:1407] 
at flash.events::EventDispatcher/dispatchEventFunction() 
at flash.events::EventDispatcher/dispatchEvent() 
at com.xxx.games.spacegame::SpaceGame/createEnemyProj()[/Users/xxx/Documents/Developer/AS3_Flex/game_development/projects/xxx/SpaceGame/src/com/xxx/games/spacegame/SpaceGame.as:3708] 

我仍然不知道是什么原因造成的错误。我发现的唯一的事情是有时候我的SoundManager中有一个对象是空的。但我不知道为什么。我已经检查了所有适当的数组,如果缺少某些东西,但在那里似乎都没问题。这是一个非常讨厌的bug,现在持续数周。请 - 我需要你的帮助才能摆脱这个错误,以完成我的比赛。非常感谢你。

这是发生错误的SoundManager类的部分:

public function playSound(soundName:String, isSoundTrack:Boolean = false, loops:int = 1, offset:Number = 0, _volume:Number = 1, fadeIn:Boolean = false, 
           _duration:Number = 1):void { 



    tempSoundTransform.volume = _volume; 


    tempSound = sounds[soundName];//sometimes null (still don't know why) 

    if (!fadeIn) { 
     if (isSoundTrack) { 
      if (soundTrackChannel != null) { 
       soundTrackChannel.stop(); 
      } 
      soundTrackChannel = tempSound.play(offset, loops);        
      soundTrackChannel.soundTransform = tempSoundTransform; 
     } else { 


      soundChannels[soundName] = tempSound.play(offset, loops);//sometimes null but still don't know why 

      soundChannels[soundName].soundTransform = tempSoundTransform;//line 106 (see errors above) 


     } 
    } else { 

     fadeInSoundTransform = new SoundTransform(0, 0); 

     if (isSoundTrack) { 
      if (soundTrackChannel != null) { 
       soundTrackChannel.stop(); 
      } 
      soundTrackChannel = tempSound.play(offset, loops, fadeInSoundTransform); 
     } else { 
      soundChannels[soundName] = tempSound.play(offset, loops, fadeInSoundTransform); 

     } 

     TweenLite.to(fadeInSoundTransform, _duration, {volume:_volume, onUpdate:updateFadeIn, onUpdateParams:[soundName, isSoundTrack]}); 
    } 
} 

这是线3708(见上面的错误):

dispatchEvent(new CustomEventSound(CustomEventSound.PLAY_SOUND, enemyProjSounds[tempEnemyProj._type], false, 0, 8, setSoundVolume, false, false, 0)); 

这是类CustomEventSound:

public function CustomEventSound(type:String, name:String, isSoundTrack:Boolean = false, loops:int = 0, 
      offset:Number = 0, _volume:Number = 1, fadeIn:Boolean = false, fadeOut:Boolean = false, 
     _duration:Number = 2, startVol:Number = 1, bubbles:Boolean = false, cancelable:Boolean = false) 
{ 
    super(type, bubbles, cancelable); 
    this.name = name; 
    this.loops = loops; 
    this.offset = offset; 
    this._volume = _volume; 
    this.isSoundTrack = isSoundTrack; 
    this.fadeIn = fadeIn; 
    this.fadeOut = fadeOut; 
    this._duration = _duration; 
    this.startVol = startVol; 

} 

public override function clone():Event { 
    return new CustomEventSound(type, name, isSoundTrack, loops, offset, _volume, fadeIn, fadeOut, _duration, startVol, bubbles, cancelable) 
} 


public override function toString():String { 
    return formatToString(type, "type", "bubbles", "cancelable", "eventPhase", name, isSoundTrack, loops, offset, _volume, fadeIn, 
       fadeOut, _duration, startVol); 
} 

CustomEventSounds的事件监听器事件

override public function soundEventListener(e:CustomEventSound):void { 

if (e.type == CustomEventSound.PLAY_SOUND) { 

soundManager.playSound(e.name, e.isSoundTrack, e.loops, e.offset, e._volume, e.fadeIn, e._duration); 
} else { 
    soundManager.stopSound(e.name, e.isSoundTrack, e.fadeOut, e._duration, e.startVol); 
} 
} 
+0

um什么是SoundManager.as:106 – 2012-04-18 23:17:32

+0

soundChannels [soundName] .soundTransform = tempSoundTransform; – drpelz 2012-04-19 20:23:07

回答

2

一次最多有32个活动声道。当您拨打tempSound.play(offset, loops)时,当已有32个正在播放的声音时,它将返回null

所以,你应该跟踪声音播放的次数,以及stop()当你有32个最古老的SoundChannel和新的声音必须被打,或者只是忽略了新的声音,如果Sound.play()回报null

+0

哇!这是迄今为止我不知道的事情。非常感谢!:)我会尽快尝试这个... – drpelz 2012-04-19 17:48:53

+0

找到一个可能的解决方案:[link] http://blog.curiousmedia.com/?q=blog/flash-player-can-only-play-32 -sounds-time 到目前为止还在测试游戏,我再也看不到任何错误... – drpelz 2012-04-19 20:21:52