Ошибка типа 1009, XML и AS3 - PullRequest
0 голосов
/ 25 марта 2010

Моя анимация продвигается вперед, но она заморожена. Он выдает TypeError 1009. Как мне избавиться от этой ошибки и заставить ее играть?

скачать
http://sandboxfun.weebly.com/

XML

<?xml version="1.0" encoding="utf-8"?>
<SESSION>
 <TIMER TITLE="speed">1000</TIMER>
 <COUNT TITLE="starting position">10000</COUNT>
</SESSION>

FLA

//DynamicText 'Count'
 var timer:Timer = new Timer(10);  
 var count:int = 0;
 var fcount:int = 0; 

timer.addEventListener(TimerEvent.TIMER, incrementCounter);  
 timer.start();  

function incrementCounter(event:TimerEvent) { 
 count = myXML.COUNT.text();
 count++;  
 fcount=int(count*count/1000);
 mytext.text = formatCount(fcount);
 }

function formatCount(i:int):String { 
 var fraction:int = i % 100; 
 var whole:int = i / 100;  

 return ("0000000" + whole).substr(-7, 7) + "." + (fraction < 10 ? "0" + fraction : fraction); 
 } 

//LOAD XML
 var myXML:XML;
 var myLoader:URLLoader = new URLLoader();
 myLoader.load(new URLRequest("time.xml"));
 myLoader.addEventListener(Event.COMPLETE, processXML);
  /*------CHANGED TIMER VALUE WITH XML------*/
  timer = new Timer( Number(myXML.TIMER.text()) );
  //timer.start();

//PARSE XML
function processXML(e:Event):void {
 myXML = new XML(e.target.data);
  trace(myXML.COUNT.text()); 
  trace(myXML.TIMER.text()); 
 }
//var count:int = 0;//give it a value type
 /*------CHANGED COUNT VALUE WITH XML------*/
 count = myXML.COUNT.text();

ERROR

TypeError: Ошибка # 1009: невозможно получить доступ к свойству или методу с нулевым значением ссылка на объект.
в _fla :: MainTimeline / frame1 ()
TypeError: Ошибка # 1009: невозможно получить доступ к свойству или методу пустой ссылки на объект.
в _fla :: MainTimeline / incrementCounter ()
на flash.utils :: Timer / _timerDispatch ()
на flash.utils :: Timer / галочкой ()

1 Ответ

2 голосов
/ 25 марта 2010

Вы делаете ту же самую очень простую ошибку, которую допустили в одном из своих предыдущих вопросов, и это показывает, что вы еще не очень хорошо понимаете, как выполняется ваш код, в каком порядке и т. Д. Я прошел через это и избавился от ошибок, но код ничего не делает, кроме отображения некоторых чисел. Я не знаю, если это цель, хотя.

Прежде чем я вставлю код, несколько заметок на вашем. С одной стороны, это еще раз ужасно грязно. Я правильно отформатировал, но больше не буду делать это с вашим кодом. В мире проще всего поддерживать код в хорошем формате, и это действительно облегчает жизнь других людей при попытке его интерпретировать. Я действительно настоятельно рекомендую вам начать.

Во-вторых, проблема с вашим кодом и ошибками, которые вы получали, были результатом попытки получить доступ к содержимому переменных, которые вы еще не установили. Основным виновником был ваш объект myXML, к которому вы пытались обратиться в incrementCounter еще до того, как запустили функцию processXML. Это довольно просто, и вы должны узнать, как выполняется код, чтобы избежать подобных проблем. Кроме того, я бы не стал помещать объявления переменных между функциями, если вы кодируете прямо на временной шкале, это может и будет ужасно сбивать с толку. Поместите все объявления вверху, затем вызовите некоторую функцию, которая запустит все, а ваши функции будут ниже. Я изменил ваш код, чтобы отразить этот совет.

Наконец, эти типы ошибок («не может получить доступ к свойству или методу с нулевым значением» и т. Д.) Обычно очень легко диагностировать с помощью ограниченного отладчика Flash. Запустите «Debug Movie» из меню «Отладка» во Flash. Преимущество отладчика в том, что он не только покажет вам ошибку в окне вывода, но и остановится на строке кода, которая вызвала ошибку, так что вы сможете увидеть, в чем проблема. Есть даже окно, которое отображает все переменные в текущей области видимости, так что вы можете увидеть, какая из них равна нулю или что-то еще. Используя это, вы смогли бы исправить эти ошибки самостоятельно; Подобные ошибки типа обычно не подходят для размещения на форуме. Конечно, если вы действительно застряли, вы должны спросить, но это хорошо, чтобы узнать, как вы можете исправить эти вещи самостоятельно, и многие из ваших сообщений повторяют одни и те же вопросы.

В любом случае, этот модифицированный код:

//DynamicText 'Count'
var timer:Timer = new Timer(10);  
var count:int = 0;
var fcount:int = 0; 

//LOAD XML
var myXML:XML;
var myLoader:URLLoader = new URLLoader();
myLoader.load(new URLRequest("time.xml"));
myLoader.addEventListener(Event.COMPLETE, processXML);
/*------CHANGED TIMER VALUE WITH XML------*/
//timer.start();

function incrementCounter(event:TimerEvent) 
{ 
    //Before, this function was being called before 
    //you had read in your XML file, so myXML was empty.
    count = myXML.COUNT.text();
    count++;  
    fcount=int(count*count/1000);
    mytext.text = formatCount(fcount);
}

function formatCount(i:int):String 
{ 
    var fraction:int = i % 100; 
    var whole:int = i / 100;  

    return ("0000000" + whole).substr(-7, 7) + "." + (fraction < 10 ? "0" + fraction : fraction); 
} 


//PARSE XML
function processXML(e:Event):void 
{
    myXML = new XML(e.target.data);
    trace(myXML.COUNT.text()); 
    trace(myXML.TIMER.text()); 
    count = myXML.COUNT.text();

    //I put this here, so that this timer's event will only be 
    //created once myXML is initialised with XML data.
    timer = new Timer( Number(myXML.TIMER.text()) );
    timer.addEventListener(TimerEvent.TIMER, incrementCounter);  
    timer.start();  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...