2012-04-18 3 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. Но я не знаю почему. Я уже проверил все подходящие массивы, если там что-то не хватает, но, похоже, все в порядке. Это чрезвычайно неприятная ошибка, которая длится несколько недель. Пожалуйста, мне нужна ваша помощь, чтобы избавиться от этой ошибки, чтобы закончить игру. Большое спасибо.

Это часть 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-Events

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 what is at SoundManager.as:106 –

+0

soundChannels [soundName] .soundTransform = tempSoundTransform; – drpelz

ответ

2

В то время как максимум 32 активных звуковых канала одновременно. Когда вы назовете tempSound.play(offset, loops), он вернет null, когда в игре уже есть 32 звуков.

Таким образом, вы должны следить за количеством звуков, играющих, и stop() старейшей SoundChannel, когда у вас есть 32 и новый звук должен быть воспроизведен, или просто игнорировать новый звук, если Sound.play() возвращается null.

+0

Ничего себе! Этого я до сих пор не знал. Большое спасибо! :) Я попробую это как можно скорее ... – drpelz

+0

Найденное решение: [link] http://blog.curiousmedia.com/?q=blog/flash-player-can-only-play-32 -sounds-time Все еще проверяя игру, я больше не вижу никаких ошибок ... – drpelz

Смежные вопросы