Ошибка № 1009, ActionScript 3 - PullRequest
       16

Ошибка № 1009, ActionScript 3

0 голосов
/ 09 февраля 2012

Я использую SWF (accueil) внутри другого SWF (ranchleblanc_fr), и это приводит к появлению ошибки 1009:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at accueil_fla::MainTimeline/frame1()"

Первый SWF-файл имеет эффект частиц, и он не запустится при первой загрузке страницы. Если я нажму на любую кнопку главной страницы и вернусь к следующей странице, эффект сработает. Но если я снова нажму на другую кнопку, я получу еще одну ошибку 1009, но на этот раз она появляется не только один раз. Он появляется снова и снова, пока я не закрою SWF.

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at accueil_fla::MainTimeline/newFlake()"

Я включу код, но прежде чем сделать это, я должен сказать, что я установил флажок, чтобы разрешить отладку в настройках публикации, и у меня нет номера строки, чтобы найти ошибку. Я использовал трассировку и обнаружил, что переменная null равна flake. Я искал в Интернете, чтобы выяснить, как решить мою проблему, и я думаю, что мне нужно использовать оператор if, поэтому убедитесь, что программа работает с переменной null. Я думаю, что я должен проверить, является ли переменная flake null, и если это так, объявить какое-то значение для нее.

Проблема в том, что я знаю, как закодировать этот оператор if ...

Вот мой код для accueil_fla, кадр 1 (где можно найти все действия для этого флага)

for (var i:uint = 0; i < 50; i++)
{
    flake.x = Math.random() * stage.stageWidth;
    flake.y = Math.random() * stage.stageHeight;
    flake.alpha = randRange(.3,1);
    flake.scaleX = flake.scaleY = randRange(.3,1);
    addChild(flake);
} 

function randRange(low:Number, high:Number):Number
{
    var randNum:Number = Math.random() * (high - low) + low;
    return randNum;
}

this.addEventListener(Event.ENTER_FRAME, newFlake);

function newFlake(e:Event):void
{
    var flake:Snowflake = new Snowflake(randRange(-1,1), randRange(2,5));
    flake.x = Math.random() * stage.stageWidth;
    flake.y = -5;
    flake.alpha = randRange(.3,1);
    flake.scaleX = flake.scaleY = randRange(.3,1);
    addChild(flake);
}
var flake:Snowflake = new Snowflake(randRange(-1,1), randRange(2,5));

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

//----------------initialization---------------\\

extLoader_mc.visible = false;

//--------------------loader------------------------\\

var loader:Loader = new Loader;

loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, preload);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, done);

function preload (e:ProgressEvent):void
{
    extLoader_mc.visible = true;
    var pct:Number = e.bytesLoaded / e.bytesTotal;
    extLoader_mc.extLoaderBar_mc.scaleX = pct;
}

function done (e:Event):void
{
    extLoader_mc.visible = false;
    canvas_mc.addChild(loader);
}

//-----------------------end loader----------------\\


var firstLoad:URLRequest = new URLRequest("accueil.swf");
loader.load(firstLoad);
var currentPage:MovieClip;
currentPage=accueil_mc;
currentPage.gotoAndPlay("down");
accueilHit_mc.targetmc = accueil_mc;
aProposHit_mc.targetmc = aPropos_mc;
animauxHit_mc.targetmc = animaux_mc;
locationHit_mc.targetmc = location_mc;
contactHit_mc.targetmc = contact_mc;

accueilHit_mc.buttonMode = true;
aProposHit_mc.buttonMode = true;
animauxHit_mc.buttonMode = true;
locationHit_mc.buttonMode = true;
contactHit_mc.buttonMode = true;

function el () 
{
    accueilHit_mc.addEventListener(MouseEvent.CLICK, accueilPage);
    accueilHit_mc.addEventListener(MouseEvent.MOUSE_OVER, btnOver);
    accueilHit_mc.addEventListener(MouseEvent.MOUSE_OUT, btnOut);
    //aProposHit_mc.addEventListener(MouseEvent.CLICK, aProposPage);
    aProposHit_mc.addEventListener(MouseEvent.MOUSE_OVER, btnOver);
    aProposHit_mc.addEventListener(MouseEvent.MOUSE_OUT, btnOut);
    //animauxHit_mc.addEventListener(MouseEvent.CLICK, animauxPage);
    animauxHit_mc.addEventListener(MouseEvent.MOUSE_OVER, btnOver);
    animauxHit_mc.addEventListener(MouseEvent.MOUSE_OUT, btnOut);
    locationHit_mc.addEventListener(MouseEvent.CLICK, locationPage);
    locationHit_mc.addEventListener(MouseEvent.MOUSE_OVER, btnOver);
    locationHit_mc.addEventListener(MouseEvent.MOUSE_OUT, btnOut);
    contactHit_mc.addEventListener(MouseEvent.CLICK, contactPage);
    contactHit_mc.addEventListener(MouseEvent.MOUSE_OVER, btnOver);
    contactHit_mc.addEventListener(MouseEvent.MOUSE_OUT,btnOut);
}

function btnOver (e:MouseEvent):void 
{
    e.currentTarget.targetmc.gotoAndPlay("over");
}

function btnOut (e:MouseEvent):void 
{
    e.currentTarget.targetmc.gotoAndPlay("out");
}

