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

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


Котяра 14.07.2014 14:37

Не вникал особо в код, но есть подозрение, что клик происходит не по
Код AS3:

 answerMassiv[k].

а по его детям, соответственно в обработчике
target другой и у него нет num
Код AS3:

 function onClick(e:MouseEvent):void {
        var prev = new Number(e.target.num);

замените на
Код AS3:

 function onClick(e:MouseEvent):void {
        var prev = new Number(e.currentTarget.num);


FlashPRO 14.07.2014 16:19

Не получается. Вернее, всё работает, но ошибка не ушла. Но за помощь спасибо!

Котяра 17.07.2014 14:41

Запустите в дебагере. Он подскажет сразу, в каком месте происходит ошибка.


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

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