2012-01-20 10 views
1

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

ответ

0

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

+1

Фактически сам двигатель загружает ресурсы. Мои вопросы касаются того, почему движок приостановлен, когда на нем есть диалог или индикатор выполнения. Как я могу возобновить его вручную. –

+0

@Jawad Amjad проверить мой ответ ниже. Надеюсь, поможет ;) – GuilhE

0

От 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. Это непросто и требует большого количества кода, но это возможно и не требует сумасшедших хаков, просто какая-то логика.

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

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

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

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

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


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

Смежные вопросы