Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Кнопка пуск/стоп (http://www.flasher.ru/forum/showthread.php?t=200372)

Suntea 02.06.2013 19:32

Кнопка пуск/стоп
 
Имеется простая кнопка, которая запускает и останавливает звук. Проблема в том, что когда звук проигрывается целиком, кнопка все равно сначала работает как "Стоп" и чтоб снова запустить звук на нее нужно нажать два раза.
Собственно, это учебный этюд, поэтому очень ценно мне будет объяснение для тупых, почему слушатель не работает

Код AS3:

var cond:Boolean = false;
var snd:Sound = new hallelujahMp3();
var channel:SoundChannel;
 
addEventListener(MouseEvent.CLICK, playMusic);
snd.addEventListener(Event.SOUND_COMPLETE, onComplete);
 
function playMusic(Event:MouseEvent){
        if (!cond){
                channel = snd.play();
                cond = true;
        }
        else{
                channel.stop();
                cond = false;
        }
}
function onComplete(Event){
        cond = false;
}


Suntea 02.06.2013 20:01

MikroAcse, вообще никак не помогло :С

iNils 03.06.2013 00:02

Код AS3:

var cond:Boolean = false;
var snd:Sound = new hallelujahMp3();
var channel:SoundChannel;
 
addEventListener (MouseEvent.CLICK, playMusic);
/// строка ниже, это подписка на окончание загрузки звукового файла, а не об окончании проигрывания.
// snd.addEventListener(Event.SOUND_COMPLETE, onComplete);
 
function playMusic (еvent:MouseEvent){
        if (cond) {
                channel.stop ();
                channel.removeEventListener (Event.SOUND_COMPLETE, onSoundComplete);
                channel = null;
        } else {
                channel = snd.play ();
                /// а вот это подписка на конец проигрывания
                channel.addEventListener (Event.SOUND_COMPLETE, onSoundComplete);
 
        }
        /// любой вызов инвертирует состояние cond, поэтому можно не указывать это явно: cond = true или cond = false
        cond = !cond;
}
function onSoundComplete (event:Event) {
        cond = false;
        channel.removeEventListener (Event.SOUND_COMPLETE, onSoundComplete);
        channel = null;
}


Suntea 03.06.2013 00:13

Компилятор выдает ошибку:
1119: Access of possibly undefined property SOUND_COMPLETE through a reference with static type flash.events:MouseEvent.

и мне интересно, почему в playMusic такой странный порядок условий? то есть, он принципиален, или ничего не изменится, если я напишу наоборот?

iNils 03.06.2013 00:39

Ошибка, потому что нет импорта нужных классов.
Исправил ошибку копипаста. Вместо function playMusic (Event:MouseEvent), должно быть function playMusic (еvent:MouseEvent).

Почему странный? Из-за того, что сначала стоп, а потом плей описаны? Роли не играет, я ориентируюсь на condition, а не на содержимое. Не люблю писать if (!condition), если есть else. if (condition) проще для понимания.
Ну и плюс привычка с AVM1, там ! требовал лишнею операцию на инвертирование в условии, а в AVM2 есть отдельная инструкция.

Suntea 03.06.2013 02:49

Спасибо! Работает.
Хм, понятно. Интересно. Хотя я просто не думаю как программист, вот и кажется странным :)


Часовой пояс GMT +4, время: 23:53.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.