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

AlexTrin 16.04.2013 19:37

Как перейти на след вопрос, если ответ правильный
 
Здравствуйте, имеется код:

Код:

<?xml version="1.0" encoding="UTF-8"?>
<myList>
    <excercise>
        <question>2 x 2?</question>
        <answer>4</answer>
    </excercise>
</myList>

Код AS3:

package 
{
 
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.xml.*;
    import flash.events.Event;
    import flash.display.Loader;
 
 
    public class Main extends MovieClip
    {
        var myFile:String;
        var xmlLoader:URLLoader;
        var myList:XML;
 
        public function Main()
        {         
            myFile =  "myList.xml";
            loadXml();
        }
        function loadXml():void
        {
            xmlLoader = new URLLoader(new URLRequest(myFile));         
            xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded);
        }
        function xmlLoaded(event:Event):void
        {
            myList = new XML(event.target.data);
            myList.ignoreWhite = true;
 
            questionTxt.text = myList.excercise[0].question;
            checkBtn.addEventListener(MouseEvent.CLICK, checkAnswer)
        }
 
          function checkAnswer (event:MouseEvent) : void {
            if (answerTxt.text == myList.excercise[0].answer) {
              trace ("correct");
            } else {
              trace ("wrong");
            }
        }
 
    }
 
}

Как перейти к следующему вопросу, если дан правильный ответ?

Добавлено через 1 час 37 минут
Пробовал так, что то не выходит:
Код AS3:

for (var i:uint = 0; i < NUM_QUESTIONS; i++) {
questionTxt.text = myList.excercise[i].question;
checkBtn.addEventListener(MouseEvent.CLICK, checkAnswer);
}

Добавлено через 1 час 52 минуты
Попробовал так:
Код AS3:

package 
{
        import flash.display.*;
    import flash.net.*;
    import flash.xml.*;
        import flash.text.*;
        import flash.events.*;
        import org.casalib.util.ArrayUtil;
 
    public class Main extends MovieClip
    {
        var myFile:String;
        var xmlLoader:URLLoader;
        var myList:XML;
                var questionTxt:TextField = new TextField();
            var questionNumber:uint = 0;
        var correctNumber:uint = 0;               
                var correctAnswer:String;
                var randomAnswer:Array;
                const NUM_QUESTIONS:uint = 3;
 
        public function Main()
        { 
                    right = new Sprite();
            addChild(right);
 
            myFile = "myList.xml";
            loadXml();
        }
 
        function loadXml():void
        {
            xmlLoader = new URLLoader(new URLRequest(myFile));         
            xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded);
        }
 
                public function randomiseArray(answers:XMLList):Array {
                        var rArray:Array = new Array();
                        for (var i:uint = 0; i < NUM_QUESTIONS; i++) {
                          rArray.push(answers[i]);
                        }
                    return ArrayUtil.randomize(rArray);
                }
 
                  function nextQuest ():void {
                        correctAnswer = myList.excercise[questionNumber].answer[0];
                        randomAnswer = randomiseArray ( myList.excercise[questionNumber].answer.children() );
 
                        questionTxt.type = "dynamic";
                        questionTxt.width = 208;
                        questionTxt.height = 32;
                        questionTxt.x = 196;
                        questionTxt.y = 101;
                        addChild(questionTxt);
                        questionTxt.text = myList.excercise[questionNumber].question;
 
                        for (var i:uint = 0; i < NUM_QUESTIONS; i++) {
                        var answerTxt:TextField  = new TextField(randomAnswer[i]);
                        answerTxt.type = "input";
                        answerTxt.x = 196;
                        answerTxt.y = 301;
                        answerTxt.width = 208;
                        answerTxt.height = 32;
                        answerTxt.background = true;
                        answerTxt.backgroundColor = 0xFFF00; 
                        answerTxt.addEventListener(KeyboardEvent.KEY_UP, checkAnswer);
                        addChild(answerTxt);               
                        }
                        }               
 
        function xmlLoaded(event:Event):void
        {
            myList = new XML(event.target.data);
            myList.ignoreWhite = true;
            totalNr = myList.excercise.length();
                        nextQuest();
                        }
 
                function checkAnswer (e:KeyboardEvent):void
                {                       
 
                while (right.numChildren) right.removeChildAt(0);
 
                if(correctAnswer == e.target.getChildAt(e.target.numChildren - 1).text) correctNumber++;
 
                        if (questionNumber == myList.excercise.length()-1) {
                                      trace ("wrong");
                                    answerTxt.backgroundColor = 0xFF0000;
                        }else{
 
                                        trace ("correct");
                                  answerTxt.backgroundColor = 0xFFF00;
                                  correctNumber++;
                                  nextQuest();
                                  }       
                        }                       
 
                }
 
}

