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