2015-02-20 3 views
2

Итак, у меня есть класс, который расширяет Actor, и я пытаюсь изменить его значение; objectPreview тип этого класса:(LibGDX) Изменение цвета актера

@Override 
public void display() { 

    ... 

    // remove previous object preview from stage 
    objectPreview.remove(); 

    ... 

    // add a translucent preview of where the object will be added 
    objectPreview.getColor().a = 0.5f; 
    stage.addActor(objectPreview); 

    ... 

    stage.draw(); 
} 

А вот мой draw метод моего обычая Actor:

@Override 
public void draw(Batch batch, float alpha) { 
    batch.enableBlending(); 
    batch.draw(texture, pos.x, pos.y); 
} 

Метод display вызывается каждый кадр, и objectPreview является Actor, который был добавлен stage.

Однако изменение альфа-значения objectPreview не работает.

В противном случае это работает по назначению, помещая предварительный просмотр Actor на экран и очищая/перерисовывая его в каждом кадре.

Я также пробовал метод setColor(), и это не работает. Даже если я изменю r, g, b vaulues, ничего не произойдет; объект по-прежнему является оригинальной текстурой Actor's.

Почему нет изменения Color?

+0

Как выглядит метод рисования вашего пользовательского актера? – Tenfour04

+0

Отредактировано в OP! @ Tenfour04 – Tetramputechture

+0

Вставьте моих детей в постель, ответит через несколько минут. :) – Tenfour04

ответ

5

Когда вы подклассируете актера, вам остается применить собственный цвет в методе draw. Я не уверен, почему они не построили это в классе Actor, кроме, может быть, существует так много возможных способов использования цвета, или потому, что у некоторых Актеров нет связанных с ними визуальных образов, поэтому применение цвета будет тратить время.

Прежде всего, обратите внимание, что второй аргумент, переданный в метод draw, равен parentAlpha, а не alpha, как вы его отметили. Это связано с тем, что альфа-альфа-родителя следует умножать на альфа-файл для правильных эффектов затухания.

Таким образом, ваш обновленный draw метод должен выглядеть следующим образом:

@Override 
public void draw(Batch batch, float parentAlpha) { 
    batch.enableBlending(); //You can probably remove this line* 
    Color color = getColor(); //keep reference to avoid multiple method calls 
    batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
    batch.draw(texture, pos.x, pos.y); 
} 

/* * It would only be useful if you have some custom Actors that disable blending. 
I don't think any of the built-in actors disable blending. Since many actors will 
require blending, it is usually best to leave it on even for fully opaque sprites, in 
order to avoid ending up with many draw calls. */ 

Также обратите внимание, что если вы хотите, чтобы воспользоваться уже существующими актерского scaleX и scaleY полей, также было бы к вам, чтобы изменить draw чтобы использовать их.

+0

Вот и все! Спасибо, что имеет смысл! – Tetramputechture

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