Libgdx изменение цвета текстуры во время выполнения
в игре, сделанной с Libgdx
У меня есть TextureAtlas
, в котором я храню все TextureRegion
для меня Animation
s Player
. The Player
по умолчанию имеет синюю футболку (например).
Теперь я хотел бы иметь возможность иметь более одного Player
, и все Player
должен иметь другой цвет футболки.
Так что в основном я хочу заменить синий на красный для второго Player
, С зеленым для 3-го Player
и так далее.
Я уверен, что смогу сделать это с PixMap
, но не затем я теряю преимущество TextureAtlas
?
Есть ли другая возможность сделать это? Или мне нужно иметь каждую "цветную версию" как TextureRegion
на TextureAtlas
?
Еще один маленький вопрос:--17-->
С Gimp (и, возможно, несколькими другими программами) вы можете использовать цветовые индексы для ".гиф файлы".
Это уменьшает размер всех ваших Texture
s, сохраняя индекс для каждого цвета в файле, а затем используя этот индекс для описания пикселей. Таким образом, для каждого красного пикселя у вас будет " 1" вместо " #FF0000 "и где-то в файле у вас есть"1=#FF0000".
Если вы упаковать ".gif " файлы с цветовыми индексами внутри TextureAtlas
, затем индекс теряется, и он восстанавливает цвета RGB по умолчанию или это даст проблемы?
Спасибо большое!
3 ответов
я столкнулся с той же проблемой для генерации оружия со случайными цветами, используя ту же текстуру.
Итак, я написал это.
В основном я делаю pixmap текстуры, которую вы хотите редактировать.
затем вы повторяете все пиксели, в то время как я проверяю определенные цвета, которые являются частью определенной части текстуры. (Я предлагаю использовать разные оттенки серого, так как RGB одинаковый)
затем, когда он находится на пикселе, где цвет нуждается чтобы быть измененным, я хватаю цвет для этих групп пикселей, используя метод выбора цвета, который в основном случайный, который получает цвет из сборного цветового массива,
а затем изменяет этот конкретный пиксель на новый цвет.
/**
* Requires a asset's textureName, and requires gray scale colors of the
* parts
*
* @param texturename
* @param colorBlade
* @param colorEdge
* @param colorAffinity
* @param colorGrip
* @return
*/
private static Texture genTexture(String texturename, int colorBlade,
int colorEdge, int colorAffinity, int colorGrip, int colorExtra) {
Texture tex = Game.res.getTexture(texturename);
TextureData textureData = tex.getTextureData();
textureData.prepare();
Color tintBlade = chooseColor(mainColors);
Color tintEdge = new Color(tintBlade.r + 0.1f, tintBlade.g + 0.1f,
tintBlade.b + 0.1f, 1);
Color tintAffinity = chooseColor(affinityColors);
Color tintGrip;
Color tintExtra = chooseColor(extraColors);
boolean colorsAreSet = false;
do {
tintGrip = chooseColor(mainColors);
if (tintAffinity != tintBlade && tintAffinity != tintGrip
&& tintGrip != tintBlade) {
colorsAreSet = true;
}
} while (!colorsAreSet);
Pixmap pixmap = tex.getTextureData().consumePixmap();
for (int y = 0; y < pixmap.getHeight(); y++) {
for (int x = 0; x < pixmap.getWidth(); x++) {
Color color = new Color();
Color.rgba8888ToColor(color, pixmap.getPixel(x, y));
int colorInt[] = getColorFromHex(color);
if (colorInt[0] == colorBlade && colorInt[1] == colorBlade
&& colorInt[2] == colorBlade) {
pixmap.setColor(tintBlade);
pixmap.fillRectangle(x, y, 1, 1);
} else if (colorInt[0] == colorEdge && colorInt[1] == colorEdge
&& colorInt[2] == colorEdge) {
pixmap.setColor(tintEdge);
pixmap.fillRectangle(x, y, 1, 1);
} else if (colorInt[0] == colorAffinity
&& colorInt[1] == colorAffinity
&& colorInt[2] == colorAffinity) {
pixmap.setColor(tintAffinity);
pixmap.fillRectangle(x, y, 1, 1);
} else if (colorInt[0] == colorGrip && colorInt[1] == colorGrip
&& colorInt[2] == colorGrip) {
pixmap.setColor(tintGrip);
pixmap.fillRectangle(x, y, 1, 1);
}
else if (colorInt[0] == colorExtra && colorInt[1] == colorExtra
&& colorInt[2] == colorExtra) {
pixmap.setColor(tintExtra);
pixmap.fillRectangle(x, y, 1, 1);
}
}
}
tex = new Texture(pixmap);
textureData.disposePixmap();
pixmap.dispose();
return tex;
}
надеюсь, это поможет.
Пожалуйста, не просто скопируйте пасту, попробуйте перестроить это в соответствии с вашими потребностями, или вы ничего не узнаете.
способ сделать это - просто установить максимальное количество игроков, и сделать футболки для всех, и упаковать их с атласом текстуры и добавить их в один массив TextureRegion.
теперь вам нужно будет переключаться только между индексами.
другой способ сделать это с партией.setColor
void setColor(Color tint)
void setColor(float color)
void setColor(float r, float g, float b, float a)
и просто установите цвет пакета sprite для каждой футболки, которую вы рисуете, и после того, как вы нарисовали все из них, поместите цвет spritebatch в белый снова.
вы также можете сделать это с помощью класса Sprite с функцией setColor.
Если ваши футболки не имеют очень большого размера, а ваш максимальный номер игрока небольшой, я бы рекомендовал первый метод.
Роза Блэкс сделала действительно хорошую работу. Но если вы хотите сделать это с помощью SpriteBatch или для кого-то, кто имеет ту же проблему, но не хочет использовать Pixmap...
конечно, мне очень нравится использовать Pixmap, но я видел использование " spritebatch / sprite.setcolor (r,g,b,a)" дал некоторые проблемы, как изменить все цвета текстуры вместо только футболки... Вот почему я пришел сюда и да, можно изменить только футболку, используя этот способ. Вы готовы? : D
1 - Принять участие хочу, чтобы краски в сером или белом 2-разделите части покрасьте в texturepack или другой текстуре: в случае футболки вам нужен пакет, где футболка выходит из вашего символа... Да, будет кто-то с головой, руками и ногами. T-short может быть в той же упаковке или нет. Но держите отверстие между тем, чтобы положить футболку в будущем.
это будет выглядеть так:
Не нужно быть напуганный. Я знаю, что этот образ расщепил весь характер, но если вы хотите изменить только футболку, то вы отделите только ее от остального тела.
3-вы нарисуете их обоих, но не тот же TextureRegion, ваш код будет выглядеть так:
public void draw(SpriteBatch batch){
//First we draw the player with a hole in his body
batch.draw(playerA,0,0,75,100);
//Here we set the color of next texture to be drawn as RED.
batch.setColor(Color.RED);
//Now we draw the t-shirt of the player in same x and half y.
//That t-short has to be drawn in right position. That's why calc it.
batch.draw(tshirtA, 0,50,50);
//For don't affect others textures then make it white back.
batch.setColor(Color.WHITE);
}