【问题标题】:Elements disappear after pause and resume暂停和恢复后元素消失
【发布时间】:2016-05-01 12:17:42
【问题描述】:

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

在谷歌上搜索该问题后,我发现它可能与 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);
    }
}

【问题讨论】:

    标签: libgdx resume robovm pause


    【解决方案1】:

    这听起来类似于我曾经遇到的线程错误。我通过推迟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();
    
        //...
    }
    

    【讨论】:

    • 不,没有成功 :( 非常感谢您抽出宝贵时间!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在头疼了几天后,我找到了解决办法!

      LifeCycle 方法(如暂停和恢复、隐藏和显示)在应该调用时并不总是被调用,因此数据没有正确存储。这个问题可以彻底破坏你的游戏。

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

      我在 iOS 版本上唯一更改的是手动调用上述方法,以确保它总是在需要时暂停和恢复。

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 2021-11-25
        • 1970-01-01
        • 2013-07-19
        • 2015-07-28
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多