如何在不是我的主类而不是displayobject的类中访问Actionscript 3中的舞台?如何访问不是DisplayObject的类中的舞台?
回答
真棒谢谢..使用单例是我想要的方式:) – Chris 2010-01-28 09:30:56
最简单的办法,你可以把它在static var
例如:
public class MyMain extends Sprite {
public static var STAGE:Stage;
public function MyMain() {
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
}
}
private function init(e:Event=null):void{
removeEventListener(Event.ADDED_TO_STAGE, init);
// store stage reference when stage ready
STAGE=stage;
}
}
,并在其他类进口类持有该静止无功,当然变种已在访问之前被初始化它。
import MyMain;
public class Other {
public function useStage():void {
MyMain.STAGE...
}
}
真正的问题是缺乏从静态上下文访问舞台的一致方法。编译成可重用SWC项目的数百个静态类可能希望从静态上下文访问该阶段,避免在每个类上调用某个“init”方法的唯一方法是指定一个特定的静态变量,它们都可以一致地访问。这将创建一个单一的初始化点,但它仍然会涉及记住从文档类中调用该“init”方法。这是Adobe通过不提供静态阶段访问而让所有人都处于状态的位置。 – Triynko 2012-11-20 18:43:27
你可以使用accessor和mutator类来设置和检索舞台实例吗?
Adobe未能提供对舞台的静态访问权限,使您无法选择,只能自行实施。
这是一个史诗般的失败,因为在您的主文档类实例构造函数运行以隐藏某个任意静态变量中的舞台实例之前,无法访问舞台。
由于每次要静态访问舞台时都必须初始化该任意静态变量,因此最好确保您只需执行一次。
为了确保您只需要初始化一次,您必须确保您曾经写过的每一个静态方法都指向该变量,并且在初始化之前不会尝试访问它。
鉴于所有这些......最合乎逻辑的步骤是: 1.使用Adobe NOW提交功能请求。 2.创建一个“全局”或“文档”基类,为您初始化一个静态阶段变量,并让所有文档类继承它。继承MovieClip为您提供了最大的灵活性:
package
{
import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.Event;
public class Document extends MovieClip
{
public static var _stage:Stage = null;
public static function get sstage():Stage //added an extra s for "static" to differentiate the static property name from the instance property name "stage"; call it what you want
{
return _stage;
}
public function Document()
{
super();
if (stage != null)
initStage(null); //explicitly pass null to indicate no listener was attached
else
addEventListener(Event.ADDED_TO_STAGE, initStage, false, 0, true); //prefer weak references
}
private function initStage(e:Event):void
{
_stage = stage;
if (e != null) //event listener will be non-null iff listener was added
removeEventListener(Event.ADDED_TO_STAGE, initStage, false);
}
}
}
你不会写这个类不止一次,只要你的所有文件类扩展上述定义的“文档”类(和所谓的“超级”的构造函数)。通过这样做,您的文档的构造函数代码和您此后项目的其余部分将通过“Document.sstage”具有对舞台的静态访问权限。在主文档类中发生此初始化之前,没有办法让静态上下文访问该阶段。
我建议你很早就采用这种一致性,因为如果Adobe增加了对Stage的静态访问,它将更容易修复。这只不过是用Adobe提供的任何东西来代替“Document.sstage”。
- 1. 访问舞台上的按钮类
- 2. 如何从Adobe Flash中的AS3类访问舞台
- 3. 在AS3中访问舞台
- 4. 如何从文档类访问舞台上的MovieClip?
- 5. 访问Flash CS4 IDE中的舞台
- 6. 如何访问一个显示对象在舞台上的一类,是不是一个文档类
- 7. 自定义类中的访问舞台对象(文本框)
- 8. 访问已在文档类中舞台上的MovieClip实例?
- 9. AS3:确定DisplayObject何时从舞台上移除?
- 10. AS3访问类舞台上的动态文本字段
- 11. 如何从文档类访问舞台上的动态文本字段
- 12. 从任意位置访问舞台
- 13. AS3舞台上无法访问MC
- 14. 从控制器内访问舞台
- 15. 使用舞台实例而不是调用“舞台”的原因是什么?
- 16. AS3无法从自定义类访问舞台
- 17. 访问主类舞台事件监听器
- 18. 如何将新舞台添加到我的默认舞台?
- 19. 如何在javafx2中将舞台与舞台绑定
- 20. 与不上的舞台
- 21. 从舞台的时间线访问对文档类的实例引用
- 22. 如何在Actionscript3的类中移动舞台?
- 23. 如何以编程方式访问DisplayObject的所有子项?
- 24. 如何模糊舞台
- 25. 如何访问已添加到Adobe Flash Pro(CS5)舞台上的图形
- 26. 如何从SWF嵌入式的Flex编译器访问舞台实例名称?
- 27. gtk中的杂乱舞台不能处理舞台鼠标按下事件
- 28. 如何清理我的舞台?
- 29. 如何引用舞台上的物体?
- 30. 无法在控制台的主类中使用舞台
为什么不把它传递给构造函数? – 2011-04-06 04:21:11
因为将它传递给构造函数是屁股疼痛。静态类不会有构造函数,添加一个静态的“init”方法会破坏静态类的目的,因为你必须记住在任何可能使用这样的类的项目中初始化它。这个阶段总是存在,并且它是一个史诗般的失败,它不能从AS3的静态上下文中访问,也没有在某些任意静态变量中手动存储。 – Triynko 2012-11-20 18:27:45