我对二维发动机世界很陌生。我想出了如何加载图像并将其显示为精灵和东西,但是有一个问题让我烦恼。 例如,当“火箭”撞击物体时,它将对其造成伤害并留下一个陨石坑。我想在那个物体上展示陨石坑。这需要在渲染时“跳过”该图像的某些像素,不是吗? 我的问题是,你会怎么做这样的事情?您将使用什么数据结构来保存它?如何显示“破碎的”精灵?
答案 0 :(得分:3)
创建sprite sheet。
这将包含你的物体的所有灵魂,在这种情况下是火箭。其中一些图像将是火箭粉碎成许多碎片,火灾等...
然后,当您的对象命中时,您将播放碰撞动画。你的方法在技术上会起作用,但它太过分了。使用精灵表很简单,而不是绘制大量图像,您只需绘制一部分工作表,并在工作表的X和Y轴上播放动画增量。这自然要求纸张铺平,但这不是太多的工作。
答案 1 :(得分:2)
在某些情况下,您只需在原始精灵上绘制另一个精灵。或者,您可以根据对象的状态在不同的精灵之间切换。
答案 2 :(得分:1)
我看到你用XNA标记了这个,所以假设这是你的API(虽然这个答案可以适用于任何具有适当调用的OpenGL / D3d方法)。如果你想以优雅的方式做到这一点,我建议使用一个临时的RenderState
。您将切换到新的RenderState并绘制原始背景纹理,然后在顶部绘制火山口精灵(您可以修改RenderState的AlphaSourceBlend
和AlphaDestinationBlend
属性以创建您要查找的减法效果)。
完成绘制后,您可以使用GetTexture()
函数轻松地将RenderState检索为纹理。
请记住,如果您要更改混合模式,您的SpriteBatch应该以“立即”模式执行(我忘记了XNA术语,但是它没有为了效率而对sprite进行排序),否则它将意外重置。
答案 3 :(得分:1)
答案 4 :(得分:0)
慢,但可能足够快。
public static void Fill(this Texture2D t, Func<int, int, Color> perPixel)
{
var data = new Color[t.Height * t.Width];
for (int y = 0; y < t.Height; y++)
for (int x = 0; x < t.Width; x++)
{
data[x + (y * t.Width)] = perPixel(x, y);
}
t.SetData(data);
}
答案 5 :(得分:0)
我在移动Java游戏,蠕虫/焦土克隆(实际上是基于GunBound)上做了类似的事情。
您不要“跳过”像素以留下陨石坑。您可以更改地球位图中的像素,因此陨石坑现在是地球永久的一部分。我假设您了解所有关于位图,blitting透明和命中测试。
为了创建一个陨石坑,我使用了圆形填充算法并用背景或透明颜色填充“爆炸区域”。
因此,在进行命中测试时,你必须做两次。对速度进行边界框命中测试,然后在边界框重叠时进行每像素命中测试。