2015-01-25 2 views
0

Привет и благодарю вас за ваше время. У меня есть код as3, который случайно выбирает 5 кадров из 7, без повторов.AS3 - Перемещение по элементам массива

var mygroup1:RadioButtonGroup = new RadioButtonGroup("group1"); 
q1a1.group = q1a2.group = q1a3.group = q1a4.group = q1a5.group = mygroup1; 

var number_array:Array = [8158,8159,8160,8161,8162,8163,8164]; 
var final_array:Array = []; 
var count_selected:int = 5; 
var i:int; 

for(i = 0; i < count_selected; i++) 
    { 
     if(number_array.length == 0) 
     break; 
     else 
     final_array.push(number_array.splice(Math.floor(Math.random() * number_array.length), 1)[0]); 
    } 

var index = 0; 
var currentQuestion:int = final_array[index]; 
var answers:Object = { 
    8158: 'B) 12', 
    8159: 'F) All of the above', 
    8160: 'A) True', 
    8161: 'B) False', 
    8162: 'C) 4', 
    8163: 'F) D and E', 
    8164: 'B) B' 
}; 

var getAnswer = mygroup1.selection.label; //Getting the selection from RadioButtonGroup 

submitBtn.addEventListener(MouseEvent.CLICK, onSubmitClicked); 

function onSubmitClicked(e:MouseEvent):void { 
var answer:String = getAnswer(); 
    if (answer === answers[currentQuestion]) 
     awardScore(currentQuestion); 
     ++index; 
     currentQuestion = final_array[index]; 
     gotoAndStop(final_array[index]); 
    } 

и при нажатии на «startBtn», это приведет вас к первому случайно сгенерированному кадру (final_array [0]), и все это здорово, чтобы начать процесс случайным образом.

Каждые из следующих 7 кадров имеет кнопку отправки (b1, b2 ... b7), который следит за счет и отправляет ответ, а также должен перейти к следующему случайно выбрали кадр, но только 5 раз, после оставшихся сгенерированных фреймов .... gotoAndStop (final_array [1]) ... (final_array [2]) .... (final_array [3]) .... (final_array [4]).

b1.addEventListener(MouseEvent.CLICK, quizHandler1) 
    function quizHandler1(event:MouseEvent):void{ 
    if(mygroup1.selection.label=="B) 12") { 
     count = count + 20; 
     scoreresult.text = (count).toString(); 
     gotoAndStop(final_array[1]);  
    } 
    else{ 
     gotoAndStop(final_array[1]); 
     } 
    } 

Моя проблема ... Так как пользователь будет идти только до 5 произвольно выбранных кадров из 7, как я могу убедиться, что все кнопки во всех 7 кадров будет слушать и следовать за gotoAndStop (final_array []); заявление в порядке 5? Потому что в конце будет оставлено 2 кадра, и эти два кадра будут изменяться случайным образом в каждом рулоне. Надеюсь, я смогу объяснить свою дилемму. Еще раз спасибо.

ответ

0

Чтобы сделать викторину, похожую на вашу, я думаю, что вам не нужно дублировать весь контент на каждом кадре. Вы можете поместить свои вопросы в MovieClips (или один MovieClip со многими кадрами), а затем вы можете добавить его на свою сцену, а для своего флажка вы можете создать его один раз и каждый раз, когда сможете изменить только их значения и метки. Для кнопок вам нужна только одна кнопка, которая будет проверять и проверять текущий вопрос и перейти к следующему.

Взгляните на этот пример:

var score:int; 
var max_score:int; 
const default_score:int = 20; 

// create our questions list (7 questions) : 
var questions_list:Object = { 
    // index  : to identify our question 
    // movie_clip : the class name used for AS linkage  
    1: { index : 1, movie_clip : Question1, good_answer : 'css3', first_answer : 'html5', second_answer : 'jquery', third_answer : 'css3', score : default_score }, 
    2: { index : 2, movie_clip : Question2, good_answer : 'html5', first_answer : 'html5', second_answer : 'less', third_answer : 'ruby', score : 50 }, 
    3: { index : 3, movie_clip : Question3, good_answer : 'jquery', first_answer : 'ruby', second_answer : 'jquery', third_answer : 'css3', score : default_score }, 
    4: { index : 4, movie_clip : Question4, good_answer : 'less', first_answer : 'less', second_answer : 'html5', third_answer : 'css3', score : 15 }, 
    5: { index : 5, movie_clip : Question5, good_answer : 'nodejs', first_answer : 'python', second_answer : 'nodejs', third_answer : 'jquery', score : 10 }, 
    6: { index : 6, movie_clip : Question6, good_answer : 'python', first_answer : 'css3', second_answer : 'html5', third_answer : 'python', score : default_score }, 
    7: { index : 7, movie_clip : Question7, good_answer : 'ruby', first_answer : 'ruby', second_answer : 'html5', third_answer : 'less', score : default_score } 
}; 

