2015-02-23 7 views
1

У вас есть приложение для Android, на котором работает Libgdx со многими спрайтами, все вокруг. В настоящее время я различаю их по-разному в зависимости от того, к какой группе они принадлежат, например, «красный», «зеленый», «синий» и т. Д. Однако я бы предпочел только цветную часть спрайта вместо всего.Libgdx - Окрашивание только одной части спрайта динамически

В настоящее время я использую:

batch.begin(); 
batch.setColor(color1); 
batch.draw(group1); 
batch.setColor(color2); 
batch.draw(group2); 
etc.. 

batch.end(); 

batch.setColor(color) используется для окраски партии и применить это ко всему спрайта. Когда эта группа будет выполнена, я меняю цвет и перехожу к следующей группе. Я перезагружаю цвет партии, когда делаю это с группами.

Есть ли способ для шейдера/блендера только для окрашивания части спрайта? Например, все, что окрашено red в моей текстуре должно рассматриваться как «динамическая область», которая затем может быть окрашена во все, что я динамически устанавливаю.

Я не могу использовать прозрачность, так как края текстур прозрачны и должны оставаться таковыми для смешивания.

Большое спасибо

ответ

0

Вы можете достичь этого, используя второй TextureRegion в вашем Sprite. Таким образом, вы можете использовать другой цвет для этого дополнительного региона. Этот другой регион должен содержать только часть изображения, которое изменило бы цвета и прозрачный фон.

public class MySprite extends Sprite { 
    TextureRegion region1, region2; 
    Color extraColor; 

    ... 

    @Override 
    public void draw(Batch batch, float parentAlpha) { 
     Color color = getColor(); 
     batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
     batch.draw(region1, getX(), getY(), getOriginX(), getOriginY(), 
       getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation()); 

     batch.setColor(extraColor); 
     batch.draw(region2, getX(), getY(), getOriginX(), getOriginY(), 
       getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation()); 
    } 
} 
+0

Привет, Рара, спасибо, что вернулись ко мне. Бит смущен вашим методом. В настоящее время textureregion - это возвращаемый участок атласа для спрайта, который я хочу отобразить, скажем, персонажа. Как я могу раскрасить только часть этого возвращенного спрайта? Вы создаете разные области текстуры для каждой части этого символа? – Jammo

+0

Да. Вы должны добавить еще одну текстуру в свой атлас, на котором видна только часть вашего персонажа, для которой вы хотите изменить цвет. Затем создайте 'MySprite', где' region1' - текстура персонажа, а 'region2' - вторая текстура. Не забудьте установить значение «extraColor» перед рендерингом. – Rara

+0

Этот метод кажется довольно много накладных расходов, хотя? У меня есть спрайт, который был повернут в 8 направлениях, и каждое направление анимировано с 4 кадрами. Так что мне понадобится изображение области текстуры в атласе для каждого из них? Просто похоже на кошмар адмирала, особенно если обновляется графический символ. Используемые спрайты имеют прозрачные пленки - нет ли способа ориентировать определенный цвет спрайта, например, Magenta, и только динамически окрашивать эту часть? Как, например, зеленый/синий экран работает с телевизором/фильмами – Jammo