在XNA中使Texture2D部件透明

在XNA中使Texture2D部件透明,xna,texture2d,xna-4.0,Xna,Texture2d,Xna 4.0,我刚刚开始游戏开发,我觉得像坦克战或蠕虫这样的游戏会很不错。 到目前为止,我能想到的最困难的部分是使地形具有可破坏性,我想在做简单的部分之前知道它是如何做到的 我认为爆炸可能有一个面具纹理,可以根据不同的武器进行缩放。然后使用该遮罩,我应该使底层地形透明(并可以选择绘制一个黑色边界)。 (来源:) 我如何做到这一点? 我是否必须逐像素更改alpha值,还是可以使用某种遮罩技术?在地形顶部绘制蓝色圆圈不是一个选项 我有XNA的3.1版和4.0版。这是一个很难回答的问题,因为有很多方法可以做到这一

我刚刚开始游戏开发,我觉得像坦克战或蠕虫这样的游戏会很不错。 到目前为止,我能想到的最困难的部分是使地形具有可破坏性,我想在做简单的部分之前知道它是如何做到的

我认为爆炸可能有一个面具纹理,可以根据不同的武器进行缩放。然后使用该遮罩,我应该使底层地形透明(并可以选择绘制一个黑色边界)。
(来源:)

我如何做到这一点? 我是否必须逐像素更改alpha值,还是可以使用某种遮罩技术?在地形顶部绘制蓝色圆圈不是一个选项


我有XNA的3.1版和4.0版。

这是一个很难回答的问题,因为有很多方法可以做到这一点。每种方法都有利弊。我只做一个概述:

作为整体设计,您需要跟踪:原始纹理、应用的“黑暗”和应用的“透明度”。有一件事我几乎可以肯定,那就是你想“积累”某个地方爆炸的结果——你不想做的是保存一份曾经发生过的所有爆炸的清单

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

因为您可能不希望暗环在相交处逐渐变暗,当您使用
max
函数(
Math.max
在C#中)对黑暗层应用爆炸时

要生成最终纹理,您只需将“黑暗/透明”纹理写入原始纹理或其副本(只需更新每次爆炸接触的区域)


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

本教程是您正在搜索的内容:

捕捉者20:添加爆炸坑

简言之: 您有2个纹理:1个颜色纹理(可见),1个碰撞纹理(不可见) 从碰撞纹理中减去爆炸图像。 要获得黑色边框:展开“爆炸”纹理并使该区域的颜色变暗。
现在,您将生成一个新的颜色纹理(旧颜色-collison=新颜色)。

您应该使用所需像素的颜色创建一个新的Texure2D。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);
现在用最后一个纹理替换新的纹理2D,就可以开始了

有关碰撞或更改纹理像素颜色的更多代码,请转到此页面获取代码:

如果要使纹理透明,并使用某种碰撞检测,则对象可能会漂浮在该特定位置的空中某处。我可以对不透明的像素使用逐像素碰撞检测。