| FlashPRO |
14.07.2014 13:08 |
Проблема с вызовом функции
Здравствуйте! Написал код для викторины. Всё работает, вопросы задаются рандомно, но в определённый момент приложение останавливается и выводится следующая ошибка: "TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".at Main/asking() at Main/onClick()". Пробовал её устранить, применял трассировку, но не обнаружил баг. Ко всему прочему, ошибка возникает каждый раз в новом месте: она может появиться как после первого вопроса, так и после десятого или любого другого. Бьюсь уже второй день, не нашёл ответ в поисковике. Вот сам код:
Код AS3:
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.text.*;
import TfFormat;
public class Main extends Sprite {
var externalXML:XML;//загруженный XML
var numOfQuestion:Number;//число вопросов
var currentXML:XML=new XML;//XML текущего вопрсоа
var currentElementText:String='';//текущий вариант ответа
var i;// номер текущего вопроса
var massiv:Array=[];// массив с ответами
var loader:URLLoader = new URLLoader();
var request:URLRequest=new URLRequest("super.xml");
var textF:TfFormat = new TfFormat;
var rnd:RND; //экземпляр генератора номера вопроса
public function Main() {
loader.load(request);
loader.addEventListener(Event.COMPLETE, preOnComplete);
}
/*
Функция загрузки XML-файла
*/
function preOnComplete(event:Event):void {
var tf:TextField = new TextField;
tf.text = 'Викторина'
tf.setTextFormat(textF);
var goStart:AnswerBut = new AnswerBut('запуск викторины');
tf.x =30;
tf.y =30;
tf.width = 300;
tf.height = 40;
goStart.x = 50;
goStart.y = 50;
addChild(tf);
addChild(goStart);
goStart.addEventListener(MouseEvent.CLICK, onComplete);
}
function onComplete(event:Event):void {
if (this.numChildren>1) {
while (this.numChildren > 1) {
this.removeChildAt(1);
}
}
if (loader!=null) {
externalXML=new XML(loader.data);
numOfQuestion = externalXML.quest.length();
asking(externalXML.quest.length()+1); //запускаем первый вопрос
}
}
/ Функция asking(numOff) отвечает за процесс задачи конкретного вопроса. В параметр функции передается номер предыдущего вопроса, который не должен задаваться повторно. При первом запуске функции этот номер больше длины массива вопросов. /
function asking(numOff):void {
var currentRandom:Number = numOff; //присваиваем текущему номеру
//вопроса предыдущий номер вопроса
while(currentRandom == numOff) {
currentRandom = Math.round(Math.random()*numOfQuestion);
//создаем номер вопроса, не равный
//предыдущему номеру
}
currentXML=externalXML.quest[currentRandom]; //текущий вопрос в виде XML
var tf:TextField = new TextField;
tf.text = currentXML.@text.toString();
tf.setTextFormat(textF);
tf.width = 400;
tf.height = 40;
tf.x = 20;
tf.y = 70;
tf.wordWrap = true;
addChild(tf);
var numMassiv:Array = [];
for (var i=0; i<currentXML.answer.length(); i++) {
numMassiv[i] = i
}
var answerMassiv:Array = [];
var answerNum = numMassiv.length;
for (var k=0; k<answerNum; k++) {
var kk = Math.round(Math.random()*(numMassiv.length-1));
answerMassiv[k]=new AnswerBut(currentXML.answer[numMassiv[kk]]);
if (numMassiv[kk] == 0) answerMassiv[k].correct = true;
answerMassiv[k].num = currentRandom;
trace(currentRandom);
numMassiv.splice(kk,1);
answerMassiv[k].x=30;
answerMassiv[k].y=k*20+120;
addChild(answerMassiv[k]);
answerMassiv[k].addEventListener(MouseEvent.CLICK, onClick);
}
}
function onClick(e:MouseEvent):void {
var prev = new Number(e.target.num);
//удаляем всех потомков класса
if (this.numChildren>1) {
while (this.numChildren > 1) {
this.removeChildAt(1);
}
}
asking(prev);
}
}
}
|