2010-10-07 53 views
2

我刚刚开始游戏开发,我认为像坦克大战或蠕虫这样的游戏会很好。 到目前为止,我能想到的最难的部分是让地形破坏,我想知道在做简单零件之前它是如何完成的。在XNA中制作Texture2D的透明部分

我认为爆炸可能有一个面具纹理,可以缩放不同的武器。然后使用该掩码,我应该使底层地形透明(并可选绘制黑色边框)。 http://mikakolari.fi/wp-content/uploads/2010/10/terrain.png 我该如何做到这一点? 我是否必须逐个像素地更改alpha值,还是可以使用某种遮罩技术?在地形上绘制蓝色圆圈不是一种选择。

我有版本3.1和4.0的XNA。

+0

如果你要让质地透明,你会使用某种类型的碰撞检测,你的对象可能会漂浮在那个特定地方的空气中。 – 2010-10-07 07:46:00

+0

我可以针对不透明像素使用每像素碰撞检测。 – 2010-10-07 11:48:34

回答

1

这是一个难以回答的问题 - 因为有很多方法可以做到这一点。每种方法都有优点和缺点。我将给出一个概述:

作为一个整体设计,您需要跟踪:应用原始纹理,“黑暗”和“透明度”。我可以肯定地说的一件事是,你想在某处“积累”爆炸的结果 - 你不想做的是保持所有爆炸发生的清单。

所以你有纹理,黑暗和透明度的表面。您可以将黑暗和透明度合并到一个存储“正常”,“黑暗”(或黑暗程度)和“透明”的单个通道的单个表面中。

因为在max函数(在C#中使用Math.Max)向黑暗层应用爆炸时,您可能不希望暗环的相交位置逐渐变暗。

为了生成最终的纹理,您只需从黑暗/透明度纹理写入原始纹理或其副本(您只需更新每个爆炸接触的区域)即可。

或者你可以使用像素着色器来组合它们 - 其细节超出了这个问题的范围。 (另外一个像素着色器将不能在XNA 4.0在Windows Phone 7的工作)

3

本教程是要搜索的内容: http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php

Capter 20:添加爆炸陨石坑

简而言之: 您有2个纹理:1颜色纹理(可见)​​,1碰撞纹理(不可见) 可以减去碰撞纹理中的爆炸图像。 要获得黑色边框:展开爆炸纹理并使该区域的颜色变暗。 现在生成一个新的颜色纹理(旧颜色 - 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