var enabled_questions:Array = [1, 2, 3, 4, 5, 6, 7];  
var current_question:int = 0; 

//---------------------------------------------------------------------------------------------------- 

// sprite that shows our questions 
var questions_container:Sprite = new Sprite(); 
    questions_container.x = questions_container.y = 20; 
    questions_container.visible = false; 
    addChild(questions_container); 

var checks_group:RadioButtonGroup = new RadioButtonGroup('checks_group'); 

// sprite that contains our 3 check box 
var checks_container:Sprite = new Sprite(); 
    checks_container.visible = false; 
    checks_container.x = int(stage.stageWidth/2); 
    checks_container.y = 50; 
    addChild(checks_container); 

// create our check box, 3 buttons in my case 
// the 4th one is used only to uncheck every time all check box 
for(var i:int = 0; i < 4; i++) 
{ 
    var btn_check:RadioButton = new RadioButton(); 
     if(i != 3){ 
      btn_check.y = i * 30;  
     } else { 

      // our 4th check box is hidden 
      btn_check.visible = false; 
     } 
     btn_check.group = checks_group; 
     btn_check.name = 'btn_check' + i; 
     checks_container.addChild(btn_check); 
} 

// start button 
var btn_start:Button = new Button(); 
    btn_start.label = 'Start ! '; 
    btn_start.width = 180; 
    btn_start.height = 60; 
    btn_start.x = int((stage.stageWidth - btn_start.width)/2); 
    btn_start.y = int((stage.stageHeight - btn_start.height)/2) - 20; 
    btn_start.addEventListener(MouseEvent.CLICK, startQuiz); 
    addChild(btn_start); 

// next button, to go to the next question 
var btn_next:Button = new Button() 
    btn_next.label = 'Next >> '; 
    btn_next.width = 90; 
    btn_next.height = 30; 
    btn_next.visible = false; 
    btn_next.x = stage.stageWidth - btn_next.width - 10; 
    btn_next.y = stage.stageHeight - btn_next.height - 10; 
    btn_next.addEventListener(MouseEvent.CLICK, checkAnswer); 
    addChild(btn_next); 

// a text field which will show the score and the current question number 
var txt_score:TextField = new TextField(); 
    txt_score.width = 200; 
    txt_score.height = 30; 
    txt_score.x = stage.stageWidth - txt_score.width; 
    txt_score.y = 10; 
    txt_score.visible = false; 
    txt_score.selectable = false; 
    addChild(txt_score); 

//---------------------------------------------------------------------------------------------------- 

function startQuiz(e:MouseEvent):void 
{ 
    // here we will get only 5 questions 
    // I used a method from http://stackoverflow.com/questions/11980657/as3-random-array-randomize-array-actionscript-3 to shuffle the array 
    // and then I remove the last 2 elements from the array 
    enabled_questions = enabled_questions.sort(function(i:*,j:*){return(Math.random()<.5)?-1:1;}).slice(0,enabled_questions.length-2); 

    for(var i:int = 0; i < enabled_questions.length; i++){ 
     var q_i:int = enabled_questions[i]; 
     var q:Object = questions_list[q_i]; 
     max_score += q.score; 

     // create our questions instance and hide it 
     // every question is an instance of a movieclip in our library 
     // we can alse use only one movieclip and then we can use its timeline to go from a question to another 
     var question = new (q.movie_clip); 
      question.index = q_i; 
      question.visible = false; 
      questions_container.addChild(question); 
    }  

    // hide the start button 
    e.target.visible = false; 

    // show other elements 
    questions_container.visible = checks_container.visible = btn_next.visible = txt_score.visible = true  

    // load the first question 
    loadQuestion(current_question); 

} 