function handCursor ()
{
    accueilHit_mc.useHandCursor = true;
    aProposHit_mc.useHandCursor = true;
    animauxHit_mc.useHandCursor = true;
    locationHit_mc.useHandCursor = true;
    contactHit_mc.useHandCursor = true;
    accueilHit_mc.enabled = true;
    aProposHit_mc.enabled = true;
    animauxHit_mc.enabled = true;
    locationHit_mc.enabled = true;
    contactHit_mc.enabled = true;
}
el();

accueilHit_mc.removeEventListener(MouseEvent.CLICK, accueilPage);
accueilHit_mc.removeEventListener(MouseEvent.MOUSE_OVER, btnOver);
accueilHit_mc.removeEventListener(MouseEvent.MOUSE_OUT, btnOut);

handCursor();

accueilHit_mc.useHandCursor = false;
accueilHit_mc.enabled = false;

function accueilPage (e:MouseEvent):void
{    
    currentPage.gotoAndPlay("out");            
    var req:URLRequest = new URLRequest("accueil.swf");
    loader.load(req);
    el();
    accueilHit_mc.removeEventListener(MouseEvent.CLICK, accueilPage);
    handCursor();
    accueilHit_mc.useHandCursor = false;
    accueilHit_mc.enabled = false;
    accueilHit_mc.removeEventListener(MouseEvent.MOUSE_OVER, btnOver);
    accueilHit_mc.removeEventListener(MouseEvent.MOUSE_OUT, btnOut);
    accueil_mc.gotoAndStop("down");
    currentPage=accueil_mc;
}

function aProposPage (e:MouseEvent):void
{
    currentPage.gotoAndPlay("out");    
    var req:URLRequest = new URLRequest("aPropos.swf");
    loader.load(req);
    el();
    aProposHit_mc.removeEventListener(MouseEvent.CLICK, aProposPage);
    handCursor();
    aProposHit_mc.useHandCursor = false;
    aProposHit_mc.enabled = false;
    aProposHit_mc.removeEventListener(MouseEvent.MOUSE_OVER, btnOver);
    aProposHit_mc.removeEventListener(MouseEvent.MOUSE_OUT, btnOut);
    aPropos_mc.gotoAndStop("down");
    currentPage=aPropos_mc;
}

function animauxPage (e:MouseEvent):void
{
    currentPage.gotoAndPlay("out");
    var req:URLRequest = new URLRequest("animaux_fr.swf");
    loader.load(req);
    el();
    animauxHit_mc.removeEventListener(MouseEvent.CLICK, animauxPage);
    handCursor();
    animauxHit_mc.useHandCursor = false;
    animauxHit_mc.enabled = false;
    animauxHit_mc.removeEventListener(MouseEvent.MOUSE_OVER, btnOver);
    animauxHit_mc.removeEventListener(MouseEvent.MOUSE_OUT, btnOut);
    animaux_mc.gotoAndStop("down");
    currentPage=animaux_mc;
}

function locationPage (e:MouseEvent):void
{
    currentPage.gotoAndPlay("out");
    var req:URLRequest = new URLRequest("location.swf");
    loader.load(req);
    el();
    locationHit_mc.removeEventListener(MouseEvent.CLICK, locationPage);
    handCursor();
    locationHit_mc.useHandCursor = false;
    locationHit_mc.enabled = false;
    locationHit_mc.removeEventListener(MouseEvent.MOUSE_OVER, btnOver);
    locationHit_mc.removeEventListener(MouseEvent.MOUSE_OUT, btnOut);
    location_mc.gotoAndStop("down");
    currentPage=location_mc;
}

function contactPage (e:MouseEvent):void
{
    currentPage.gotoAndPlay("out");        
    var req:URLRequest = new URLRequest("contact.swf");
    loader.load(req);
    el();
    contactHit_mc.removeEventListener(MouseEvent.CLICK, contactPage);
    handCursor();
    contactHit_mc.useHandCursor = false;
    contactHit_mc.enabled = false;
    contactHit_mc.removeEventListener(MouseEvent.MOUSE_OVER, btnOver);
    contactHit_mc.removeEventListener(MouseEvent.MOUSE_OUT, btnOut);
    contact_mc.gotoAndStop("down");
    currentPage=contact_mc;
}

Еще раз спасибо за вашу помощь, это очень ценится.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Скорее всего, ваша ошибка на самом деле не в вашем коде, а в настройке вашего проекта: кажется, вы ссылаетесь на фрагмент ролика, которого нет на сцене во время его вызова.

Вы должны думать о своей временной шкале как о реальной временной шкале: кадры представляют время!Если действие вашей кнопки запускает функции в другом мувиклипе, оно должно быть на сцене в этот момент - недостаточно, чтобы оно появилось в следующем кадре (или в другой сцене и т. Д. И т. Д..).

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

Кроме того, после того, как была сгенерирована ошибка ссылки на нулевой объект (или любая другая ошибка, которая осталась без обработки), вы больше не должны использовать свою программу -он сломан, вам нужно это исправить, прежде чем вы сможете продолжить!И вы, конечно, не можете доверять сообщениям об ошибках после первого.

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

1 голос
/ 09 февраля 2012

Здесь - статья, объясняющая, почему некоторые SWF-файлы AS3 работают отдельно, но не загружаются в другие SWF-файлы. Я надеюсь, что это будет полезно для вас:

...