2016-11-17 4 views
1

В основном я кодирую для переключения между сценами, нажимая кнопки. Я даю имена сцен с песком в виде фреймов. MovieClip (root) .gotoAndStop (frameLabel, sceneName); отлично работает на сцене. Но когда я использую то же самое в классе, он выдает предупреждение TypeError: Ошибка # 1009: Невозможно получить доступ к свойству или методу ссылки на нулевой объект. Я знаю, что это происходит, поскольку для класса нет корня. Есть ли способ его исправить. Пожалуйста, найдите код ниже.Ссылающийся этап из класса Action Script 3

// код класса

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

// AS3 код

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

ответ

1

У вас есть две проблемы здесь, и я не понимаю, почему Вы так работать, но,

1: Когда я пытаюсь скомпилировать ваш код, я получаю компиляцию. Ошибка:

Там пропустите «}» в конце Y наш класс.

я снял то, что не используется:

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! 
      } 
     } 
    } 
} 

Я полагаю, что у вас есть кнопка в вашей библиотеке, связанный с ClickButton класса, как здесь ниже:

enter image description here

Итак:

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

Если я нажму на btn1, это приведет меня к t он сцене «Домой» на ярлыке «меню».

Это работает как шарм.

на «меню» FrameLabel:

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

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

[EDIT]

Если я установил видимость ложной, то снова правда, у меня такая же проблема, если я хочу, чтобы изменить альфа свойство mc_1. Это работает на моем файле:

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]

, но я не понимаю, Ваша линия:

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

дом нуль (У вас нет никаких ссылок на ClickButton с именем home) ... ???

+0

:). Большое спасибо. Оно работает. – Rajesh

+0

Happy for You @Rajesh Я никогда не создавал сцену в AS3, поэтому я даже не стал создавать один, что было для меня самым трудным. Но я думаю, что вы могли бы улучшить свой код ... – tatactic

+0

Так вот что вы хотели спросить в http://stackoverflow.com/questions/40603368/accessing-root-from-the-class-in-action-script- 3? Теперь это становится яснее! +1 для вашего вопроса так. – tatactic

1

Вы также можете создать ClickSomeButton класса со статическим методом "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); 
      } 
     } 
    } 
} 

Затем в FLA:

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

Символ свойства для Btn2 в библиотеке:

library symbol properties

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

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

Это странно Ваш класс ClickButton ...

+0

@Rajesh Это менее сложный AMO. – tatactic

 Смежные вопросы

  • Нет связанных вопросов^_^