2010-10-07 2 views
2

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

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

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

+0

Если вы будете сделать текстуру прозрачной, и вы будете использовать какое-то обнаружение столкновений, ваши объекты, вероятно, плавать где-то в воздухе в этом конкретном месте. –

+0

Я могу использовать обнаружение столкновений на пикселях против непрозрачных пикселей. –

ответ

1

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

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

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

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

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

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

3

Этот учебник является то, что вы ищете: http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php

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

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

0

Вы должны сделать новый Texure2D с цветом желаемого pixels.Alpha = 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 с последней текстурой и вы хорошо идти!

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

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