C# 显示;“破碎的”;雪碧?
我对2D引擎的世界很陌生。我想出了如何加载图像并将其显示为精灵之类的东西,但有一个问题困扰着我。 例如,当一枚“火箭”击中一个物体时,它会对物体造成伤害,并留下一个弹坑。我想在那个物体上显示陨石坑。这需要在渲染时“跳过”该图像的一些像素,不是吗?C# 显示;“破碎的”;雪碧?,c#,xna,sprite,C#,Xna,Sprite,我对2D引擎的世界很陌生。我想出了如何加载图像并将其显示为精灵之类的东西,但有一个问题困扰着我。 例如,当一枚“火箭”击中一个物体时,它会对物体造成伤害,并留下一个弹坑。我想在那个物体上显示陨石坑。这需要在渲染时“跳过”该图像的一些像素,不是吗? 我的问题是,你会怎么做这样的事?您将使用什么数据结构来保存此文件?如何显示“损坏”的精灵?对于某些情况,您只需在原始精灵的顶部绘制另一个精灵即可。或者,可以根据对象的状态在不同的精灵之间切换 创建一个 这将包含所有的灵魂你的对象,在这种情况下,火箭。其
我的问题是,你会怎么做这样的事?您将使用什么数据结构来保存此文件?如何显示“损坏”的精灵?对于某些情况,您只需在原始精灵的顶部绘制另一个精灵即可。或者,可以根据对象的状态在不同的精灵之间切换 创建一个 这将包含所有的灵魂你的对象,在这种情况下,火箭。其中一些图像可能是火箭粉碎成许多碎片、起火等
然后,当对象命中时,播放碰撞动画。你的方法从技术上讲是可行的,但这太过分了。使用“精灵”工作表很简单,您只需绘制工作表的一部分,并在工作表的X轴和Y轴上播放动画增量,而无需绘制大量图像。这自然要求床单的布局均匀,但工作量不大。缓慢,但可能足够快
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);
}
公共静态空白填充(此纹理2d t,每像素函数)
{
var数据=新颜色[t.高度*t.宽度];
对于(int y=0;y
我在一款移动Java游戏中制作了类似的东西,蠕虫/焦土克隆(实际上是基于枪战)
你不会为了留下陨石坑而“跳过”像素。你改变了行星位图中的像素,所以陨石坑现在是行星的永久部分。我想你知道所有关于位图、光点透明和点击测试的知识
为了创建一个陨石坑,我使用了圆形填充算法,并用背景色或透明色填充“爆炸区域”
所以在进行命中测试时,你必须做两次。速度的边界框命中测试,然后是边界框重叠时的每像素命中测试。我看到您已经用XNA标记了这一点,所以假设这是您的API(尽管这个答案可以通过适当的调用很好地应用于任何OpenGL/D3d方法)。如果您希望以优雅的方式执行此操作,我建议使用临时的
RenderState
。您可以切换到新的渲染状态并绘制原始背景纹理,然后在顶部绘制环形山精灵(您可以修改渲染状态的AlphaSourceBlend
和AlphaDestinationBlend
属性,以创建所需的减法效果)
完成绘制后,可以使用GetTexture()
函数轻松地将渲染状态检索为纹理
请记住,如果要更改混合模式,SpriteBatch应在“立即”模式下运行(我忘记了XNA术语,但它不进行Sprite排序以提高效率),否则它将意外重置。查看此: