Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示;“破碎的”;雪碧?_C#_Xna_Sprite - Fatal编程技术网

C# 显示;“破碎的”;雪碧?

C# 显示;“破碎的”;雪碧?,c#,xna,sprite,C#,Xna,Sprite,我对2D引擎的世界很陌生。我想出了如何加载图像并将其显示为精灵之类的东西,但有一个问题困扰着我。 例如,当一枚“火箭”击中一个物体时,它会对物体造成伤害,并留下一个弹坑。我想在那个物体上显示陨石坑。这需要在渲染时“跳过”该图像的一些像素,不是吗? 我的问题是,你会怎么做这样的事?您将使用什么数据结构来保存此文件?如何显示“损坏”的精灵?对于某些情况,您只需在原始精灵的顶部绘制另一个精灵即可。或者,可以根据对象的状态在不同的精灵之间切换 创建一个 这将包含所有的灵魂你的对象,在这种情况下,火箭。其

我对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排序以提高效率),否则它将意外重置。

查看此: