Форум 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=156528)

Андрей_1970 23.05.2011 15:03

Клавиатура и звук
 
Помогите разобраться со звуком, который надо к клавиатуре прикрепить. Загвоздка в том, что при нажатии на клавишу и удерживании звук с первых же секунд начинает наслаиваться сам на себя. А мне надо, чтобы он проигрывал пока нажата клавиша, а потом после отпуска ее звук был на стопе. Это надо для флештренажера по музыкалке, где каждая клавиша на клавиатуре будет играть свою ноту длиною около 4 сек.
Разных примеров похожих по теме звука много, а конретного как в данном случае нет, чтобы от и до.
Если не трудно скиньте пример как надо делать.

КорДум 23.05.2011 15:12

Цитата:

Разных примеров похожих по теме звука много, а конретного как в данном случае нет, чтобы от и до.
Если не трудно скиньте пример как надо делать.
Вам в вакансии. А если не хотите туда, выкладывайте свой код, который работает не так, как надо.

ПО теме: по нажатию ставьте флаг яНажата в true, по нажатию проверяйте, в каком положении флаг, чтобы не было наслаиваний.

Андрей_1970 23.05.2011 15:36

Начал с этого:
Код AS3:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownListener);
function onKeyDownListener(e:KeyboardEvent):void
        {
            if (e.keyCode == 37) //left
            {
              var request:URLRequest = new URLRequest("b16.mp3");
var your_sound:Sound = new Sound();
your_sound.load(request);
your_sound.play();
 
            }
        }

Как дальше не знаю, так как привык работать в 3Д флешниматоре(там проще, выбрал клавишу и задал ей плей и стоп) , а тут погряз.
И еще, когда назначаю клавиатуре код, то он срабатывает только с шифтом, почему так?

КорДум 23.05.2011 15:40

Так, пара советов: если планируете хорошо изучать as3, то прочтите соответствующие книги - Мука того же, классика ведь. Чтобы не писать в кадрах.
Затем, код нужно оформлять тегами [ as3] [ /as3]

Ну вот как-то так, как я и говорил выше (дальше по аналогии сделаете):
Код AS3:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownListener);
function onKeyDownListener(e:KeyboardEvent):void {
    if (e.keyCode == 37 && !isPress) {
        var request:URLRequest = new URLRequest("b16.mp3");
        var your_sound:Sound = new Sound();
        your_sound.load(request);
        your_sound.play();
        isPress = true;
    }
}

Добавлено через 2 минуты
Цитата:

И еще, когда назначаю клавиатуре код, то он срабатывает только с шифтом, почему так?
Наверно потому, что FlashIDE перехватывает нажатия. Запустите swf вне ее.

Андрей_1970 23.05.2011 15:49