Не выходит как то.
Задача кода в том, чтобы правильный ответ вводился в answerTxt, и если он правильный то тут же следовал следующий вопрос.
Как осуществить, что то не доходит.

chamele0n 17.04.2013 04:14

так чтоли ?
Код AS3:

private var question_id:int = 0;
 
function xmlLoaded(event:Event):void {
 myList = new XML(event.target.data);
 myList.ignoreWhite = true;
 questionTxt.text = myList.excercise[question_id].question;         
 checkBtn.addEventListener(MouseEvent.CLICK, nextAnswer);
}
 
function nextAnswer(event:MouseEvent) : void {
 if(question_id == myList.excercise.length()) {
    trace('end test');
    return;
 }     
 if (answerTxt.text == myList.excercise[question_id].answer) {
    question_id++;
    questionTxt.text = myList.excercise[question_id].question;
 }
}


AlexTrin 19.04.2013 12:49

chamele0n, огромное спасибо, все так.

AlexTrin 17.05.2013 15:32

Пытаюсь вывести вопросы из списка случайным образом, что то не выходит.
Код AS3:

 if(question_id == myList.excercise.length()) {
    trace('end test');
    var randomIndex:int = Math.floor( Math.random() * (question_id-1) );
    return myList.excercise[randomIndex];
 }

Народ помогите.

Sync 17.05.2013 16:27

Код AS3:

question_id == myList.excercise.length()-1

попробуйте

AlexTrin 17.05.2013 16:31

Sync, непомогло

Sync 17.05.2013 16:43

чего у вас невыходит то? трейс проходит?

AlexTrin 17.05.2013 17:32

Трейс то проходит, а вот вопросы как шли по порядку так и идут, никакой рандомности не появилось.

Idon'tKnow 18.05.2013 01:01

Код AS3:

var randomIndex:int = Math.floor( Math.random() * myList.excercise.length);

Т.к округление идёт в меньшую сторону, то тут должно быть для 3х вопросов следующие промежутки:
1.) [0-1)
2.) (1-2]
3.) [2-3)

Если Вы вычитаете из длины единичку, то у Вас получаются вот такая область значений randomIndex:
[0; 1) - последний вопрос уже никогда не будет показан. Первые 2 должны появляться.

2).
Код AS3:

function nextAnswer(event:MouseEvent) : void

Код AS3:

return myList.excercise[randomIndex];

Не забыли поменять тип возвращаемых данных?

И вообще, куда он их вернет, если это приёмник? Я конечно не уверен, но по-моему приёмник не возвращает ничего, а просто реагирует на события, Вы же не можете присвоить значение какой-нибудь переменной - ссылку на этот приёмник. :)

P.S. В последнем абзаце не уверен.

Добавлено через 46 минут
Покопался, всё таки можно присваивать переменной возвращаемое значение переменной, но придется инициализировать вызов этого самого события. У Вас есть что-то, типа:↓ ?

Код AS3:

var secRect:Sprite;
var first:Sprite;
 
secRect = new Sprite();
secRect.graphics.beginFill(0x0000FF);
secRect.graphics.lineStyle(1);
secRect.graphics.drawRect(190, 200, 20, 20);
stage.addChild(secRect);
 
first = new Sprite();
first.graphics.lineStyle(1);
first.graphics.drawCircle(10, 20, 40);
stage.addChild(first);
 
first.addEventListener(MouseEvent.MOUSE_DOWN, firstListener);
secRect.addEventListener(MouseEvent.MOUSE_DOWN, secRectListener);
 
private function secRectListener(e:MouseEvent):void {
                                trace("secRect!");
                                //e.updateAfterEvent();
                }
 
private function firstListener(e:MouseEvent):void {
                                trace("first");
                                secRectListener(e); // вызов события.
                }

Буду рад услышать критику, если ошибаюсь в чём-либо. :)

AlexTrin 20.05.2013 12:52

А если вопроса не 3, а десятки или сотни, что тогда?
Не могу разобраться как добиться рандомности в таком случае.


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

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