2017-02-16 8 views
1

В некоторых конкретных случаях актер после добавления на сцену становится черной поверхностью, а не фактической текстурой. В других случаях я мог загрузить актера в начале, а затем установить его невидимым, и когда мне это нужно, я мог бы установить его видимым. Но я не хочу этого делать.libgdx/android: актер становится черным после добавления на сцену

Так вот код визуализации():

public void render() { 
    Gdx.gl.glClearColor(backgroundColour.r, backgroundColour.g, backgroundColour.b, 
     backgroundColour.a); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 

    stage.act(); 
    stage.draw(); 
} 

и где я пытаюсь добавить изображение на сцену

cardImage.setPosition(x, y); 
cardImage.setWidth(ViewConstants.scalingWidthCard * ViewConstants.widthOneSpace); 
cardImage.setHeight(ViewConstants.scalingHeightCard * ViewConstants.heightOneSpace); 
stage.addActor(cardImage); 

где cardImage имеет класс ImageWrapper (ImageWrapper расширяет изображение и просто содержит еще несколько полей, методы не были перезаписаны/изменены каким-либо образом). И вот код, как я загружаю текстуру:

private ImageWrapper loadActorForCardAndSaveInMap(Card card) { 
    String textureString = loader.getCardTextureName(card); 
    ImageWrapper textureForCard = loader.getImageForPath("cards/" + textureString + ".png"); 

    // irrelevant for libgdx, but I'll post it, so you see what happens 
    faceUpCards.put(textureString, textureForCard); 

    return textureForCard; 
} 
[...] 
private ImageWrapper getImageForPath(String path) { 
     try { 
      return new ImageWrapper(new Texture(Gdx.files.internal(path))); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

Все работает нормально в большинстве случаев, но не во всех.

Я также попытался перезагрузить сцену с

Group root = stage.getRoot(); 
stage.clear(); 
stage.setRoot(root); 

, как указано here. Но это не устраняет проблему.

+0

Обновление: я обнаружил, что текущая версия 1.9.5, изменила это, но ни то, ни другое, кроме кода, где я устанавливаю корень, ничего не меняет проблему. – Isabella

+0

показать мне код вашего метода drawImage класса? – Aryan

+0

Заголовок вопроса не соответствует проблеме, описанной в конце (setRoot неизвестен). в чем именно проблема?: Вы получаете ошибку компиляции? Ошибка выполнения или что-то еще? – munyul

ответ

1

синхронизироваться с визуализацией нити

Так как render() вызова фактически синхронизированным с контекстом GL, использовать это в качестве точки входа.

1) Определение задач-список где- private ArrayList<Runnable> synchronizedTasks = new ArrayList<>();

2) Добавить синхронизированные звонки внутри визуализации цикла ваших задач

public void render() { 
    runSyncTasks(); 
    // other draw code 
} 

private void runSyncTasks(){ 
    synchronized(synchronizedTasks){ 
     for(Runnable r : synchronizedTasks){ 
      r.run(); 
     } 
     synchronizedTasks.clear(); 
    } 
} 

3) Если вы хотите загрузить изображение (например, на входе пользователя), представить задачу так:

synchronized(synchronizedTasks){ 
    synchronizedTasks.add(new Runnable(){ 
     @Override 
     public void run(){ 
      ... loadActorForCardAndSaveInMap(...) 
     } 
    }); 
} 

Это добавит Runnable в список и он будет выполнять d в следующем проходе render() прохода GL. Имейте в виду, что вам необходимо выполнить любые действия с созданным объектом ImageWrapper внутри этого метода run(){}.

Редактировать

Или на самом деле, вы можете просто отправить Runnable через Gdx.app.postRunnable(new Runnable()...); без пользовательского синхронизатора вещи. Вызов Gdx делает то же самое.

+0

Благодарим вас за подробное объяснение. У меня были проблемы с ожиданием результата из потока, но теперь я нашел способ выполнения, где мне не нужно ждать результата (самый внешний вызов был пустым), и теперь он работает как шарм. Спасибо вам большое! – Isabella