Почему stage.fullScreenWidth возвращает значения iPhone на моем iPad?

#ios #ipad #flash #retina-display #starling-framework

#iOS #iPad #flash #retina-дисплей #starling-framework

Вопрос:

У меня возникли небольшие проблемы с запуском моей игры в нужном разрешении на iPad Air.

Я использую FlashDevelop и шаблон scaffold_mobile. Проблема в том, что

stage.fullScreenWidth и stage.fullScreenHeight возвращаются 960×640. Это значения retina iPhone! Я понимаю, что они должны возвращать 2048×1536 на моем iPad retina.

Из-за этого раздражающие маленькие кружочки масштаба «1x» и «2x» отображаются в правом нижнем углу моего приложения на iPad, и все намного меньше, чем должно быть.

Есть какие-нибудь советы по этому поводу? Я пытался возиться со [SWF( width="...", height="..."] значениями, но, похоже, это не возымело никакого эффекта.

Заранее спасибо!

Для полноты картины, вот весь мой Main.as класс, который взят практически прямо из scaffold_mobile:

 package
{

import flash.desktop.NativeApplication;
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import flash.filesystem.File;
import flash.geom.Rectangle;
import flash.system.Capabilities;
import starling.core.Starling;
import starling.events.Event;
import starling.textures.Texture;
import starling.utils.AssetManager;
import starling.utils.RectangleUtil;
import starling.utils.ScaleMode;
import starling.utils.formatString;

[SWF( width="1024", height="768", frameRate="60" )]
public class Main extends Sprite
{
    // We embed the "Ubuntu" font. Beware: the 'embedAsCFF'-part IS REQUIRED!!!
    //[Embed(source="/fonts/Ubuntu-R.ttf", embedAsCFF="false", fontFamily="Ubuntu")]
    //private static const UbuntuRegular:Class;

    // Startup image for SD screens
    [Embed(source="/../assets/2048/smallBGs/backgroundSmall.png")]
    private static var Background:Class;

    // Startup image for HD screens
    [Embed(source="/../assets/2048/bigItems/background.png")]
    private static var BackgroundHD:Class;

    private var mStarling:Starling;

    public function Main()
    {
        // set general properties

        var stageWidth:int   = 980;// Constants.STAGE_WIDTH;
        var stageHeight:int  = 566; // Constants.STAGE_HEIGHT;
        var iOS:Boolean = Capabilities.manufacturer.indexOf("iOS") != -1;

        Starling.multitouchEnabled = true;  // useful on mobile devices
        Starling.handleLostContext = !iOS;  // not necessary on iOS. Saves a lot of memory!

        // create a suitable viewport for the screen size
        //
        // we develop the game in a *fixed* coordinate system of 320x480; the game might
        // then run on a device with a different resolution; for that case, we zoom the
        // viewPort to the optimal size for any display and load the optimal textures.

        var fullScreen:Rectangle = new Rectangle(0, 0, stage.fullScreenWidth, stage.fullScreenHeight);
        trace("FULLSCREEN: "   fullScreen );

        var viewPort:Rectangle = RectangleUtil.fit(
            new Rectangle(0, 0, stageWidth, stageHeight),
            fullScreen,
            ScaleMode.SHOW_ALL);

        trace("VIEWPORT: "   viewPort );    

        // create the AssetManager, which handles all required assets for this resolution

        var scaleFactor:int = viewPort.width < 480 ? 1 : Config.SD_SCALE; // midway between 320 and 640
        var appDir:File = File.applicationDirectory;
        var assets:AssetManager = AssetLoader.ASSETS; //new AssetManager(scaleFactor);

        assets.verbose = Capabilities.isDebugger;

        // While Stage3D is initializing, the screen will be blank. To avoid any flickering,
        // we display a startup image now and remove it below, when Starling is ready to go.
        // This is especially useful on iOS, where "Default.png" (or a variant) is displayed
        // during Startup. You can create an absolute seamless startup that way.
        //
        // These are the only embedded graphics in this app. We can't load them from disk,
        // because that can only be done asynchronously (resulting in a short flicker).
        //
        // Note that we cannot embed "Default.png" (or its siblings), because any embedded
        // files will vanish from the application package, and those are picked up by the OS!

        var backgroundClass:Class = scaleFactor == 1 ? Background : BackgroundHD;
        var background:Bitmap = new backgroundClass();
        Background = BackgroundHD = null; // no longer needed!

        background.x = viewPort.x;
        background.y = viewPort.y;
        background.width  = viewPort.width;
        background.height = viewPort.height;
        background.smoothing = true;
        addChild(background);

        // launch Starling

        mStarling = new Starling(Game, stage, viewPort);
        mStarling.stage.stageWidth  = stageWidth;  // <- same size on all devices!
        mStarling.stage.stageHeight = stageHeight; // <- same size on all devices!
        mStarling.simulateMultitouch  = false;
        mStarling.enableErrorChecking = Capabilities.isDebugger;

        mStarling.addEventListener(starling.events.Event.ROOT_CREATED,
            function(event:Object, app:Game):void
            {
                mStarling.removeEventListener(starling.events.Event.ROOT_CREATED, arguments.callee);
                removeChild(background);
                background = null;

                var bgTexture:Texture = Texture.fromEmbeddedAsset(
                    backgroundClass, false, false, scaleFactor);

                app.start( bgTexture, assets );
                mStarling.start();
            });

        // When the game becomes inactive, we pause Starling; otherwise, the enter frame event
        // would report a very long 'passedTime' when the app is reactivated. 

        NativeApplication.nativeApplication.addEventListener(
            flash.events.Event.ACTIVATE, function (e:*):void { mStarling.start(); });

        NativeApplication.nativeApplication.addEventListener(
            flash.events.Event.DEACTIVATE, function (e:*):void { mStarling.stop(true); });
    }
}
}
  

Ответ №1:

Нашел ответ здесь:

http://www.flashdevelop.org/community/viewtopic.php?f=13amp;t=10092

Вы должны раскомментировать <string>2</string> строку в разделе iPhone на application.xml . Должна быть строка 29 (или около того).

Ответ №2:

В Starling stageWidth — это окно просмотра, а не ширина устройства

Чтобы получить реальное устройство с помощью:

  import flash.system.Capabilities;

 var stageWidth:int = Capabilities.screenResolutionX;
 var stageHeight:int = Capabilities.screenResolutionY;