News:关于Starling的入口类

来自Starling中文站
跳转到: 导航, 搜索

在使用Starling的时候,很多开发者不是很适应入口类的做法:

public function Starling(rootClass:Class, stage:flash.display.Stage, 
                                 viewPort:Rectangle=null, stage3D:Stage3D=null,
                                 renderMode:String="auto")

这样您需要创建一个入口类(比如命名为Game,继承starling的显示对象)。这样开发者可能会有一些疑问:

  1. 在其它模块中,如何得到入口类实例的引用?
  2. 如果我想自己初始化入口类实例(为了设置一些属性),应该如何做?

当前Starling确实在这个地方做的不够完善,作者之所以采用这种模式,估计主要是因为Starling的显示对象命名和传统Flash显示对象的命名完全一致,很容易引起包引入的混乱,所以用这种策略来规避。

那么能实现上面的那两个问题吗?是可以的:

Starling会自动创建入口类的实例,参见这个方法:

private function initializeRoot():void
        {
            if (mStage.numChildren > 0) return;
 
            var rootObject:DisplayObject = new mRootClass();
            if (rootObject == null) throw new Error("Invalid root class: " + mRootClass);
            mStage.addChildAt(rootObject, 0);
        }

就是说,这个对象会放在Starling的stage的索引为0的位置上。通过Starling.current.stage.getChildAt(0) as Game这样的方式就可以获得引用。当然这样的前提是,您没有自己添加其他的显示对象到stage的0索引的位置。或许一个更保险的方式是,如果Game只有一个实例,那么您可以为Game类设置一个静态变量:instance,然后在Game的构造方法中,设置instance=this即可。在外部可以用Game.instance来获取引用。

目前由于Starling自己创建这个实例,所以不能给这个入口类的构造方法加参数。您只能通过上面的方法,获取到引用后,再赋值即可。

如果您仍然感到不爽,大可以修改Starling源码,修改为可接受实例或工厂类的方式。但这样就不得不处理后续Starling官方升级和您自己版本的合并问题。


package
{
	import flash.display.Sprite;
 
	import starling.core.Starling;
 
	public class TS_Starling extends Sprite
	{
		private var _starling:Starling;
 
		public function TS_Starling()
		{
			_starling = new Starling(Game, stage);
			_starling.start();
			_starling.addEventListener("rootCreated",rootCreatedHandler);
		}
 
		private function rootCreatedHandler(...args):void
		{
			var gameInstance:Game;
			gameInstance = Starling.current.stage.getChildAt(0) as Game;
			trace(gameInstance);//output [object Game]
		}
	}
}

Starling显示对象的缩放关系

在Starling中,Starling.stage.stageWidth,Starling.stage.stageHeight,Starling.viewPort都可能引起缩放。如果3者完全保持一致,就不会缩放

首先看stageWidth。Starling的stage允许设置stageWidth和stageHeight,一旦你设置了,Starling就会判断真实的Stage层的宽度和高度,和你设置的值之间的比例关系。

假设你放置了一张400*300像素的图在场景上,同时设置Starling.stage.stageWidth,Starling.stage.stageHeight分别为400和300,而实际运行起来的Flash的Stage的宽高分别是800*600,那会发生什么?你的图片会被放大一倍。

而这时,如果你又设置了viewPort = [200,150,400,300];会发生什么?Starling会将这个区域作为可视区域,只有这个区域内的内容才能可见。而这时由于实际场景的宽度和高度比可视区域大,Starling为了保证内容可见,会把可视内容,再次缩放到可视区域的范围。也就是我们的图片,又被缩放到400*300了(正好是原始大小),并且被挪到屏幕中央。


希望您看到这些说明能了解Starling的缩放处理机制。

个人工具
名字空间

变换
操作
导航
Starling中文资料
Starling原创教程
论坛
友链
工具箱