Jogo Rápido: Trabalhando com sons no ActionScript 3.0

Para os chegados do AS3 que ainda não experimentaram o conjunto de classes para som no Flash CS3, aqui vai um texto jogo rápido que mostrará como criar um pequeno player de MP3 com funções de play, stop e pause. Aqui vamos nós.

Abra o Flash CS3 e crie um novo Flash File (ActionScript 3.0). Salve este arquivo como player.fla. Em seguida, coloque 3 botões no palco. Instâncie-os como play_btn, pause_btn e stop_btn.

Agora, crie um novo arquivo ActionScript File e salve-o como SoundPlayer.as.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package
{
   
    /**
     * Classe para o controle áudio no ActionScript 3.0.
     *
     * @author Mozart Petter
     */

    public class SoundPlayer
    {
       
        /**
         * Construtor.
         */

        public function SoundPlayer():void
        {
       
        }
       
        /**
         * Pausa o áudio se estiver tocando, ou retoma a
         * reprodução do ponto atual.
         *
         * @return void
         */

        public function pause():void
        {
           
        }
       
        /**
         * Inicia a reprodução da trilha.
         *
         * @param String path Caminho para o arquivo MP3.
         * @return void
         */

        public function play(path:String, startTime:Number = 0):void
        {
           
        }
       
        /**
         * Para a reproducao do audio.
         *
         * @return void
         */

        public function stop():void
        {
           
        }
       
        /**
         * @private
         * Carrega o arquivo especificado em path.
         *
         * @param String path Caminho para o arquivo MP3.
         * @return void
         */

        private function load(path:String):void
        {
           
        }
   
    }

}

Temos aí o que seria a estrutura inicial da nossa classe, um método de play, que será responsável por tocar o áudio, um método pause que irá pausar o áudio, um método stop, que vai parar o audio e um método load que carregará o arquivo de áudio.

Vamos começar implementando o nosso método play. O primeiro passo é criar o nosso objeto Sound. Vamos criar uma propriedade privada em nossa classe (propriedades vão antes do construtor, só pra lembrar…) chamada _sound, ela armazenará o nosso objeto Sound.

15
16
17
18
19
        /**
         * @private
         * Objeto Sound.
         */

        private var _sound:Sound = null;

Não esqueça de importar a classe Sound! (import flash.media.Sound;)

3
import flash.media.Sound;

Dentro do método play:

38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
        /**
         * Inicia a reprodução da trilha.
         *
         * @param String path Caminho para o arquivo MP3.
         * @return void
         */

        public function play(path:String, startTime:Number = 0):void
        {
            // Objeto Sound.
            this._sound = new Sound();
           
            // Carregando o audio de path.
            this.load(path);
           
            // Iniciando reproducao.
            this._sound.play(startTime);
        }

Criamos nosso objeto Sound e logo abaixo carregamos o arquivo definido em path. Depois iniciamos a reprodução do arquivo de áudio.
Agora vamos implementar o método load, que carregará o arquivo de áudio.

66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
        /**
         * @private
         * Carrega o arquivo especificado em path.
         *
         * @param String path Caminho para o arquivo MP3.
         * @return void
         */

        private function load(path:String):void
        {
            // URL do arquivo de audio.
            var r:URLRequest = new URLRequest(path);
           
            // Carrega o arquivo de audio.
            this._sound.load(r);
        }

Não esqueça de importar a classe URLRequest (O Flash nunca ajuda nessa parte…)! (import flash.net.URLRequest;)

4
import flash.net.URLRequest;

Salve a classe e agora no nosso player.fla, crie uma nova layer e insira o seguinte código;

1
2
3
4
5
6
7
8
9
10
11
import SoundPlayer;
import flash.events.MouseEvent;

var oSP:SoundPlayer = new SoundPlayer();

function playHandler(evt:MouseEvent):void
{
    oSP.play("som.mp3");
}

play_btn.addEventListener(MouseEvent.CLICK, playHandler);

O que fizemos aqui é bem simples, importamos as classes necessárias, criamos um objeto SoundPlayer e adicionamos um evento ao nosso botão play_btn que dispara um função que dá início a reprodução do áudio.

Teste o filme para ver se tudo funciona corretamente. Perceba que se você clicar diversas vezes no botão, o áudio iniciará diversas vezes, um por cima do outro. Este pequeno problema nós iremos resolver agora, quando implementarmos o método stop.

O método play da classe Sound retorna um tipo de objeto novo para quem vem do AS2: SoundChannel, que representa o canal de som ativo, e é somente através dele que podemos parar a reprodução do áudio.

Então, criaremos a propriedade _schannel, que armazenará o nosso objeto SoundChannel.

20
21
22
23
24
>        /**
        * @private
        * Objeto Sound Channel.
        */

        private var _schannel:SoundChannel = null;

Não esqueça de importar a classe SoundChannel! (import flash.media.SoundChannel;)

4
import flash.media.SoundChannel;

Uma pequena modificação no nosso método play:

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
        /**
         * Inicia a reprodução da trilha.
         *
         * @param String path Caminho para o arquivo MP3.
         * @return void
         */

        public function play(path:String, startTime:Number = 0):void
        {
            // Se um audio ja estiver tocando.
            if (this._schannel) return;
           
            // Objeto Sound.
            this._sound = new Sound();
           
            // Carregando o audio de path.
            this.load(path);
           
            // Definindo o Sound Channel atual.
            this._schannel = this._sound.play(startTime);
        }

Fizemos uma pequena verificação, para ver se _schannel está definido. Se _schannel estiver definida, significa que um áudio já está sendo reproduzido. No final do método nós definimos o objeto retornado de play() para a propriedade _schannel.

Agora que temos um objeto SoundChannel, podemos implementar o nosso método stop.

67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
        /**
         * Para a reproducao do audio.
         *
         * @return void
         */

        public function stop():void
        {
            // Se existir um Sound Channel.
            if (this._schannel)
            {
            // Para a execucao do som.
            this._schannel.stop();
           
            // Apaga o canal existente.
            this._schannel = null;
        }

No nosso arquivo player.fla nós adicionamos:

1
2
3
4
5
6
function stopHandler(evt:MouseEvent):void
{
    oSP.stop();
}

stop_btn.addEventListener(MouseEvent.CLICK, stopHandler);

Teste o filme para ver se tudo está funcionando corretamente.
Feito o stop, só nos resta implementar o método pause, que tem um funcionamento bem simples, pegamos a posição da música no momento em que o método é chamado, guardamos e a utilizamos para retomar a reprodução posteriormente.

Para que o sistema de pausa funcione corretamente, precisaremos criar duas novas propriedades, que irão auxiliar nosso sistema.

27
28
29
30
31
32
33
34
35
36
37
        /**
         * @private
         * Indica se o audio esta parado ou nao.
         */

        private var _paused:Boolean = false;
       
        /**
         * @private
         * Indica em qual posicao o audio foi parado.
         */

        private var _position:Number = 0;

Agora uma pequena implementação do método pause:

47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
        /**
         * Pausa o áudio se estiver tocando, ou retoma a
         * reprodução do ponto atual.
         *
         * @return void
         */

        public function pause():void
        {
            // Se nao estiver pausado e _schannel estiver definida.
            if (!this._paused && this._schannel)
            {
                // Armazena a posicao atual do audio.
                this._position = this._schannel.position;
               
                // Para o audio.
                this.stop();
               
                // Define _paused como true.
                this._paused = true;
            }
        }

Tudo bem simples, verificamos se já existe um áudio pausado e se existe um canal de áudio ativo. Em seguida armazenamos a posição atual do audio em nossa propriedade _position, paramos o áudio utilizando o método stop e definimos o valor de _paused como true.

Mais um pequeno ajuste, agora no método play:

69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
        /**
         * Inicia a reprodução da trilha.
         *
         * @param String path Caminho para o arquivo MP3.
         * @return void
         */

        public function play(path:String, startTime:Number = 0):void
        {
            // Se um audio ja estiver tocando.
            if (this._schannel) return;
           
            // Objeto Sound.
            this._sound = new Sound();
           
            // Carregando o audio de path.
            this.load(path);
           
            // Se o audio estiver pausado, define startTime
            // com o valor de position.
            if (this._paused) startTime = this._position;
           
            // Definindo o Sound Channel atual.
            this._schannel = this._sound.play(startTime);
           
            // Sinalizando que o audio nao esta parado.
            this._paused = false;
        }

Verificamos se o áudio está pausado, se estiver, iniciamos a reprodução do áudio do ponto em que estava no momento em que foi pausado.

E por fim, outro pequeno ajuste no método stop:

97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
        /**
         * Para a reproducao do audio.
         *
         * @return void
         */

        public function stop():void
        {
            // Se a musica estiver pausada e nao existir um Sound Channel
            // o valor de position passa a ser 0.
            if (this._paused && !this._schannel) this._position = 0;
           
            // Se existir um Sound Channel.
            if (this._schannel)
            {
                // Para a execucao do som.
                this._schannel.stop();
               
                // Apaga o canal existente.
                this._schannel = null;
            }
        }

Agora voltamos ao nosso arquivo player.fla:

1
2
3
4
5
6
function pauseHandler(evt:MouseEvent):void
{
    oSP.pause();
}

pause_btn.addEventListener(MouseEvent.CLICK, pauseHandler);

Teste para ver se está tudo correto. Abaixo segue o código da classe SoundPlayer completo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package
{
    import flash.media.Sound;
    import flash.net.URLRequest;
    import flash.media.SoundChannel;
   
    /**
     * Classe para o controle áudio no ActionScript 3.0.
     *
     * @author Mozart Petter
     */

    public class SoundPlayer
    {
   
        /**
         * @private
         * Objeto Sound.
         */

        private var _sound:Sound = null;
       
        /**
         * @private
         * Objeto Sound Channel.
         */

        private var _schannel:SoundChannel = null;
       
        /**
         * @private
         * Indica se o audio esta parado ou nao.
         */

        private var _paused:Boolean = false;
       
        /**
         * @private
         * Indica em qual posicao o audio foi parado.
         */

        private var _position:Number = 0;
       
        /**
         * Construtor.
         */

        public function SoundPlayer():void
        {
       
        }
       
        /**
         * Pausa o áudio se estiver tocando, ou retoma a
         * reprodução do ponto atual.
         *
         * @return void
         */

        public function pause():void
        {
            // Se nao estiver pausado e _schannel estiver definida.
            if (!this._paused && this._schannel)
            {
                // Armazena a posicao atual do audio.
                this._position = this._schannel.position;
               
                // Para o audio.
                this.stop();
               
                // Define _paused como true.
                this._paused = true;
            }
        }
       
        /**
         * Inicia a reprodução da trilha.
         *
         * @param String path Caminho para o arquivo MP3.
         * @return void
         */

        public function play(path:String, startTime:Number = 0):void
        {
            // Se um audio ja estiver tocando.
            if (this._schannel) return;
           
            // Objeto Sound.
            this._sound = new Sound();
           
            // Carregando o audio de path.
            this.load(path);
           
            // Se o audio estiver pausado, define startTime
            // com o valor de position.
            if (this._paused) startTime = this._position;
           
            // Definindo o Sound Channel atual.
            this._schannel = this._sound.play(startTime);
           
            // Sinalizando que o audio nao esta parado.
            this._paused = false;
        }
       
        /**
         * Para a reproducao do audio.
         *
         * @return void
         */

        public function stop():void
        {
            // Se a musica estiver pausada e nao existir um Sound Channel
            // o valor de position passa a ser 0.
            if (this._paused && !this._schannel) this._position = 0;
           
            // Se existir um Sound Channel.
            if (this._schannel)
            {
                // Para a execucao do som.
                this._schannel.stop();
               
                // Apaga o canal existente.
                this._schannel = null;
            }
        }
       
        /**
         * @private
         * Carrega o arquivo especificado em path.
         *
         * @param String path Caminho para o arquivo MP3.
         * @return void
         */

        private function load(path:String):void
        {
            // URL do arquivo de audio.
            var r:URLRequest = new URLRequest(path);
           
            // Carrega o arquivo de audio.
            this._sound.load(r);
        }
   
    }

}

É isso, espero que este pequeno exemplo tenha sido proveitoso para você. Em um artigo futuro explorarei mais a parte de áudio no Flash. Até!

Leave a Comment