libGDX iOS游戏没有收到输入

时间:2014-12-08 01:13:51

标签: java ios libgdx google-play-services robovm

我目前正致力于使用roboVM将我的LibGDX游戏移植到iOS。一切正常,除了我遇到一些问题,让我的绑定工作为admob和谷歌Play游戏服务。我能够解决Admob的一个问题,但同样的问题已经出现在GPGS上,我无法找到解决方法。 bindings是与各种iOS SDK相关联的钩子。我用它们来展示Admob广告并与Google Play服务进行交互。

我试着在这里关注Sample.java:

Sample.java

但它对我来说有一些问题。首先,样本覆盖的didFinishLaunching()方法是错误的,永远不会被调用。它应该覆盖didFinishLaunching(UIApplication应用程序,UIApplicationLaunchOptions launchOptions)。

我现在面临的主要问题是由于window.makeKeyAndVisible()调用,游戏不接受用户输入。如果我采取这种方法,一切都很好,但我不能展示广告,也不能展示Google Play服务。我将看到关于窗口不在视图层次结构中的警告。我可以通过在显示广告之前调用makeKeyAndVisible()并在插页式广告委托中解除后调用setHidden()来解决这个问题。但是,我无权使用Google Play服务。似乎没有其他人遇到这个问题。可能是什么问题呢?我对iOS不是很熟悉,所以我不知道需要做什么让我的应用程序正确接收输入。

1 个答案:

答案 0 :(得分:3)

好吧因此,使用Admob和GPGS或其他绑定向iOS发布LibGDX游戏是一个痛苦的过程,但我已经设法让一切正常,我的游戏现在处于等待审核状态。在回答这个问题时,Apple似乎拒绝使用Google Play游戏服务的应用程序,因为GPGS SDK会将用户带到Safari进行登录。这对于Apple来说是不可接受的,因为它的用户体验不佳#34 ;.实际上,当用户尝试登录GPGS SDK时,会查找Google+的安装情况以便登录,如果找不到那么则会打开Chrome浏览器,最后是Safari如果没有安装Chrome。在正确集成GPGS并尝试将我的二进制文件提交给Apple后,我面临另一个关于Google SDK未签名的问题。因为看起来我的应用程序会被拒绝,即使我要解决这个问题,我决定放弃GPGS并使用Apple的游戏中心。也就是说,我仍然可以使用Admob在我的测试设备上运行GPGS,所以我可以在这里回答。

首先,BlueRiverInteractive中的样本对于LibGDX游戏并不是那么有用。所有UIWindow,UIViewController和UIView的东西你都不应该捣乱。您的IOSLauncher类应该扩展Delegate而不是UIApplicationDelegateAdapter。如果您查看Delegate,它会为您的应用程序设置UIApplication,UIWindow和其他iOS内容。扩展它时,您将被迫实现createApplication()。这是我的例子:

@Override
protected IOSApplication createApplication() {

    final IOSApplicationConfiguration config = new IOSApplicationConfiguration();
    config.orientationLandscape = false;
    config.orientationPortrait = true;
    config.useAccelerometer = false;
    config.useCompass = false;

    iosApplication = new IOSApplication(new SplishGame(this), config);
    return iosApplication;
}

将iosApplication保留为IOSLauncher类的字段成员。通过它,您可以获得显示插页式广告和排行榜/成就所需的UIWindow。

要做的第二件事是确保你的IOSLauncher类覆盖didFinishLaunching(UIApplication应用程序,UIApplicationLaunchOptions launchOptions)而不是只有一个参数的didFinishLaunching方法,否则它不会被调用。在您的didFinishLaunching方法中,您可以实例化您的GPGS管理器类(在一秒钟内更多)并尝试以静默方式登录。这让我想起了在尝试集成GPGS时遇到的另一个问题 - 确保您正在使用GPGS管理器对象来简化生活(PlayServicesManager)。 GPGS绑定项目中有两个样本,我最初看的是难以使用的'一个没有使用PlayServicesManager类的人。一旦设置了管理器对象,就可以调用manager.login()或manager.getLeaderboards()这样的简单方法来完成你需要做的事情。

要在didFinishLaunching方法中初始化您的经理类,请执行以下操作:

    playManager = new PlayServicesManager();
    playManager.setClientId(CLIENT_ID);
    playManager.setUserDataToRetrieve(true, false);
    playManager.setViewController(iosApplication.getUIViewController());
    playManager.didFinishLaunching();

对于Game Center,它是这样的:

gcManager = new GameCenterManager(iosApplication.getUIWindow(), new GameCenterListener() {...(overridden methods left blank)
gcManager.login();

然后,您的核心项目的代码可以通过ActionResolver接口调用必要的函数 - 或者您命名为本机接口的任何函数。所以你有类似的东西:

@Override
    public void getLeaderboards() {
            log.debug("Showing all leaderboards.");
            playManager.showLeaderboardsPicker();
    }

一切都应该有效。

显然你需要做的另一件事(仅适用于GPGS)是将此方法复制到IOSLauncher类中:

// copy-paste this to your app delegate.
    @Override
    public boolean openURL(UIApplication application, NSURL url, String sourceApplication, NSPropertyList annotation) {
        return GPPURLHandler.handleURL(url, sourceApplication, annotation);
    }

据我所知,这是关于它的。如果您认为有问题或者我忘了重要的事情,请发帖。