[英]away3d and starling resizing issue
我在尝试在stage3d中正确调整away3d Gold和Starling的大小时都遇到问题,它们都在单个游戏中工作。
我有4个starling实例和1个由stage3dProxys处理的Away3d实例。
所有这些都可以完美地完成初始大小。 在浏览器中调整游戏大小时,问题开始。
游戏.swf最终将由另一个父级.swf加载,但是当将游戏直接加载到它自己的HTML模板上时,会发生相同的情况。
我现在拥有的是:
stage.addEventListener( Event.RESIZE, onResize, false, 0, true );
private function onResize(event:Event):void {
_stage3DProxy.width = stage.stageWidth;
_stage3DProxy.height = stage.stageHeight;
}
它适用于Starling实例,但不适用于3D实例。 并且它不显示应该在舞台之外的剪切图像。
我也尝试不成功:
starling.stage.stageWidth = this.stage.stageWidth;
starling.stage.stageHeight = this.stage.stageHeight;
var viewPort:Rectangle = RectangleUtil.fit(
new Rectangle(0, 0, stage.stageWidth, stage.stageHeight),
new Rectangle(0, 0, stage.fullScreenWidth, stage.fullScreenHeight),
ScaleMode.NO_BORDER);
Starling.current.viewPort = viewPort;
我要实现的是在将Size设置为“百分比”时将缩放比例设置为"NO_BORDER"
,将align设置为"Top Center"
并具有最小的高度和宽度时在传统Flash中所实现的效果。
如何实现呢?
谢谢
马捷
好吧,我发现调整大小的方法是更新视图。 您可以将居中或重新放置,或者将flash.display.Sprite
容器定位在添加了Away场景的位置,也可以自行查看。
想法很棘手,因为您必须找出该视图的scaleX
和scaleY
的方法是“ DEAD END ”,这意味着它们是空的方法,永远不会发生任何变化。 因此,您确实必须 &只能更改width
& height
属性。
这里列出了View3D
的所有DEAD END方法,就像它们在源代码中一样:
// dead ends:
override public function set z(value : Number) : void {}
override public function set scaleZ(value : Number) : void {}
override public function set rotation(value : Number) : void {}
override public function set rotationX(value : Number) : void {}
override public function set rotationY(value : Number) : void {}
override public function set rotationZ(value : Number) : void {}
override public function set transform(value : Transform) : void {}
override public function set scaleX(value : Number) : void {}
override public function set scaleY(value : Number) : void {}
经过团队的试验,在我们的项目中起作用的内容如下:
目标 :调整背景大小,就像将“大小”设置为将percentage
设置为: NO_BORDER
并将“对齐”设置为: Top Center
。
//Necessary variables
public var backgroundContainerStage:Starling;
public var anyOtherContainerStage:Starling;
public var stage3dProxy:Stage3DProxy;
public var scaleRatio:Number;
public var originalHeight:Number = 900;
// ... {HACK} ... {HACK}
// Add your Listeners in the constructor for Event.AddedToStage
// and set the handler to init... Or any other method you prefer to add the
// listener on the `Event.RESIZE`.
//
// Also populate the stage3DProxy how ever you wish.
// We did it this way:
//_stage3DProxy = Stage3DManager.getInstance(stage).getFreeStage3DProxy();
//
// ... {HACK} ... {HACK}
public function init(event:Event=null):void{
stage.addEventListener( Event.RESIZE, onResize, false, 0, true );
}
// The IMPORTANT PART !!!!!!!!
public function onResize():void {
scaleRatio = stage.stageHeight/originalHeight;
backgroundContainerStage.stage.stageWidth =
anyOtherContainerStage.stage.stageWidth =
stage3dProxy.width = stage.stageWidth;
// Need to get the Starling Sprite cause the the Starling instances don't allow to
// set values for their `x` and `y` properties.
var background: Sprite = backgroundContainerStage.getChildByName('background') as Sprite;
var uiContainer: Sprite = anyOtherContainerStage.getChildByName('uiContainer') as Sprite;
//First, RE-SIZE
background.scaleX = background.scaleY =
uiContainer.scaleX = uiContainer.scaleY = scaleRatio;
//Then, RE-POSITION top-Center
background.x =
uiContainer.x = stage.stageWidth - background.width >>1;
}
我认为您不能通过简单地在stage3DProxy上设置width / height属性来调整away3d实例的大小。 我通过在view3D上设置宽度/高度来实现这一点:
view = new View3D();
//...later
private function stageResizeHandler(evt:Event):void
{
view.width = stage.stageWidth;
view.height = stage.stageHeight;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.