Бодается на такой код.
(1120: Access of undefined property isPress. if (e.keyCode == 37 && !isPress) { ........isPress = true;...)

КорДум 23.05.2011 15:50

А вы isPress объявили и инициализировали?
Код AS3:

var isPress:Boolean = false;


Андрей_1970 23.05.2011 16:03

ввёл, После нажатия на клавишу звука нет и выдает такую вот строку в выводе:
Error #2044: Unhandled IOErrorEvent:. text=Error #2032: Stream Error.
at _fla::MainTimeline/onKeyDownListener()

КорДум 23.05.2011 16:11

Во-первых. Вы не дожидаетесь загрузки звука, сразу запускаете воспроизведение.
Во-вторых, странная ошибка, ничего про нее не знаю, поэтому ткну пальцем в небо: путь до файла правильный? Хотя возможно то, что вы не дожидаетесь загрузки, все и ломает.
Ну и старайтесь выделять текст стилями, а не цветами. Я нахожусь на светлой дефолтной теме vBulletin, ваш голубой цвет сливается с фоном.

Андрей_1970 23.05.2011 16:18

Ладно, подождем еще кого-нибудь в помощь. У Мука, если бы был пример подобный, вопросов бы не возникло, а так, этож надо сначала все пройти, что он пишет, а потом аналогии выводить. А мне-то совсем немного надо, а интуитивно догнать не могу, слабоват еще в этом деле.

Вот эту флешку я делал в 3Д флешаниматоре:
http://www.playcast.ru/uploads/2011/05/11/2517978.swf
Теперь хотел сделать в адобовском флеше, и вот сижу на нуле пока (((.

КорДум 23.05.2011 17:04

Ну я же сказал, что нужно исправить. Сделайте хотя бы это, глядишь, я был прав и IOError вываливала именно из-за этого.

samana 23.05.2011 18:50

Возможно вам подойдёт такой способ (не уверен что он лучший), но всё же. Всё что нужно это создавая объекты Sound, присваивать в конце имени число клавиши, к которой этот звук будет относится.
В примере ниже сделаны только два звука для клавиш "право" и "вверх" (37,38). Остальные можете добавить самостоятельно.
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.KeyboardEvent;
        import flash.media.Sound;
        import flash.media.SoundChannel;
        import flash.net.URLRequest;
 
        /**
        * ...
        * @author Samana
        */

        public class Main extends Sprite
        {
                private var currentKey:uint; //текущая нажатая клавиша
                private var allKeys:Array = [];//массив со всеми клавишами
                private var allSoundChannels:Array = [];//каналы для каждого звука
                private var workKeys:Array=[37,38]//массив с номерами клавиш, которые нужно обрабатывать
 
                private var sound_37:Sound = new Sound(new URLRequest("../lib/piano.mp3"));//музыка для клавиши "право" 37
                private var sound_38:Sound = new Sound(new URLRequest("../lib/guitar.mp3"));//музыка для клавиши "вверх" 38
 
 
                public function Main():void
                {
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
                        stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
                }
                //------------------------------------------------------------------------------------
                private function key_down(e:KeyboardEvent):void
                {
                        //если клавиша нажата, то она не будет включать свою мелодию до тех пор
                        //пока не будет отжата.
                        currentKey = e.keyCode;
 
                        if (workKeys.indexOf(currentKey)!= -1)
                        {
                                if (!allKeys[currentKey])
                                {
                                        allKeys[currentKey] = true;
                                        //play
                                        allSoundChannels[currentKey] = (this["sound_" + currentKey] as Sound).play();
                                }
 
                        }       
                }
                //------------------------------------------------------------------------------------
                private function key_up(e:KeyboardEvent):void
                {
                        currentKey = e.keyCode;
 
                        if (workKeys.indexOf(currentKey)!= -1)
                        {
                                if (allKeys[currentKey])
                                {
                                        allKeys[currentKey] = false;
                                        //stop
                                        (allSoundChannels[currentKey] as SoundChannel).stop();
                                }
                        }
 
                }
                //------------------------------------------------------------------------------------
 
        }
 
}


Андрей_1970 25.05.2011 13:07

Вот вроде получилось при таком раскладе:
Код AS3:

var soundFactory:Sound = new Sound();
var request:URLRequest = new URLRequest("b16.mp3");
soundFactory.load(request);
var isPlaying:Boolean = false;
var channel:SoundChannel;
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, keydownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyupHandler);
 
function keydownHandler(event:KeyboardEvent):void
{
      if ( !isPlaying)
    {
            isPlaying = true;
            channel = soundFactory.play();
            channel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
    }
}
 
function keyupHandler(event:KeyboardEvent):void
{
      if ( isPlaying)
      {
            channel.stop();
            isPlaying = false;
      }
}
 
function soundCompleteHandler(event:Event):void
{
        isPlaying = false;
        channel.removeEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
}

Еще бы убрать цикл, чтоб по окончании звучания ноты(4 сек.) больше не играла, было бы хорошо.
Остается только для всех нот прописать код на каждую клавишу.
.....
Вопрос: как убрать реагирование раскладки клавиатуры на большую и малую литеру. Смотрел вроде как вводить keyCode и charCode для каждой клавиши, но еще не пробовал, но с keyCode срабатывало только при нажатом шифте, когда нажимал клавишу "А".


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

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