// check the answer and update score 
function checkAnswer(e:MouseEvent):void 
{ 
    var question:Object = questions_list[enabled_questions[current_question]]; 

    if(question.good_answer == checks_group.selectedData){ 

     // update the score 
     setScore(question.score);  
    } 

    if(current_question < enabled_questions.length - 1){   

     current_question ++; 
     loadQuestion(current_question); 

    } else { 

     e.target.x = e.target.y = 0; 
     e.target.enabled = false; 
     e.target.width = stage.stageWidth; 
     e.target.height = stage.stageHeight; 
     e.target.label = 'You have finished the quiz, your score is : ' + score; 

     checks_container.visible = questions_container.visible = txt_score.visible = false; 

    } 
} 

// load question (show it) and update our check box 
function loadQuestion(index:int):void 
{ 
    var question:Object = questions_list[enabled_questions[index]]; 

    for(var i:int = 0; i < checks_container.numChildren; i++){  
     if(checks_container.getChildAt(i) is RadioButton){ 
      var btn:RadioButton = RadioButton(checks_container.getChildAt(i));   
      switch (btn.name){    
       case 'btn_check0' : btn.value = btn.label = question.first_answer; break; 
       case 'btn_check1' : btn.value = btn.label = question.second_answer; break; 
       case 'btn_check2' : btn.value = btn.label = question.third_answer; break; 
       case 'btn_check3' : btn.selected = true; break; 
      }    
     }  
    } 

    for(i=0; i < questions_container.numChildren; i++){    
     if(questions_container.getChildAt(i) is MovieClip){ 
      var mc:MovieClip = MovieClip(questions_container.getChildAt(i)); 
       mc.visible = mc.index == question.index;  
     }  
    } 

    // setScore is used here just to update the question number in the score text field 
    setScore(); 

} 

// show the score and current question 
function setScore(new_score:int = 0){ 
    score += new_score; 
    txt_score.text = 'Score : ' + score.toString() + '/' + max_score.toString() + ', Question : ' + (current_question+1) + '/' + enabled_questions.length; 
} 

// icons used in this example by Jozef Krajčovič : https://www.iconfinder.com/Jozef89 

Этот код дает вам что-то вроде этого:

enter image description here

Вы также можете видеть, что это работает here.

Конечно, это простой пример, вы можете улучшить и адаптировать его к вашим потребностям.

Надеюсь, что это поможет.

+0

Огромное вам спасибо за все то, что вы вложили. Он работает безупречно! Сразу после сна я сразу начну работать. Awesome..awesome..awesome! – Mitra

+0

После нажатия «Старт» я получил: # 1007: Мгновенное действие было предпринято при ошибке неконструктора, и оно указывает на var question = new (q.movie_clip); Не могли бы вы рассказать мне, что мне не хватает? Я создал экземпляр для каждого из 7 вопросов в библиотеке. – Mitra

+0

В моем примере я помещаю каждое изображение (css3, ruby, ...) в качестве MovieClip в библиотеку с классом Question1, Question2, ... Question7. – akmozo

0

Похоже, вам просто нужна одна кнопка отправки, которая переходит к следующему кадру. Таким образом, вам не нужно беспокоиться о заказе.

Некоторые примеры кода, чтобы дать вам представление о том, как это могло бы работать

var index = 0; 
var currentQuestion:int = final_array[index]; 
var answers:Object = { 
    8158: '12', 
    8159: '13' 
    //...etc. 
}; 

submitBtn.addEventListener(MouseEvent.CLICK, onSubmitClicked); 

function onSubmitClicked(e:MouseEvent):void { 
    var answer:String = getAnswer(); //get the user's answer 
    if (answer === answers[currentQuestion]) { 
     awardScore(currentQuestion); 
     ++index; 
     currentQuestion = final_array[index]; 
     gotoAndStop(final_array[index]); 
    } 
} 

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

+0

См. Мое редактирование, надеемся, что это будет иметь больший смысл. –

+0

Спасибо, Барис. Я пытаюсь реализовать ваш код сейчас и обновлять оригинал, когда я иду. Если вы можете следить за потоком, я был бы очень признателен. – Mitra

+0

В обновленном коде выше я получаю сообщение об ошибке # 1006: значение не является функцией. Debug говорит, что «ответ не определен». Кроме того, я боюсь, что у меня будет ошибка для строки «awardScore», поскольку она не была назначена. Но я еще не смог добраться до этой части. Любые указатели? – Mitra

Смежные вопросы