Expose PlayN as a normal iOS view controller and bind the game lifecycle with it. This also makes both integration and customisation easier, which always happens in a view controller.
RoboGameController could be more accurate name than RoboRootViewController which may or may not be a root view controller now in the current context and sounds a little bit confusion. I did not change that for the sake of patch reviewing.
I'v tested with my application and also wrote a simple application demonstrating how to use PlayN as a standalone application or an embedded application. Probably it should be included in the play-smaples project.
public class Main {
public static void main(String[] args) {
NSAutoreleasePool pool = new NSAutoreleasePool();
UIApplication.main(args, null, StandaloneApplication.class);
// UIApplication.main(args, null, EmbeddedApplication.class);
pool.close();
}
public static class StandaloneApplication extends UIApplicationDelegateAdapter {
private UIWindow window;
@Override
public boolean didFinishLaunching(UIApplication app, UIApplicationLaunchOptions launchOpts) {
window = new UIWindow(UIScreen.getMainScreen().getBounds());
RoboRootViewController gameController = new RoboRootViewController();
gameController.run(new GameDemo());
// Setup our game controller as the root controller
window.setRootViewController(gameController);
window.makeKeyAndVisible();
addStrongRef(window);
return true;
}
}
public static class EmbeddedApplication extends UIApplicationDelegateAdapter {
private UIWindow window;
@Override
public boolean didFinishLaunching(UIApplication app, UIApplicationLaunchOptions launchOpts) {
window = new UIWindow(UIScreen.getMainScreen().getBounds());
UINavigationController root = new UINavigationController();
root.addChildViewController(new WelcomeViewController());
// Setup a navigation controller as the root controller to manage the application.
window.setRootViewController(root);
window.makeKeyAndVisible();
addStrongRef(window);
return true;
}
}
public static class WelcomeViewController extends UIViewController {
public WelcomeViewController() {
super();
UIButton button = new UIButton();
button.setTitle("Run", UIControlState.Normal);
button.addOnTouchUpInsideListener(new OnTouchUpInsideListener() {
@Override public void onTouchUpInside(UIControl control, UIEvent event) { run();}
});
setView(button);
}
@Override
public void viewWillAppear(boolean animated) {
super.viewDidAppear(animated);
UIBarButtonItem button = new UIBarButtonItem(UIBarButtonSystemItem.Bookmarks, new OnClickListener() {
@Override public void onClick(UIBarButtonItem barButtonItem) { run();};
});
NSArray<UIBarButtonItem> items = new NSArray<UIBarButtonItem>(button);
getNavigationItem().setRightBarButtonItems(items);
getNavigationItem().setTitle("Welcome");
}
protected void run() {
RoboRootViewController gameViewController = new RoboRootViewController();
gameViewController.run(new GameDemo(new Exit() {
@Override public void exit() { getNavigationController().popViewController(true);}
}));
getNavigationController().pushViewController(gameViewController, true);
}
}
public static class GameDemo extends Game.Default {
public static interface Exit {
public void exit();
}
final private Exit service;
public GameDemo() {
this(null);
}
public GameDemo(Exit service) {
super(25);
this.service = service;
}
@Override
public void init() {
CanvasImage image = PlayN.graphics().createImage(100, 100);
image.canvas().setFillColor(Color.rgb(255, 0, 0));
image.canvas().fillRect(0, 0, image.width(), image.height());
ImageLayer imageLayer = PlayN.graphics().createImageLayer(image);
imageLayer.addListener(new Pointer.Adapter() {
@Override
public void onPointerEnd(Event event) {
if (service != null) service.exit();
}
});
PlayN.graphics().rootLayer().addAt(imageLayer, 50, 50);
}
}
Expose PlayN as a normal iOS view controller and bind the game lifecycle with it. This also makes both integration and customisation easier, which always happens in a view controller.
RoboGameController could be more accurate name than RoboRootViewController which may or may not be a root view controller now in the current context and sounds a little bit confusion. I did not change that for the sake of patch reviewing.
I'v tested with my application and also wrote a simple application demonstrating how to use PlayN as a standalone application or an embedded application. Probably it should be included in the play-smaples project.
public class Main {
}