Делаем части Texture2D прозрачными в XNA

Я только начинаю разработку игр, и я подумал, что такие игры, как Tank wars или Worms, были бы хороши. Самая сложная часть, о которой я могу думать, это сделать ландшафт разрушаемым, и я хочу знать, как это делается, прежде чем переходить к простым частям.

Я думал, что этот взрыв может иметь текстуру маски, которую можно масштабировать для различного оружия. Затем, используя эту маску, я должен сделать подстилающий ландшафт прозрачным (и, при желании, нарисовать темную рамку).
(источник: mikakolari.fi)

Как мне этого добиться? Должен ли я изменять альфа-значение попиксельно или я могу использовать какую-то технику маскирования? Нарисовать синий круг поверх местности не вариант.

У меня есть версии 3.1 и 4.0 XNA.


person Mike Koder    schedule 07.10.2010    source источник
comment
Если вы сделаете текстуру прозрачной и будете использовать какое-то обнаружение столкновений, ваши объекты, вероятно, будут парить где-то в воздухе в этом конкретном месте.   -  person Adrian Fâciu    schedule 07.10.2010
comment
Я могу использовать попиксельное обнаружение столкновений с непрозрачными пикселями.   -  person Mike Koder    schedule 07.10.2010


Ответы (3)


На этот вопрос сложно ответить, потому что есть много способов сделать это. И плюсы и минусы есть у каждого метода. Я просто дам обзор:

Что касается общего дизайна, вам необходимо отслеживать: исходную текстуру, примененную «темноту» и примененную «прозрачность». Одно я могу сказать почти наверняка: вы хотите где-то «накапливать» результаты взрывов, чего вы не хотите делать, так это вести список всех взрывов, которые когда-либо происходили.

Итак, у вас есть поверхности для текстуры, темноты и прозрачности. Вероятно, вы могли бы объединить темноту и прозрачность в единую поверхность с помощью одного канала, который хранит «нормальный», «темный» (или уровень темноты) и «прозрачный».

Поскольку вы, вероятно, не хотите, чтобы темные кольца постепенно становились темнее в местах их пересечения, когда вы применяете взрыв к слою тьмы с помощью функции max (Math.Max в C#).

Чтобы создать окончательную текстуру, вы можете просто написать из текстуры темноты/прозрачности исходную текстуру или ее копию (вам нужно только обновить область, которую касается каждый взрыв).

Или вы можете использовать пиксельный шейдер для их объединения — подробности этого выходят за рамки этого вопроса. (Кроме того, пиксельный шейдер не будет работать на XNA 4.0 в Windows Phone 7.)

person Andrew Russell    schedule 08.10.2010

Это руководство — то, что вы ищете: http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php

Capter 20: Добавление кратеров от взрывов

Вкратце: у вас есть 2 текстуры: 1 цветная текстура (видимая), 1 текстура столкновения (невидимая). Вы вычитаете изображение взрыва из текстуры столкновения. Чтобы получить темную границу: разверните текстуру взрыва и затемните цвет в этой области. Теперь вы создаете новую цветную текстуру (старый цвет - коллисон = новый цвет).

person Alex    schedule 16.01.2011

Вы должны создать новый Texure2D с цветом желаемых пикселей. Альфа = 0.

Color[] bits = new Color[Texture.Width * Texture.Height];
Texture.GetData(bits);

foreach(Vector2D pixel in overlapedArea)
{
   int x = (int)(pixel.X);
   int y = (int)(pixel.Y);

   bits[x + y * texture.Width] = Color.FromNonPremultiplied(0,0,0,0));
}

Texture2D newTexture = new Texture2D(texture.GraphicsDevice, texture.Width, texture.Height);
newTexture.SetData(bits);

Теперь замените новый Texture2D на Last Texture, и все готово!

Для получения дополнительной информации о столкновении или изменении цвета пикселей текстуры перейдите на эту страницу с кодами: http://www.codeproject.com/Articles/328894/XNA-Sprite-Class-with-useful-methods

person Ashkan Ghodrat    schedule 11.02.2012