синхронизирующий звук - PullRequest
1 голос
/ 31 января 2010

Похоже, что мой звук не синхронизирован, и чем дольше я играю видеоклип, тем дальше он отключается. Ничего сложного, только некоторые базовые звуки стрельбы, которые звучат каждый раз, когда я нажимаю клавишу пробела. Мой код ниже:

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
        {

        }
    }
}

Метод Attack () вызывается из другого класса, который обрабатывает все элементы управления клавиатуры. когда он вызывается звук, то играет. firesound и firesound2 почти одинаковы. Firesound2 звучит немного нестандартно, чтобы сделать его более реалистичным. Сначала звук звучит довольно хорошо, но не очень. но со временем это становится ужасным. Не уверен, что это известная проблема. Но если у кого-то есть идеи, дайте мне знать. спасибо!

Я сделал новый проект .fla. и я сам прикрепил к нему следующий класс. поэтому следующий код является единственным во всем проекте .fla, и проблема все еще возникает. Я нажимаю пробел, и звук начинается на день позже.

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();
                    }
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

Я протестировал сборку, используя этот тестовый код и мои собственные звуковые файлы, и не могу столкнуться с проблемой задержки звука. Это могут быть ваши звуковые файлы, хотя нет никаких известных мне проблем, из-за которых вызовы Sound.play () начинают отставать.

Звуковые файлы, которые я использовал для тестирования, были короткими (звуки огненного шара и прыжка Марио) и не смогли использовать более 4 одновременно используемых звуковых каналов. Нет проблем с задержкой.

Используя более длинные звуковые файлы, я смог довести число SoundChannels до 32, после чего код трассировщика канала начал выдавать нулевые ошибки ссылки (как и следовало ожидать, так как Sound.play () не может возвращать больше SoundChannels), и это звучало довольно ужасно, но как только звуки закончились, счет уменьшился до нуля. После двух минут подряд, когда я наказал свои наушники и звуковую карту, я все еще не обнаружил никаких задержек.

Я бы предложил вставлять вызовы getTimer () по всему коду, чтобы увидеть, является ли это узким местом в производительности (т. Е. Flash Player на самом деле не реагирует на события быстро) или из-за задержки со звуком. Кроме того, вы можете попробовать разные звуковые файлы, чтобы увидеть, если проблема все еще возникает.

1 голос
/ 01 февраля 2010

Есть ли вероятность, что это может быть связано с количеством одновременно звучащих звуков?

Каждый вызов Sound.play () возвращает новый объект SoundChannel (вы можете иметь только 32 объекта одновременно). Вы можете следить за тем, как используются каналы, вот так:

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);

Это может помочь вам точно определить проблему.

РЕДАКТИРОВАТЬ: я изменил код выше, чтобы сохранить счетчик того, сколько звуков воспроизводится одновременно (я надеюсь - извините, вам придется проверить это для меня!)

...