2

我刚刚开始游戏开发,我认为像 Tank Wars 或 Worms 这样的游戏会很不错。到目前为止,我能想到的最困难的部分是让地形变得可破坏,我想在做简单的部分之前知道它是如何完成的。

我认为爆炸可以有一个面具纹理,可以针对不同的武器进行缩放。然后使用该蒙版,我应该使底层地形透明(并可选择绘制深色边框)。 (来源:mikakolari.fi

我该如何做到这一点?我是否必须逐个像素地更改 alpha 值,还是可以使用某种掩蔽技术?在地形顶部画一个蓝色圆圈不是一种选择。

我有 XNA 的 3.1 和 4.0 版本。

4

3 回答 3

3

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

第20章:添加爆炸坑

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

于 2011-01-16T00:14:34.300 回答
1

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

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

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

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

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

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

于 2010-10-08T15:39:05.140 回答
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

于 2012-02-11T23:53:46.420 回答