2010-01-31 3 views
1

Il semble que mon son ne soit pas synchronisé et plus je joue du MovieClip, plus la synchronisation est longue. Ce n'est rien de trop compliqué, juste quelques sons de base qui tirent à chaque fois que je frappe la barre d'espace. Mon code est ci-dessous:synchronisation du son

package com.objects{ 

    import flash.display.MovieClip; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.net.URLRequest; 
    import flash.events.Event; 

    public class Avatar extends gameObject implements IKiller{ 

     public var targets:Array; 
     public var delay:Number = 3000; 
     public var weapon:Number = 1; 
     private var fireSound:Sound; 
     private var fireSound2:Sound; 
     private var systems:Array; 
     private var ext:Number = -1; 
     private var channelTracer:SoundChannel; 
     private var channelCount:Number = 0; 


     public function Avatar():void 
     { 
      systems = new Array(); 
      channelTracer = new SoundChannel(); 
      var soundUrl = new URLRequest("com/images/mashingun_darkt.mp3"); 
      fireSound = new Sound(); 
      fireSound.load(soundUrl); 

      var soundUrl = new URLRequest("com/images/mashingun_light.mp3"); 
      fireSound2 = new Sound(); 
      fireSound2.load(soundUrl); 

      rotation = -90; 
      lastTime = getTime(); 
      targets = new Array(); 
     } 

     private function soundFinished(e:Event):void { 
      channelCount--; 
      trace(channelCount); 
     } 


     public function get Systems():Array 
     { 
      return systems; 
     } 

     override public function Attack(dir:Number = -40):void 
     { 
      switch(weapon){ 

       case 1:     
        var bullet1:Bullet = new Bullet(); 
        bullet1.wielder = this; 
        bullet1.x = x + 35; 
        bullet1.y = y + 30; 
        bullet1.bulletDir = rotation; 
        eApi.addGameChild(bullet1); 

        var bullet2:Bullet = new Bullet(); 
        bullet2.bulletDir = rotation; 
        bullet2.wielder = this; 
        bullet2.x = x - 35; 
        bullet2.y = y + 30; 
        eApi.addGameChild(bullet2); 

        var rand = Math.ceil(Math.random() * 100); 
        if (rand < 50) { 
         channelTracer = fireSound.play(); 
         //RndSound = RndSound+50; 
        } else { 
         channelTracer = fireSound2.play(); 

        } 
        channelTracer.addEventListener(Event.SOUND_COMPLETE, soundFinished); 
        channelCount++; 
        trace(channelCount); 

       break; 
       case 2: 
        if((getTime() - lastTime) > delay) 
        { 
         var missle = new Missile(); 
         missle.shootOut *= ext; 
         ext *= -1; 
         missle.x = x; 
         missle.y = y; 
         trace(ext); 
         missle.wielder = this; 
         eApi.addGameChildAt((eApi.numChildren - 2),missle); 
         lastTime = getTime(); 
        } 
       break; 
       case 3: 
        var bullet1:Bullet = new Bullet(); 
        bullet1.wielder = this; 
        bullet1.x = x + 35; 
        bullet1.y = y + 30; 
        bullet1.bulletDir = -80; 
        eApi.addGameChild(bullet1); 

        var laser = new StingerLaser(); 
        laser.laserDir = -90; 
        laser.wielder.push(this); 
        laser.x = x + 20; 
        laser.y = y + -3; 
        eApi.addGameChild(laser); 

        var laser2 = new StingerLaser(); 
        laser2.laserDir = -90; 
        laser2.wielder.push(this); 
        laser2.x = x + -20; 
        laser2.y = y + -3; 
        eApi.addGameChild(laser2); 

        var bullet2:Bullet = new Bullet(); 
        bullet2.bulletDir = -100; 
        bullet2.wielder = this; 
        bullet2.x = x - 35; 
        bullet2.y = y + 30; 
        eApi.addGameChild(bullet2); 
       break;    
       case 4: 
        if((getTime() - lastTime) > delay) 
        { 
         var missle1 = new Missile(); 
         missle1.shootOut = 2; 
         missle1.x = x; 
         missle1.y = y; 
         missle1.wielder = this; 
         eApi.addGameChildAt((eApi.numChildren - 2),missle1); 

         var missle2 = new Missile(); 
         missle2.shootOut = -2; 
         missle2.x = x; 
         missle2.y = y; 
         missle2.wielder = this; 
         eApi.addGameChildAt((eApi.numChildren - 2),missle2); 
         lastTime = getTime(); 
        } 
       break; 
       case 5: 
        if((getTime() - lastTime) > delay) 
        { 
         var side:Number = 1; 
         for(var i = 0; i < 20; i+=2) 
         { 
          var missle1 = new Missile(); 
          missle1.shootOut = (i+2) * side; 
          side *= -1; 
          missle1.straightShot = true; 
          missle1.x = x; 
          missle1.y = y; 
          missle1.wielder = this; 
          eApi.addGameChildAt((eApi.numChildren - 2),missle1); 
         } 
         lastTime = getTime(); 
        } 
       break; 
       default: 
      } 
     } 

     public function Hit(dmg:Number = .01):void { 
      if(health > 0) 
       health -= dmg; 

      if(health < 0) 
       health = 0,trace("dead"); 
     } 

     override public function updateObject():void 
     { 

     } 
    } 
} 

La méthode d'attaque() est appelée d'une autre classe qui gère tous les contrôles du clavier. quand il est appelé le son joue alors. Firesound et Firesound2 sont presque les mêmes. firesound2 sonne un peu hors de la hauteur pour le rendre plus réaliste. Au début, le son sonne plutôt bien, pas génial. mais alors ça devient terrible au fil du temps. Je ne sais pas si c'est un problème connu. Mais si quelqu'un a des idées, faites le moi savoir. Merci!

