AS3 - 浏览数组元素

AS3 - Navigating through array elements

您好,感谢您抽出宝贵时间。我有一个 as3 代码,它从 7 帧中随机选择 5 帧,不重复。

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]);
        }
    }

我的问题是...由于用户只会转到 7 个中随机选择的 5 个帧,我如何才能确保所有 7 个帧中的所有按钮都将监听并跟随 gotoAndStop(final_array []);以 5 的顺序声明?因为在最后,会遗漏 2 帧,而那两帧会在每一卷中随机变化。我希望我能解释我的困境。再次感谢。

听起来您只需要一个转到下一帧的提交按钮。这样你就不用担心顺序了。

一些示例代码可让您了解其工作原理

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]);
   }
}

想法是将所有逻辑都放在一个单击处理程序中,单击后它将获取用户的答案并检查它是否正确,如果正确则继续下一个问题。

要进行像您这样的测验,我认为您不需要在每一帧上复制所有内容。您可以将您的问题放入 MovieClip(或一个包含多个帧的 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  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

这段代码给你这样的东西:

您还可以看到它正在运行 here

当然这只是一个简单的例子,您可以根据自己的需要进行改进和适配。

希望能帮到你。