Kat*_*ore 0 flash actionscript-3
问题很简单:从子类访问舞台对象(如Movie Clip或文本字段).当我定义一个子类并尝试访问阶段对象时,问题出现了.我怎样才能做到这一点?想象一下,我在舞台上有一个名为redBox_mc的影片剪辑.我希望在我加载xml之后将其更改为alpha.(或子类中的任何其他操作)
主要课程:
package src{
// ..
public class code01 extends MovieClip {
public var rt:xmlReader = new xmlReader("art.xml"); // my subclass
public function code01():void {
// .. my code
}
}
}
Run Code Online (Sandbox Code Playgroud)
xmlReader子类:
package src{
// ..
public class xmlReader extends MovieClip {
// ..
public function xmlReader(xmlFilename:String)
// .. my code
stage.redBox_mc.alpha = .2 ; // doesn’t work
MovieClip(parent).redBox_mc.alpha = .2 ; // doesn’t work
}
}
}
Run Code Online (Sandbox Code Playgroud)
请帮我 ..
Tau*_*ayi 10
有许多方法可以使子对象的类可以访问该阶段:
选项1
最简单的方法是将舞台的引用解析为子对象的类:
Main.as(文档类):
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
var foo:Foo = new Foo(stage);
}// end function
}// end class
}// end package
Run Code Online (Sandbox Code Playgroud)
Foo.as:
package
{
import flash.display.Stage;
public class Foo
{
public function Foo(stage:Stage)
{
if(stage) trace("success"); // output: success
}// end function
}// end class
}// end package
Run Code Online (Sandbox Code Playgroud)
方案2
另一个选项是将显示对象添加到显示列表中.通过这样做,您的显示对象的类将具有对该阶段的引用.然后,您必须在显示对象的类中添加一个事件侦听器,该类侦听要添加到舞台的显示对象.只有当事件监听器收到此事件时,您才会引用该阶段:
Main.as(文档类):
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
var foo:Foo = new Foo();
addChild(foo);
}// end function
}// end class
}// end package
Run Code Online (Sandbox Code Playgroud)
Foo.as:
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Foo extends Sprite
{
public function Foo()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
if(stage) trace("success"); // output: success
}// end function
}// end class
}// end package
Run Code Online (Sandbox Code Playgroud)
方案3
另一种选择是将对阶段的引用存储在可以全局访问的类中.要执行此操作,您可以使用静态公共属性或方法来直接设置和获取阶段对类的引用:
Main.as(文档类):
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
GlobalVars.stage = stage;
var foo:Foo = new Foo();
}// end function
}// end class
}// end package
Run Code Online (Sandbox Code Playgroud)
GlobalVar.as:
package
{
import flash.display.Stage;
public class GlobalVars
{
public static var stage:Stage;
}// end class
}// end package
Run Code Online (Sandbox Code Playgroud)
Foo.as
package
{
import flash.display.Stage;
public class Foo
{
public function Foo()
{
var stage:Stage = GlobalVars.stage;
if(stage) trace("success"); // output: success
}// end function
}// end class
}// end package
Run Code Online (Sandbox Code Playgroud)
[UPDATE]
看看你的代码,我无法弄清楚为什么你的xmlReader
课程DisplayObject
首先扩展 .xmlReader
貌似处理所有xml相关的逻辑,如加载和解释xml,那么为什么不把它留在那?让另一个类处理舞台上的对象.我认为你的问题的真正解决方案是更好的代码结构,以下是一个例子:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
public class Main extends Sprite
{
public function Main()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
public function init(e:Event = null):void
{
var textField:TextField = new TextField();
textField.name = "textField";
stage.addChild(textField);
var stageManager:StageManager = new StageManager(stage, "dummy.xml");
}// end function
}// end class
}// end package
import flash.display.Stage;
import flash.events.Event;
import flash.text.TextField;
class StageManager
{
private var _stage:Stage;
private var _xmlReader:XMLReader;
public function StageManager(stage:Stage, url:String)
{
_stage = stage;
_xmlReader = new XMLReader(url);
_xmlReader.addEventListener(Event.COMPLETE, onXMLReaderComplete);
}// end function
private function onXMLReaderComplete(e:Event):void
{
var textField:TextField = _stage.getChildByName("textField") as TextField;
textField.text = "XML LOADED!";
}// end function
}// end class
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.IOErrorEvent;
import flash.errors.IOError;
class XMLReader extends EventDispatcher
{
public var xml:XML;
public function XMLReader(url:String)
{
read(url);
}// end function
public function read(url:String)
{
var urlLoader:URLLoader = new URLLoader(new URLRequest(url));
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onURLLoaderIOError);
urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete);
}// end function
private function onURLLoaderIOError(e:IOErrorEvent):void
{
throw new IOError(e.text);
}// end function
private function onURLLoaderComplete(e:Event):void
{
xml = URLLoader(e.target).data as XML;
dispatchEvent(new Event(Event.COMPLETE));
}// end function
}// end class
Run Code Online (Sandbox Code Playgroud)