我有以下两个类:
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var test:NewClass = new NewClass();
}
}
}
和
package
{
import flash.display.Sprite;
public class NewClass extends Sprite
{
public function NewClass()
{
trace(stage.width);
}
}
}
我收到以下错误:
TypeError:错误#1009:无法访问空对象引用的属性或方法。 在NewClass()[C:\ Documents and Settings \ Roma \ poo \ src \ NewClass.as:10] 在Main / init()[C:\ Documents and Settings \ Roma \ poo \ src \ Main.as:23] 在Main()[C:\ Documents and Settings \ Roma \ poo \ src \ Main.as:15]
为什么???
答案 0 :(得分:8)
是的,一个flash开发用户......:D
嗯,原因是:舞台仅对显示列表中的对象可用 ...
按如下方式修改您的课程:
package {
import flash.display.Sprite;
import flash.events.Event;
public class NewClass extends Sprite {
public function NewClass():void {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
trace(stage.width);//you may want to use stage.stageWidth actually
}
}
}
和Main :: init如下:
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
var test:NewClass = new NewClass();
this.addChild(test);
}
哦,您可以在Coding Style Type
中将BraceAfterLine
从BraceOnLine
更改为Tools > Program Settings > FlashDevelop > Indenting
,以防您有意......;)
修改强>
如果你想访问舞台,在DisplayObject
的范围内,你需要确定,舞台是可用的...如果你想尽快访问舞台,那么你需要提供的技巧...但是如果你在点击处理程序中访问舞台,例如,这自动意味着DisplayObject
在显示列表中......否则无法点击...
格尔茨
back2dos
答案 1 :(得分:0)
正如back2dos所说,只有显示列表中的元素才有对该阶段的有效引用。由于NewClass
的实例仅仅是init
实例的Main
方法中的临时变量,您还没有addChild
将其放在显示列表中的值它的stage
属性为null。注意:只有在显示列表中的父母的子女才能获得对舞台的有效参考。
如果您需要对类中不会添加到显示列表中的舞台的引用,则需要将舞台传递给该类的实例。与AS2不同,该阶段没有全局可访问的引用(即_root
和_level0
已弃用)