0

我在尝试在 stage3d 中正确调整 away3d Gold 和 Starling 的大小时遇到​​问题,两者都在一个游戏中工作。

我有 4 个八哥实例和 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;
    
    
        }

它适用于八哥实例,但不适用于远 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"具有最小高度和宽度时实现的目标。

如何做到这一点?

谢谢

马泰

4

2 回答 2

3

离开3D

好吧,我发现重新调整大小的方法是更新视图。您可以居中或重新定位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 {}

八哥

经过团队实验后,我们项目中的工作如下:

目标:重新调整背景的大小,就像将 Size 设置为percentage scale to:NO_BORDER和 align to: 时一样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;

}
于 2013-03-06T08:01:34.850 回答
1

我认为您不能通过简单地在 stage3DProxy 上设置宽度/高度属性来调整 away3d 实例的大小。我通过在 view3D 上设置宽度/高度来实现这一点:

    view = new View3D();

    //...later

    private function stageResizeHandler(evt:Event):void
    {
        view.width = stage.stageWidth;
        view.height = stage.stageHeight;
    }
于 2013-03-02T08:58:01.730 回答