0

我正在为基于数学的小孩制作一个教育 Flash 游戏,我希望能够从带有 as3 的文本文件中读取,在文本框中打印一个问题,然后接受用户输入并将其与答案进行比较还在该文件中检查用户是否输入了正确的答案,如果没有加载另一个问题供用户回答。

我以前做过这种事情,在 Visual Basic 中,制作一个文本语言词典,其中文件中的单词用“=”分隔,我告诉程序它们被那个字符分隔,程序打印了这两个词放入单独的文本框,相互对齐。如:“lol = Laughing Out Loud”就是其中的一句台词。

我希望能够有一个文本文件在一行上读取,例如“2x2 = 4”,然后游戏将能够将标志的左侧打印给用户,然后检查用户的输入内容右边的标志,看答案是正确的。

我希望这不会太混乱。我已尝试将文件打印到文本框中,但不确定如何使其仅打印问题,而不是整个文件,然后检查答案。

我是 AS3 和 flash 的初学者,并且已经承认这对于我的技能水平来说可能是一个过分的实验。任何帮助表示赞赏。

4

3 回答 3

3

当您想从 Flash 中更复杂的东西开始时,可​​能很难找到一种方法。正如 Jordan 所建议的,xml 是请求信息的最佳方式。您的 xml 文件看起来像这样:

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

(您可以将其复制并粘贴到记事本并保存为 .xml)

在 flash actionscript 中,您需要一些项目才能处理此 xml。我在名为“Main.as”的单独动作脚本文件中使用以下模板:

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;
            //totalNr = myList.excercise.length(); = the amount of excercises in your file
            //var str:string = myList.excercise[0].question;
            //trace (str) would give you the text of the question of the first excercise
        }
    }

}

编辑 假设您在舞台上创建了一个文本框并将其命名为questionTxt。要将您的问题添加到该文本框中,您会说:

questionTxt.text = myList.excercise[0].question;

在其下方,创建一个输入文本字段,您的学生可以在其中输入答案。称之为answerTxt

还要创建一个检查按钮,以便他们在给出答案后按下它。称之为checkBtn

您还需要一个函数来将他们的输入与 xml 中的答案进行比较。我将在下面解决它。

现在你像这样向 checkBtn 添加一个事件监听器:

checkBtn.addEventListener(MouseEvent.CLICK, checkAnswer)

以及检查答案的功能(方便地命名为checkAnswer):

function checkAnswer (event:MouseEvent) : void {
    if (answerTxt.text == myList.excercise[0].answer) {
        trace ("correct");
    } else {
        trace ("wrong");
    }
}

您将 xml-data 视为一个数组。第一个练习将作为 myList.excercise[0].question 找到,第二个将是 myList.excercise[1].question 等。

于 2012-06-18T08:52:53.083 回答
1

你听说过xml吗?它非常适合您尝试做的事情。至于加载,请使用 URLLoader 和 URLRequest 类。您将需要一个完整的处理程序来处理加载后的数据。我会在 as3 中使用 Google xml 来了解如何使用它。然后查看 Adob​​e 帮助码头以了解加载情况。自学是最好的学习方式,所以我鼓励您尽最大努力自己解决问题,但如果您有问题,请在这里问他们,我或其他人可以帮助您弄清楚具体细节。

于 2012-06-18T05:34:57.847 回答
0
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 中进行管理,如果正确,则立即跟随下一个问题。如何实现它没有达到。

于 2013-04-16T16:27:33.270 回答