Индикатор выполнения при загрузке текстур в AndEngine - PullRequest
1 голос
/ 20 января 2012

когда я запускаю игру, на некоторое время появляется черный экран, потому что ресурсы загружаются.Я тщательно изучил учебник, в котором показано, как отображать индикатор выполнения, а ведущие ресурсы следовали ему, и теперь я вижу индикатор выполнения.Но проблема в том, что когда отображается индикатор выполнения, все остальное останавливается.И ничего не происходит.Только черный экран и индикатор на нем.Может ли кто-нибудь сказать мне, почему все приостановлено и почему методы loadresources и loadcene не работают?Пожалуйста, предоставьте решение.

Ответы [ 2 ]

0 голосов
/ 25 июля 2014

Из Engine.java:

public void onDrawFrame(final GLState pGLState) throws InterruptedException {
        final EngineLock engineLock = this.mEngineLock;

        engineLock.lock();
        try {
            engineLock.waitUntilCanDraw();

            this.mVertexBufferObjectManager.updateVertexBufferObjects(pGLState);
            this.mTextureManager.updateTextures(pGLState);
            this.mFontManager.updateFonts(pGLState);

            this.onUpdateDrawHandlers(pGLState, this.mCamera);
            this.onDrawScene(pGLState, this.mCamera);

            engineLock.notifyCanUpdate();
        } finally {
            engineLock.unlock();
        }
    }

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

Вам необходим менеджер ресурсов (RM) и Scene Manager (SM) , которые работают вместе (с AsyncTasks) и отвечают за загрузку текстур для текущей сцены.Поскольку у вас BaseGameActivity, вы можете использовать этот экземпляр Activity, чтобы отобразить полноэкранный Dialog с индикатором выполнения.Логика такова:

  1. SM просят показать Сцена A
  2. SM показывает загрузку Dialog
  3. SM асинхронно сообщает RMзагрузить все ресурсы Scene A в аппаратные средства (для каждой текстуры для сцены A, texture.load)
  4. RM "onSceneTexturesLoadComplete" сообщает SM, что все текстуры загружены

Так как texture.load не гарантирует, что текстура действительно загружена, вам нужно иметь TryToDismissDialog, который расширяет TimerTask.Время от времени TryToDismissDialog запрашивает текстуры Scene A и проверяет, действительно ли они загружены:

if (texturePack.getTexture().isLoadedToHardware()) {
        texturesLoaded++;
}

Если все текстуры загружены, вы отклоняете Dialog и вуаля, вы увидите, что Сцена готова.
Надеюсь, это поможет


ps: на самом деле это включает в себя несколько строк кода, я только что разместил здесь быстрые шаги / руководство / псевдокод.Я не буду публиковать окончательное решение, потому что оно довольно тяжелое и «связано с проектом».

0 голосов
/ 20 января 2012

Вам нужно загрузить свои ресурсы в рабочий поток. Хорошая утилита для этого - AsyncTask . В теме руководства Процессы и потоки есть объяснение, почему вам нужно что-то подобное, а также пример кода, показывающий, как сделать простой AsyncTask, который может быть именно тем, что вам нужно.

...