Воспроизвести случайный звук и сопоставить его с викториной по видеоклипу AS3, CS4

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

var randSound = Math.round(Math.random()*1);         // Rand no 0-4
var sounds:Array = [cat, doorCreek];                 // Sound array
var soundClip:Sound = new sounds[randSound];         // Create random sound

sound_btn.addEventListener(MouseEvent.CLICK, playSound);    // Re-play sound button
function playSound(e:MouseEvent) { soundClip.play();  }

var clips:Array =[cat, door, wind, water];      // Movie clip array (will be longer)

// Add objects to stage
for(var i=0; i<4; i++)
{   
    var rand = Math.round(Math.random()*4);     // 4 clips as answer options

    var myRandClip:MovieClip=new clips[rand];      // Create random movieclip 

    // Create listener for the movieclip
    myRandClip.addEventListener(MouseEvent.CLICK, getIndex);

    function getIndex(e:MouseEvent)
    {
        trace(rand);
    }

    this.addChild(myRandClip);
}

Конечно, в настоящий момент эта функция для получения индекса фрагмента ролика просто получает последнее сгенерированное число рандома. Мне нужен способ встроить какой-то идентификатор в сгенерированный фрагмент ролика. Затем я могу просто проверить, совпадает ли он, например, с индексом звуковых клипов. Затем я сделаю то же самое для каждого вопроса (всего 10).

Надеюсь, что это ясно, и кто-то может помочь. Огромное спасибо


person whamo    schedule 12.10.2009    source источник


Ответы (1)


Я не понимаю твоей проблемы. Вы - Босс своего кода. Только мы, ООП - есть действительно много способов сделать это правильно :)

Хорошо, один из самых простых:

// in constructor or AddToStage event handler, or just in timeline

soundIndex = Math.round(Math.random()*soundArray.length);
playSoundFormArray(soundIndex);

var btn:MyButton;
for(var i:uint=0; i< buttonsArray.length; i++){
   btn = MyButton(index, checkFunction);
   // changee position, etc.
}

//.....

private function checkFunction(index:uint):void
{
    if(soundIndex == btnIndex){
      // your code
    }
}

///MyButton.as
// Simple Sprite extended class with click event handler
package{
    import flash.events.Event;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.text.TextField;

    public class MyButton extends Sprite 
    {
        private var _callBack:Function;
        private var _index:uint;

        public function Main(index:uint, callBack:Function, label:String="btn") 
        {
            _index = index;
                    _callback = callBack;
                    addEventListener(Event.ADDED_TO_STAGE, init);

                    // customizing button
                    var textField:TextField = new TextField();
                    textField.text = label;
                    // or your code

        }

        private function init(e:Event):void 
        {
            addEventListener(Event.Click, clickHandler);
        }

            private function clickHandler(e:MouseEvent):void 
        {
            _callBack(_index);
        }

    }
}

Это все. Приносим извинения за ошибки, допущенные в итоге. Написано в браузере. Не испытано.

person Konrad    schedule 12.10.2009
comment
Спасибо за ответ. Проблема на самом деле в том, что мне нужно иметь возможность сравнивать нажатую кнопку с числом, содержащимся для аудиоклипа. Затем я могу посмотреть, правильный ли ответ они выбрали. Я уверен, что ООП - это лучший вариант, но я не использовал его во флэш-памяти. Что вы считаете лучшим вариантом? - person whamo; 12.10.2009