注意:是的,我知道以前曾提出过类似的问题。但是,在按照这些问题的答案后,我仍然卡住了,无法找到解决问题的方法。
我遇到了一个问题,需要将FlashObject添加到Flash阶段。由于我必须显示几个不同类的元素,因此我决定创建一个类作为.as文件和名为“Displayer”的addChild
函数之间的中介,如下所示:
package
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.display.Stage;
public class Displayer extends Sprite //I read somewhere that DisplayObject
//as an extension can't be used for this, so Sprite will have to do.
{
private var _stage:Stage;
function Displayer()
{
_stage = new Stage;
}
public function displayElement(displayable:DisplayObject)
{
_stage.addChild(displayable);
}
}
}
我编译它并且出现了一个我不明白的问题:错误#2012:无法实例化Stage类。显然,此代码中的某些内容要么丢失,要么不合适,但由于它非常简单,我无法看到问题所在。我确信这不是很复杂,我可能只需要局外人的观点。
答案 0 :(得分:4)
Stage对象不可全局访问。您需要通过DisplayObject实例的stage属性访问它。
参考以下文档。
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Stage.html
package
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.display.Stage;
public class Displayer extends Sprite
{
var isAddedToStage:Boolean;
public function Displayer()
{
if(stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
isAddedToStage = true;
}
public function displayElement(displayable:DisplayObject):void
{
if(isAddedToStage)
this.stage.addChild(displayable);
}
}
}
答案 1 :(得分:1)
您没有实例化Stage
类,如错误所示。就像你无法实例化DisplayObject
类一样(这就是为什么你必须扩展Sprite
)。
基本上,你有两个选择:
1)您从DisplayObjectContainer
实例添加孩子。
var displayerInstance:Displayer = new Displayer();
this.addChild( displayerInstance );
您可以从已添加到全局阶段的DisplayObjectContainer对象运行此对象。每个项目中只有一个阶段,即使您嵌入了SWF,SWF的阶段属性实际上是顶级应用程序的阶段属性。因此,如果您将此Displayer
实例嵌套在嵌套在主应用程序中创建的另一个类中的类中,则必须在每个类中运行“addChild”以获取Displayer
显示。
2)你作弊。建议不要这样做,完全。基本上,在实例化Displayer
类时传入对象的stage对象。
var displayerInstance:Displayer = new Displayer( this.stage );
public function Displayer( stage:Stage ) {
this.stage = stage;
if ( this.stage ) {
this.stage.addChild( this );
}
}
这是一个很好的方法,可以将Singletons添加到舞台上(除了没有Singleton的构造函数)。我在圣诞节之前创建了一个分析器,它是一个Singleton(后来发现了Scout,该死的),它使用这种方法在适当的时候将东西添加到舞台上。
同样,不建议在这种情况下使用第二个选项,但这是可能的。
顺便说一句,你应该从不直接向Stage
添加内容,除非有明确的理由(例如弹出窗口)。您应该遵循显示列表方法,其中DisplayObjectContainer将另一个DisplayObject或DisplayObject容器添加为子项,依此类推,以便它们都连接到TopLevelApplication。
答案 2 :(得分:0)
好吧,我认为实例化一个阶段类是不行的,因为as3文档说:“Stage对象不是全局可访问的。你需要通过DisplayObject实例的stage属性访问它。”
您应该将Stage对象的引用传递给您的Displayer类,并且您可以通过显示对象实例获得对舞台对象的引用,如文档所述。
所以构造函数现在看起来像:
function Displayer( stage:Stage )
{
_stage = stage;
}
假设实例化您的显示器的对象是舞台的孩子,您可以通过
实例化显示器displayer = new Displayer( stage );
如果使用这种方法,则无需使用Displayer类扩展任何内容或将其添加到舞台中(这在bitmapdata.com的方法中是必需的。)
答案 3 :(得分:0)
总有一个简单的解决方案。如果您需要将一个子元素添加到您的类的舞台中,您可以将舞台作为对象传递到您的类中并将子元素添加到其中,我这样做是为了添加一个像这样进入我的舞台。
package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.display.Bitmap;
public class ImageLoader extends Sprite{
private var stageObj:Object; //create local variable to refarance stage
public function loadeimage(StageObject:Object, Url:String){ //StageObject will bring the stage refarance into the class
var reQuest:URLRequest = new URLRequest(Url);
loader.load(reQuest);
stageObj=StageObject; //make local refarance for stage inside the class
var image:Bitmap;
image=Bitmap(loader.content);
image.x = 100;
image.y = 100;
stageObj.addChild(image); // add whatever object into stage refarance and this means the real stage..
}
}
}
只有带注释的内容很重要,你可以将这个文件保存为ImageLoader.as并导入它并像这样使用它。
import ImageLoader;
var IL:ImageLoader = new ImageLoader();
IL.loadeimage(this,"img.jpg");
就这么简单。我想这就是你要寻找的......祝你好运。 (你可以通过任何容器或parant容器这个或这个阶段。它不会影响你的孩子。