Элементы исчезают после паузы и возобновления

При тестировании моего приложения libGDX в RoboVM я столкнулся с серьезной проблемой. Когда я приостанавливаю свое приложение (фактически переходя на главный экран или отправляя приглашения приложения через Facebook), а затем возвращаюсь в свое приложение, классы моих игр исчезают. Как будто он не хранит данные в методе 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);
    }
}

person d.sz.    schedule 01.05.2016    source источник


Ответы (3)


Это похоже на ошибку потоковой передачи, с которой я когда-то столкнулся. Я исправил это, отложив resize и resume, но я не уверен, поможет ли это в вашем случае. Что-то вроде этого:

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();

    //...
}
person Tenfour04    schedule 01.05.2016
comment
нет, не вышло :( Спасибо, что уделили время! - person d.sz.; 01.05.2016

Я предлагаю вам начать искать альтернативу RoboVM, чтобы избежать других проблем в будущем, поскольку Robovm был приобретен Microsoft Xamarin (печально, но факт), и фреймворк больше не поддерживается. Лицензионные ключи (с Libgdx) будут работать до 17 апреля 2017 года, никаких дальнейших обновлений RoboVM, будь то новые функции или исправления ошибок, не будет.

Насколько мне известно, в ближайшие пару недель Libgdx переключится на движок Multi-OS в качестве бэкэнда iOS по умолчанию для вновь созданных проектов libGDX.

person ZEE    schedule 01.05.2016

Через пару дней, наполненных головной болью, я нашел решение!

Методы LifeCycle, такие как пауза и возобновление, скрытие и показ, не всегда вызываются, когда они должны быть вызваны, поэтому данные не сохраняются должным образом. Эта проблема может полностью сломать вашу игру.

Это произошло только при тестировании моей игры на платформе iOS, в основном, когда я открыл стороннее приложение, в данном случае Facebook. Однако на Android такого нет.

Единственное, что я изменил в версии для iOS, - это вызов упомянутых методов вручную, чтобы убедиться, что они всегда приостанавливаются и возобновляются, когда это необходимо.

person d.sz.    schedule 05.05.2016