在XNA中使Texture2D的部分透明

时间:2010-10-07 07:40:40

标签: xna texture2d xna-4.0

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

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

我有XNA的3.1和4.0版本。

3 个答案:

答案 0 :(得分:3)

您正在搜索本教程: http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php

Capter 20:添加爆炸坑

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

答案 1 :(得分:1)

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

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

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

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

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

或者你可以使用像素着色器来组合它们 - 其细节超出了这个问题的范围。 (在Windows Phone 7上,像素着色器也无法在XNA 4.0上运行。)

答案 2 :(得分:0)

你应该使用所需像素的颜色制作一个新的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);

现在用Last Texture替换新的Texture2D,你很高兴!

有关碰撞的更多代码或更改纹理像素颜色,请转到此页面以获取代码: http://www.codeproject.com/Articles/328894/XNA-Sprite-Class-with-useful-methods