2016-11-17 2 views
1

Fondamentalement, je suis en train de coder pour basculer entre les scènes en cliquant sur les boutons. Je donne des noms de scène de sable d'étiquette de cadre comme arguments. MovieClip (root) .gotoAndStop (frameLabel, sceneName); fonctionne bien sur la scène. Mais quand j'utilise la même chose sur la classe, il lance l'avertissement TypeError: Erreur # 1009: Impossible d'accéder à une propriété ou méthode d'une référence d'objet nul. Je sais que cela arrive car il n'y a pas de racine pour la classe. Y a-t-il un moyen de le réparer? Veuillez trouver le code ci-dessous.Étape de renvoi de la classe Action Script 3

// code de classe

package { 
    import flash.events.KeyboardEvent; 
    import flash.events.MouseEvent; 
    import flash.display.SimpleButton; 
    import flash.display.*; 
    import flash.text.*; 
    import flash.events.Event; 
    import flash.display.MovieClip; 

    public class ClickButton extends SimpleButton { 
    public var fLabel:String; 
    public var sName:String; 
    public var sNumber:Number; 

    public function ClickButton() 
    { 

    }  

    public function GotoSession(sesBut:SimpleButton, frameLabel:String, sceneName:String):void {   
    sesBut.addEventListener(MouseEvent.CLICK, gotoSes);   
    function gotoSes(event:MouseEvent):void {  
    MovieClip(root).gotoAndStop(frameLabel, sceneName); 
    } 
    } 
} 

// Code AS3

var btn1 = new ClickButton(); 
addChild(btn1); 
btn1.GotoSession(home, "menu", "Home"); 

Répondre

1

Vous avez deux problèmes ici, et je ne comprends pas vraiment pourquoi vous travaillez comme ça, mais,

1: Quand j'essaye de compiler votre code, j'obtiens un temps de compilation Erreur:

Il manque un "}" à la fin de Y notre classe.

J'ai enlevé ce qui ne sert pas:

package { 
    import flash.events.MouseEvent; 
    import flash.display.SimpleButton; 
    import flash.display.MovieClip; 
    public class ClickButton extends SimpleButton { 
     public function ClickButton() { 
     } 
     public function GotoSession(sesBut:SimpleButton,frameLabel:String,sceneName:String):void { 
      sesBut.addEventListener(MouseEvent.CLICK,gotoSes); 
      function gotoSes(event:MouseEvent):void { 
       MovieClip(root).gotoAndStop(frameLabel,sceneName); 
       // and if You want to remove the ClickButton instance :; 
       // ADD those two lines : 
       sesBut.removeEventListener(MouseEvent.CLICK,gotoSes); 
       MovieClip(root).removeChild(sesBut); 
       // DO NOT forget to remove the Listeners before to remove an instance! 
      } 
     } 
    } 
} 

Je suppose que vous avez un bouton dans votre bibliothèque lié à la classe ClickButton comme ci-dessous:

enter image description here

Alors:

var btn1:ClickButton = new ClickButton(); 
addChild(btn1); 
btn1.GotoSession(btn1, "menu", "Home"); 
stop(); 

Si je clique sur btn1, cela m'amène à t La scène "Home" à l'étiquette "menu".

Cela fonctionne comme un charme.

sur le frameLabel "menu":

stop(); 
trace("currentScene.name = " + this.currentScene.name); 
trace("currentFrameLabel = " + this.currentFrameLabel); 

/* 
OUTPUT : 
currentScene.name = Home 
currentFrameLabel = menu 
*/ 

[EDIT]

Si je mets la visibilité à false, puis de nouveau à vrai, j'ai le même problème si je veux changer l'alpha propriété de mc_1. Cela fonctionne sur mon dossier:

import flash.display.MovieClip; 
stop(); 
trace("currentScene.name = " + this.currentScene.name); 
trace("currentFrameLabel = " + this.currentFrameLabel); 
var mc_1:MovieClip = mc_1; 
// If I don't add this line, I have the same problem when I set the visibility to true 
var mc_2:MovieClip = mask_mc; 
var mc_3:MovieClip = red_mc; 
// I do the same for mc_2 labeled "mask_mc" 
// mc_1 is now always recognized as a MovieClip as mc2. 
mc_1.visible = false; 
mc_1.visible = true; 
// No more problem if I add the line var mc_1:MovieClip = mc_1; 
// If I don't do this, I cannot access mc_1 as a MovieClip 
mc_1.alpha = 0.5; 
mc_1.mask = mc_2; 
mc_3.alpha = 0.5; 
mc_3.visible = false; 
mc_3.visible = true; 
mc_3.alpha = 0.9; 
// It seems that You have to declare the MC variables before to change the properties 

[/ EDIT]

mais je ne comprends pas votre ligne:

//btn1.GotoSession(home, "menu", "Home"); 

maison est nulle (Vous n'avez pas référence à un ClickButton nommé home) ... ???

+0

:). Merci beaucoup. Ça marche. – Rajesh

+0

Heureux pour toi @Rajesh Je n'ai jamais créé de Scène en AS3, donc je n'ai même pas encore trouvé comment en créer un, c'était le plus difficile pour moi. Mais je pense que vous pourriez améliorer votre code ... – tatactic

+0

Alors c'est ce que vous vouliez demander dans http://stackoverflow.com/questions/40603368/accessing-root-from-the-class-in-action-script- 3? C'est plus clair maintenant! +1 pour votre question – tatactic

1

Vous pouvez également créer une classe ClickSomeButton avec une méthode statique "gotoLand"

package { 
import flash.events.MouseEvent; 
import flash.display.SimpleButton; 
import flash.display.MovieClip; 

public class ClickSomeButton{ 
    public static function gotoLand(target:MovieClip,sesBut:SimpleButton,frameLabel:String,sceneName:String):void { 
      sesBut.addEventListener(MouseEvent.CLICK,gotoSes); 
      function gotoSes(event:MouseEvent):void { 
       target.gotoAndStop(frameLabel,sceneName); 
       target.removeEventListener(MouseEvent.CLICK,gotoSes); 
       target.removeChild(sesBut); 
      } 
     } 
    } 
} 

Puis dans votre fla:

var btn2:Btn2 = new Btn2(); 
addChild(btn2); 
btn2.x = 200; 
ClickSomeButton.gotoLand(this,btn2, "menu", "Home") 
stop(); 

propriétés Symbole pour BTN2 dans la bibliothèque:

library symbol properties

Ceci est juste parce que je ne sais pas pourquoi vous devez passer le bouton comme paramètre si vous appelez une méthode de cette instance ... Comme vous l'avez fait dans la question initiale:

//btn1.GotoSession(btn1, "menu", "Home"); 

C'est étrange Votre classe ClickButton ...

+0

@Rajesh C'est moins difficile AMO. – tatactic