XNA如何使xna不读取透明色

时间:2013-08-24 09:19:16

标签: c# xna xna-4.0

我对xna很新。我刚刚创建了一个透明背景(品红色)的精灵。问题是我的Rectangle正在读取整个精灵的坐标而不是可见的精灵。如何使它只读取可见的精灵。

myrectangle = new Rectangle(0, 0, box.Width, box.Height);

我想将可见部分放在那个位置不透明。提前致谢。

4 个答案:

答案 0 :(得分:6)

要将颜色转换为透明,请转到纹理属性,内容处理器和启用颜色键,然后将颜色键设置为洋红色。

enter image description here

然后,要将精灵定位在您想要的位置,您需要设置正确的原点。

要将船舶中心设置在所需位置,需要设置原点,如下所示: enter image description here

所以当你绘制它时,你需要做类似的事情:

 var origin = new Vector2(40,40);
 spritebatch.Draw(shipTexture, shipPosition, null, Color, origin, ...)

您也可以更改纹理矩形源:

 var texSource = new Rectangle( 25,25, 30,30);
 spritebatch.Draw(shipTexture, shipPosition, texSource, Color)

enter image description here

如果您想将船舶定位在其中心位置,可能需要更改原点

答案 1 :(得分:2)

您需要使用Paint等程序手动测量所需点的偏移量,然后在Origin方法的参数Draw中设置该偏移量。
一个更好的想法是测量精灵的像素大小(没有背景),并将其设置为sourceRectangle方法中的Draw

spritebatch.Draw(textureToDraw, Position, sourceRectangle, Color.White)

SourceRectangle可以为空,其defalut值为null,在这种情况下,XNA将绘制整个纹理,而您不需要它。

答案 2 :(得分:1)

使用像Magenta这样的透明色编码非常老套。现在我们在图像中使用alpha来实现这一点。

我想你做你想做的唯一真正的方法是搜索颜色数据以找到具有alpha>的最小和最大x和y坐标。 0,或!= Color.Magenta在你的情况下。

Texture2D sprite = Content.Load<Texture2D>(.....);
int width = sprite.Width;
int height = sprite.Height;
Rectangle sourceRectangle = new Rectangle(int.Max, int.Max, 0, 0);
Color[] data = new Color[width*height];
sprite.GetData<Color>(data);
int maxX = 0;
int maxY = 0;

for (int y = 0; y < height; y++)
{
    for (int x = 0; x < width; x++)
    {    
        int index = width * y + x;

        if (data[index] != Color.Magenta)
        {

            if (x < sourceRectangle.X)
                sourceRectangle.X = x;
            else if (x > maxX)
                maxX = x;

            if (y < sourceRectangle.Y)
                sourceRectangle.Y = y;
            else if (y > maxY)
                maxY = y;        
        }
    }
}

sourceRectangle.Width = maxX - sourceRectangle.X;
sourceRectangle.Height = maxY - sourceRectange.Y;

答案 3 :(得分:0)

我在VB.Net中使用作弊方法,我认为您可以使用C#进行工作:

    Private Function MakeTexture(ByVal b As Bitmap) As Texture2D
        Using MemoryStream As New MemoryStream
            b.Save(MemoryStream, System.Drawing.Imaging.ImageFormat.Png)
            Return Texture2D.FromStream(XNAGraphics.GraphicsDevice, MemoryStream)
        End Using
    End Function

只要您的位图加载了透明颜色,它就可以很流畅地工作。