Вне и проблема изменения размера скворца
У меня проблемы с попыткой правильно изменить размеры обоих away3d Gold и Starling на stage3d, которые работают в одной игре.
У меня есть 4 скворечника и 1 экземпляр Away3d, обработанный stage3dProxys.
Это все работа ОТЛИЧНО от первоначального размера. Проблемы начинаются при изменении размера игры в браузере.
Игра.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;
}
Он работает для скворечников, но не для 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;
То, чего я хочу добиться, - это то, чего вы добиваетесь в традиционной Flash, когда устанавливаете для параметра Size значение "в процентах":"NO_BORDER"
и выровнять по: "Top Center"
с минимальной высотой и шириной.
Как этого добиться?
Спасибо
Матей
2 ответа
Away3D
Ну, я понял, что способ изменить размер был обновить представление. И то, что вы можете центрировать или переместить либо позиционирование flash.display.Sprite
контейнер, в который была добавлена сцена Away или просмотр самого себя.
Это сложная мысль, потому что вы должны выяснить, что методы представления для scaleX
& scaleY
являются 'DEAD END', что означает, что они являются пустыми методами, которые не меняют то, что когда-либо. Так что вы действительно ДОЛЖНЫ и можете изменить только width
& height
свойства.
здесь список всех методов DEAD END View3D
так же, как они появляются в исходном коде:
// 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;
}
Я не думаю, что вы можете изменить размер экземпляра away3d, просто установив свойства width/height в stage3DProxy. Я реализовал это, установив ширину / высоту в view3D:
view = new View3D();
//...later
private function stageResizeHandler(evt:Event):void
{
view.width = stage.stageWidth;
view.height = stage.stageHeight;
}