我正在为小孩子制作一个基于数学的教育性Flash游戏,我希望能够从文本文件中读取as3,在文本框中打印的问题,然后由用户输入并进行比较如果没有加载另一个问题供用户回答,也可以在该文件中回答用户是否输入了正确的答案。
我之前在Visual Basic中做过这样的事情,制作一个文本语言词典,文件中的单词用'='分隔,我告诉程序它们被那个字符分开,打印的程序将这两个单词分成单独的文本框,相互对齐。如:“lol = Laughing Out Loud”是其中一条线。
我希望能够在一行上有一个文本文件,例如“2x2 = 4”,然后游戏就可以将符号的左侧打印给用户,然后检查用户的输入标志右侧的内容,看到答案是正确的。
我希望这不会太混乱。我已经尝试将文件打印到文本框中,但我不确定如何使其仅打印问题,而不是整个文件,然后检查答案。
我是AS3和Flash的初学者,并承认这可能是我的技能水平的过度实验。 任何帮助表示赞赏。
答案 0 :(得分: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动作脚本中,您需要一些项目才能解决此xml问题。我在一个名为“Main.as”的单独的actionscript文件中使用以下模板:
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中的答案进行比较。我将在下面提到它。
现在您将checkltner添加到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等。
答案 1 :(得分:1)
你听说过xml吗?它非常适合你想要做的事情。至于加载,请使用URLLoader和URLRequest类。一旦加载,您将需要一个完整的处理程序来处理数据。我会在as3中使用Google xml来了解如何使用它。然后查看Adobe帮助停靠站以找出加载情况。自学是最好的学习方式所以我鼓励你尽量自己解决,但如果你有问题,请在这里问我们,或者我或其他人可以帮你弄清楚具体细节。
答案 2 :(得分: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中管理了正确答案的挑战代码,如果正确,则紧接着下一个问题。 如何实现它无法达到。