Away3D и Starling проблема с изменением размера

У меня возникли проблемы с попыткой корректно изменить размер как «Away3d Gold», так и «Starling» в stage3d, которые работают в одной игре.

У меня есть 4 экземпляра Starling и 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, когда устанавливаете размер в «процентах», масштабируете на: "NO_BORDER" и выравниваете на: "Top Center" с минимальной высотой и шириной.

Как этого добиться?

Спасибо

Матей


person ThanksBro    schedule 01.03.2013    source источник


Ответы (2)


В гостях3D

Ну, я понял, что способ изменить размер — это обновить представление. И то, что вы можете центрировать или перемещать, либо позиционируя контейнер flash.display.Sprite, куда была добавлена ​​сцена «В гостях», либо сам вид.

Это сложная мысль, потому что вам нужно выяснить, что методы представления для scaleX и scaleY являются «DEAD END», что означает, что они являются пустыми методами, которые не вносят никаких изменений. Таким образом, вы действительно ДОЛЖНЫ изменять только свойства width и height.

здесь весь список всех методов DEAD END для theView3D в том виде, в котором они появляются в исходном коде:

// 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;

}
person GV3    schedule 06.03.2013

Я не думаю, что вы можете изменить размер экземпляра away3d, просто установив свойства ширины/высоты в stage3DProxy. Я реализовал это, установив ширину/высоту в view3D:

    view = new View3D();

    //...later

    private function stageResizeHandler(evt:Event):void
    {
        view.width = stage.stageWidth;
        view.height = stage.stageHeight;
    }
person jordancpaul    schedule 02.03.2013
comment
Спасибо, немного помогло - person ThanksBro; 06.03.2013