J'ai fait un nouveau projet .fla. et je lui ai attaché la classe suivante par lui-même. donc le suivant est le seul code dans le projet .fla entier et le problème se produit toujours. J'appuie sur la barre d'espace et le son commence un jour en retard.

package { 
    import flash.display.MovieClip; 
    import flash.events.*; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.net.URLRequest; 

    public class test extends MovieClip 
    { 
     private var fireSound:Sound; 
     private var fireSound2:Sound; 
     private var aKeyPress:Array; 

     public function test():void 
     { 
      aKeyPress = new Array(); 
      var soundUrl = new URLRequest("com/images/mashingun_darkt.mp3"); 
      fireSound = new Sound(); 
      fireSound.load(soundUrl); 

      var soundUrl = new URLRequest("com/images/mashingun_light.mp3"); 
      fireSound2 = new Sound(); 
      fireSound2.load(soundUrl); 
      addEventListener(Event.ENTER_FRAME, loop); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownListener); 
      stage.addEventListener(KeyboardEvent.KEY_UP,keyUpListener); 
     } 
     private function keyDownListener(e:KeyboardEvent) { 
      //trace("down e.keyCode=" + e.keyCode);   
      aKeyPress[e.keyCode]=true; 
     } 

     private function keyUpListener(e:KeyboardEvent) { 
      //trace("up e.keyCode=" + e.keyCode); 
      aKeyPress[e.keyCode]=false; 
     } 
     public function loop(e:Event):void 
     { 
      if (aKeyPress[32]){//Right 
        var rand = Math.ceil(Math.random() * 100); 
        if (rand < 50) { 
         fireSound.play(); 
         //RndSound = RndSound+50; 
        } else { 
         fireSound2.play(); 
        } 
      } 
     } 
    } 
} 
+0

La latence d'émission est-elle la conséquence (c'est-à-dire que plus vous jouez longtemps, plus le temps s'écoule entre l'appui sur la touche de prise de vue et l'augmentation du son)? Ou est le problème de qualité sonore? Ou les deux? – heavilyinvolved

+0

Je vous suggère d'écrire un cas de test. c'est-à-dire le moins de code requis pour reproduire le problème. – Jotham

+0

merci pour la réponse. il semble que ce soit juste la latence, pas la qualité. la qualité reste la même. Le son reste le même. seule chose qui manque à travers le temps est le timing pour lequel le son commence quand j'appuie sur la barre d'espace. – numerical25

Répondre

1

Y a-t-il une chance que cela ait quelque chose à voir avec le nombre de sons simultanés lus?

Chaque appel à Sound.play() renvoie un nouvel objet SoundChannel (vous ne pouvez en avoir que 32 à la fois). Vous pouvez surveiller la façon dont les canaux sont utilisés comme ceci:

private var channelTracer:SoundChannel; 
private var channelCount:number = 0; 
//... 

private function soundFinished(e:Event):void { 
channelCount--; 
trace(channelCount); 
} 

//... 

var rand = Math.random() * 100; 
if (rand < 50) { 
channelTracer = fireSound.play(); 
} else { 
channelTracer = fireSound2.play(); 
} 
channelTracer.addEventListener(Event.SOUND_COMPLETE, soundFinished); 
channelCount++; 
trace(channelCount); 

Ceci pourrait vous aider à identifier le problème.

EDIT: J'ai changé le code ci-dessus pour garder un compte courant de combien de sons jouent en même temps (je l'espère - excusez-moi, vous devrez le tester pour moi!)

+0

Je ne suis pas familier avec le fonctionnement des chaînes. Je peux vous dire ceci. il n'y a que 2 variables dans la mémoire qui retiennent le son. c'est fireSound et fireSound2. Et quand je presse et maintenez la barre d'espace, soit fireSound.play(); joue ou fireSound2.play() joue en fonction de si le rand var est plus grand alors ou moins de 50. – numerical25

+0

comme pour le traceur de canal, il doit y avoir plus de suivi de la varible car toute la trace (channelTracer) me dit ce que type d'objet c'est. – numerical25

+0

Hmmm, oui vous avez raison à propos de trace (channelTracer) - j'espérais que cela vous donnerait des informations sur laquelle des 32 chaînes était en cours d'utilisation ... désolé, ce n'était pas beaucoup d'aide. –

1

Je l'ai testé une version utilisant ce test code et mes propres fichiers audio, et je suis incapable de rencontrer le problème de son retard. Il peut s'agir de vos fichiers audio, bien que je ne connaisse aucun problème susceptible de provoquer des appels à Sound.play().

Les fichiers audio que j'ai utilisés pour tester étaient courts (boule de feu Mario et sons de saut), et ne pouvaient pas utiliser plus de 4 SoundChannels simultanés. Aucun problème de latence. En utilisant des fichiers audio de plus grande longueur, j'ai pu pousser le nombre de SoundChannels à 32, point auquel le code de traceur de canal a commencé à produire des erreurs de référence nulles (comme attendu puisque Sound.play() ne peut pas renvoyer plus de SoundChannels) , et ça sonnait plutôt horrible, mais une fois les sons terminés le compte décrémenté à zéro. Après deux minutes de punition sur mon casque et ma carte son, je n'ai toujours pas rencontré de latence. Je suggérerais d'insérer des appels à getTimer() dans votre code pour voir si c'est un goulot d'étranglement de performance (c'est-à-dire si Flash Player ne répond pas aux événements rapidement) ou un problème de latence sonore. En outre, vous pouvez essayer différents fichiers audio pour voir si le problème persiste.