2012-02-09 3 views
0

J'utilise un fichier SWF (accueil) dans un autre fichier SWF (ranchleblanc_fr), ce qui provoque l'erreur 1009 apparaître:Erreur # 1009, ActionScript 3

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

Le premier SWF a un effet de particules en elle et ne démarre pas lorsque je charge la page pour la première fois. Si je clique sur n'importe quel bouton de la page principale et retourne à la page d'accueil, l'effet fonctionne. Mais si je clique à nouveau sur un autre bouton, j'obtiens une autre erreur 1009, mais cette fois-ci elle n'apparaît pas seulement une fois. Il apparaît encore et encore jusqu'à ce que je ferme le SWF.

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

je vais inclure le code, mais avant de le faire, je dois dire que j'ai vérifié la boîte pour permettre le débogage dans les paramètres de publication, et je ne dispose pas d'un numéro de ligne pour localiser l'erreur. J'ai utilisé trace et a découvert que la variable null est flake. J'ai cherché sur Internet comment résoudre mon problème, et je pense que je dois utiliser une instruction if, donc assurez-vous que le programme fonctionne avec une variable null. Je pense que je devrais vérifier si la variable flake est null et si c'est le cas, déclarez une sorte de valeur.

Le problème est que je ne sais comment le code que l'instruction if ...

Voici mon code pour accueil_fla, cadre 1 (où toutes les actions de ce fla peuvent être trouvés)

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

Je peux également inclure le code de la page principale pour déterminer pourquoi l'effet des particules de neige ne fonctionne pas sur la première charge.

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

Merci encore pour votre aide, il est très apprécié.

+0

lorsque vous chargez un fichier .swf dans le second, alors le fichier SWF ne doit pas avoir de référence de la scène.cela renvoie une erreur si vous avez une référence de scène. –

+0

Salut et bienvenue à Stack Overflow. Tout d'abord, bien que ce soit sûrement une bonne intention qui vous ait fait publier votre code entier, cela n'aide pas la lisibilité de votre question - c'est un ** lot ** de code à lire. En outre, le re-formatage était une douleur: S'il vous plaît noter que l'éditeur de code sur SO s'attend à ce que les espaces soient des caractères espace, pas des onglets ... – weltraumpirat

+0

s'il vous plaît trace (stage) avant de faire l'appel stage.stageWidth. Votre scène peut être nulle. Sinon, ça va! –

Répondre

2

Votre erreur n'est probablement pas vraiment dans votre code, mais dans la configuration de votre projet: Vous semblez référencer un clip qui n'est pas sur la scène au moment où vous l'appelez.

Vous devez considérer votre chronologie comme un scénario réel: Les images représentent le temps! Si votre action de bouton déclenche des fonctions dans un autre clip, elle doit être sur la scène à ce moment précis - il ne suffit pas de l'afficher dans une image ultérieure (ou dans une autre scène, etc.etc.). Vous devriez inclure des vérifications nuls dans votre programme, oui, mais cela ne fonctionnerait probablement pas comme prévu de toute façon, même si ça ne plante plus - où il n'y a rien qui puisse exécuter une commande, il n'y aura aucun mécanisme pour réellement faire le travail ...

Aussi, une fois qu'une erreur de référence d'objet nul a été levée (ou toute autre erreur qui n'a pas été détectée, d'ailleurs), vous ne devriez plus utiliser votre programme - il est cassé, vous devez réparez-le, avant de pouvoir continuer! Et vous ne pouvez certainement pas faire confiance aux messages d'erreur après le premier. Pensez-y comme une horloge: Si à n'importe quel moment l'une des roues dentées s'arrêtait de tourner, aucune des autres roues ne pourrait - mais une seule d'entre elles serait cassée, provoquant ainsi le dysfonctionnement de toutes les autres. Seulement après avoir réparé la première erreur, vous pouvez être sûr qu'il y a vraiment un autre problème.

+0

Très clair moyen d'expliquer le concept de chronologie. J'avais oublié ça. Ça fait un moment que je travaillais avec Flash. Merci beaucoup. – jpl

1

Here est un article qui explique pourquoi certains fichiers SWF AS3 fonctionnent seuls, mais ne parviennent pas à se charger dans d'autres fichiers SWF. J'espère que cela vous sera utile:

+0

Merci beaucoup. Cet article était vraiment utile. Cela m'aide à comprendre le concept de l'erreur redoutée 1009. – jpl