元素在暂停和恢复后消失

Elements disappear after pause and resume

在 RoboVM 中测试我的 libGDX 应用程序时,我遇到了一个主要问题。当我暂停我的应用程序(通过实际转到主屏幕或通过 Facebook 发送应用程序邀请)然后 return 到我的应用程序时,我的 类 游戏消失了。好像它没有在 resume() 方法上正确存储数据。一开始我虽然是我的AssetLoader有问题,但是经过一些调试我发现情况更糟。 类 和形状的实际实例消失了。就好像他们从未存在过一样。

google了一下,发现可能是IOSGraphics的问题,但是一直没有解决。

我的 IOSLauncher 看起来像这样,我删除了 Facebook 和 Google AdMob 特定代码。

 protected IOSApplication createApplication() {

        IOSApplicationConfiguration config = new IOSApplicationConfiguration();
        config.useAccelerometer = true;
        config.useCompass = true;
        config.orientationPortrait = true;
        config.orientationLandscape = false;
        return new IOSApplication(new Game(this), config);
    }

    @Override
    public boolean didFinishLaunching(UIApplication application,
                                      UIApplicationLaunchOptions launchOptions) {
        FBSDKApplicationDelegate.getSharedInstance().didFinishLaunching(application, launchOptions);
        initialize();
        return true;
    }


    public void initialize() {
        //...
    }


    public static void main(String[] argv) {
        NSAutoreleasePool pool = new NSAutoreleasePool();
        UIApplication.main(argv, null, IOSLauncher.class);
        pool.close();
    }

    @Override
    public void showAds(boolean show) {
        //...
    }

    @Override
    public void shareOnFacebook() {
        //...
    }

    @Override
    public void inviteFriends() {
        //....
    }

    @Override
    public boolean openURL(UIApplication application, NSURL url,
                           String sourceApplication, NSPropertyList annotation) {
        super.openURL(application, url, sourceApplication, annotation);
        return FBSDKApplicationDelegate.getSharedInstance().openURL(
                application, url, sourceApplication, annotation);
    }

    @Override
    public void didBecomeActive(UIApplication application) {
        super.didBecomeActive(application);
        FBSDKAppEvents.activateApp();
    }

    @Override
    public void willResignActive(UIApplication application) {
        super.willResignActive(application);
    }

    @Override
    public void willTerminate(UIApplication application) {
        super.willTerminate(application);
    }
}

这听起来很像我曾经遇到的线程错误。我通过推迟 resizeresume 来修复它,但我不确定它是否对你的情况有帮助。像这样:

private boolean needResize, needResume;

private void resize (int width, int height){
    needResize = true;
}

private void deferredResize ();
    if (!needResize) return;
    needResize = false;
    int width = Gdx.graphics.getWidth();
    int height = Gdx.graphics.getHeight();
    //move your resize code here
}

private void resume (){
    needResume = true;
} 

private void deferredResume (){
    if (!needResume) return;
    needResume = false;
    //move your resume code here
}

public void render (){
    deferredResize();
    deferredResume();

    //...
}

我建议您开始寻找 RoboVM 的替代品以避免将来出现更多问题,因为 Robovm 已被 Microsoft Xamarin 收购(遗憾但真实)并且该框架不再维护。许可证密钥(Libgdx)将继续工作到 2017 年 4 月 17 日,RoboVM 将不再有更新,无论是新功能还是错误修复。

据我所知,Libgdx 将切换到 Multi-OS 引擎作为默认 iOS 后端用于接下来的几个新创建的 libGDX 项目周。

经过几天的头痛之后,我找到了解决方案!

暂停和恢复、隐藏和显示等生命周期方法并不总是在应该调用时调用,因此数据未正确存储。这个问题可以完全破坏你的游戏。

这件事只在 iOS 平台上测试我的游戏时发生,主要是当我打开第 3 方应用程序时,在这种情况下是 Facebook。但是在 Android 上没有找到这样的东西。

我在 iOS 版本上所做的唯一更改是手动调用上述方法以确保它始终在必要时暂停和恢复。