/** * Copyright 2008 - 2015 The Loon Game Engine Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * @project loon * @author cping * @email:javachenpeng@yahoo.com * @version 0.5 */ package loon.robovm; import loon.LGame; import loon.LSetting; import loon.LazyLoading; import loon.Platform; import loon.event.KeyMake; import loon.event.SysInput; import loon.robovm.RoboVMGame.IOSSetting; import org.robovm.apple.coregraphics.CGRect; import org.robovm.apple.foundation.NSThread; import org.robovm.apple.uikit.UIAlertView; import org.robovm.apple.uikit.UIAlertViewDelegateAdapter; import org.robovm.apple.uikit.UIAlertViewStyle; import org.robovm.apple.uikit.UIApplication; import org.robovm.apple.uikit.UIApplicationDelegateAdapter; import org.robovm.apple.uikit.UIApplicationLaunchOptions; import org.robovm.apple.uikit.UIDevice; import org.robovm.apple.uikit.UIInterfaceOrientation; import org.robovm.apple.uikit.UIKeyboardType; import org.robovm.apple.uikit.UIReturnKeyType; import org.robovm.apple.uikit.UIScreen; import org.robovm.apple.uikit.UITextAutocapitalizationType; import org.robovm.apple.uikit.UITextAutocorrectionType; import org.robovm.apple.uikit.UITextField; import org.robovm.apple.uikit.UIUserInterfaceIdiom; import org.robovm.apple.uikit.UIViewController; import org.robovm.apple.uikit.UIWindow; @SuppressWarnings("deprecation") public abstract class Loon extends UIApplicationDelegateAdapter implements Platform, LazyLoading { private RoboVMGame game = null; private LSetting setting; private LazyLoading.Data mainData; private float displayScaleFactor; private UIWindow uiWindow; private UIApplication uiApp; @Override public boolean didFinishLaunching(UIApplication app, UIApplicationLaunchOptions launchOpts) { CGRect bounds = UIScreen.getMainScreen().getBounds(); uiApp = app; uiWindow = new UIWindow(bounds); onMain(); if (setting instanceof RoboVMGame.IOSSetting) { IOSSetting config = (IOSSetting) setting; float scale = (float) (getIosVersion() >= 8 ? UIScreen .getMainScreen().getNativeScale() : UIScreen .getMainScreen().getScale()); if (scale >= 2.0f) { if (UIDevice.getCurrentDevice().getUserInterfaceIdiom() == UIUserInterfaceIdiom.Pad) { displayScaleFactor = config.displayScaleLargeScreenIfRetina * scale; } else { displayScaleFactor = config.displayScaleSmallScreenIfRetina * scale; } } else { if (UIDevice.getCurrentDevice().getUserInterfaceIdiom() == UIUserInterfaceIdiom.Pad) { displayScaleFactor = config.displayScaleLargeScreenIfNonRetina; } else { displayScaleFactor = config.displayScaleSmallScreenIfNonRetina; } } RoboVMViewController ctrl = new RoboVMViewController(this, uiWindow.getBounds(), (RoboVMGame.IOSSetting) setting); uiWindow.setRootViewController(ctrl); game = ctrl.game; } else { RoboVMGame.IOSSetting config = new IOSSetting(); config.copy(setting); RoboVMViewController ctrl = new RoboVMViewController(this, uiWindow.getBounds(), config); uiWindow.setRootViewController(ctrl); game = ctrl.game; setting = config; } initialize(); uiWindow.makeKeyAndVisible(); addStrongRef(uiWindow); return true; } CGRect getBounds(UIViewController viewController) { CGRect bounds = UIScreen.getMainScreen().getBounds(); UIInterfaceOrientation orientation = null; if (setting != null && setting instanceof RoboVMGame.IOSSetting) { IOSSetting config = (IOSSetting) setting; if (viewController != null) { orientation = viewController.getInterfaceOrientation(); } else if (config.orientationLandscape == config.orientationPortrait) { orientation = uiApp.getStatusBarOrientation(); } else if (config.orientationLandscape) { orientation = UIInterfaceOrientation.LandscapeRight; } else { orientation = UIInterfaceOrientation.Portrait; } } else { if (viewController != null) { orientation = viewController.getInterfaceOrientation(); } else { orientation = UIInterfaceOrientation.LandscapeLeft; } } int width; int height; switch (orientation) { case LandscapeLeft: case LandscapeRight: height = (int) bounds.getWidth(); width = (int) bounds.getHeight(); if (width < height) { width = (int) bounds.getWidth(); height = (int) bounds.getHeight(); } break; default: width = (int) bounds.getWidth(); height = (int) bounds.getHeight(); } width *= displayScaleFactor; height *= displayScaleFactor; return new CGRect(0, 0, width, height); } public abstract void onMain(); public LGame getGame() { return game; } protected RoboVMGame initialize() { if (game != null) { game.register(mainData.onScreen()); } return game; } public void register(LSetting s, LazyLoading.Data data) { this.setting = s; this.mainData = data; } public void close() { NSThread.exit(); } @Override public int getContainerWidth() { return (int) UIScreen.getMainScreen().getBounds().getWidth(); } @Override public int getContainerHeight() { return (int) UIScreen.getMainScreen().getBounds().getHeight(); } @Override public Orientation getOrientation() { if (getContainerHeight() > getContainerWidth()) { return Orientation.Portrait; } else { return Orientation.Landscape; } } private int getIosVersion() { String systemVersion = UIDevice.getCurrentDevice().getSystemVersion(); int version = Integer.parseInt(systemVersion.split("\\.")[0]); return version; } public UIWindow getUIWindow() { return uiWindow; } public UIApplication getUIApp() { return uiApp; } @Override public void sysText(final SysInput.TextEvent event, KeyMake.TextType textType, String label, String initVal) { if (game == null) { event.cancel(); return; } UIAlertView view = new UIAlertView(); if (label != null) { view.setTitle(label); } view.addButton("Cancel"); view.addButton("OK"); view.setAlertViewStyle(UIAlertViewStyle.PlainTextInput); final UITextField field = view.getTextField(0); field.setReturnKeyType(UIReturnKeyType.Done); if (initVal != null) { field.setText(initVal); } switch (textType) { case NUMBER: field.setKeyboardType(UIKeyboardType.NumberPad); break; case EMAIL: field.setKeyboardType(UIKeyboardType.EmailAddress); break; case URL: field.setKeyboardType(UIKeyboardType.URL); break; case DEFAULT: field.setKeyboardType(UIKeyboardType.Default); break; } field.setAutocorrectionType(UITextAutocorrectionType.Yes); field.setAutocapitalizationType(UITextAutocapitalizationType.Sentences); field.setSecureTextEntry(false); view.setDelegate(new UIAlertViewDelegateAdapter() { public void clicked(UIAlertView view, long buttonIndex) { if (buttonIndex == 0) { event.cancel(); } else { event.input(field.getText()); } } }); view.show(); } @Override public void sysDialog(final SysInput.ClickEvent event,String title, String text, String ok, String cancel) { if (game == null) { event.cancel(); return; } UIAlertView view = new UIAlertView(); view.setTitle(title); view.setMessage(text); if (cancel != null) { view.addButton(cancel); } view.addButton(ok); view.setAlertViewStyle(UIAlertViewStyle.Default); view.setDelegate(new UIAlertViewDelegateAdapter() { public void clicked(UIAlertView view, long buttonIndex) { if(buttonIndex == 1){ event.clicked(); }else{ event.cancel(); } } }); view.show(); } /** * * public static void main (String[] args) { NSAutoreleasePool pool = new * NSAutoreleasePool(); UIApplication.main(args, null, * YourRoboVMGame.class); pool.close(); } */ }