News:关于Starling的入口类
在使用Starling的时候,很多开发者不是很适应入口类的做法:
public function Starling(rootClass:Class, stage:flash.display.Stage, viewPort:Rectangle=null, stage3D:Stage3D=null, renderMode:String="auto")
这样您需要创建一个入口类(比如命名为Game,继承starling的显示对象)。这样开发者可能会有一些疑问:
- 在其它模块中,如何得到入口类实例的引用?
- 如果我想自己初始化入口类实例(为了设置一些属性),应该如何做?
当前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的缩放处理机制。