Делаем части Texture2D прозрачными в XNA - PullRequest
2 голосов
/ 07 октября 2010

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

Я думал, что у взрыва может быть текстура маски, которую можно масштабировать для различного оружия.Затем, используя эту маску, я должен сделать прозрачный подстилающий ландшафт (и при желании нарисовать темную границу).http://mikakolari.fi/wp-content/uploads/2010/10/terrain.png Как мне этого добиться?Нужно ли менять альфа-значение пиксель за пикселем или я могу использовать какую-то технику маскировки?Рисование синего круга поверх ландшафта не вариант.

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

Ответы [ 3 ]

3 голосов
/ 16 января 2011

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

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

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

1 голос
/ 08 октября 2010

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

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

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

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

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

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

0 голосов
/ 12 февраля 2012

Вы должны сделать новый 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 на Последнюю текстуру, и вы можетеgo!

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

...