我对xna相当陌生。我刚刚创建了一个具有透明背景(洋红色)的精灵。问题是我的矩形正在读取整个精灵的坐标而不是可见的。如何让它只读可见的精灵。
myrectangle = new Rectangle(0, 0, box.Width, box.Height);
我想在那个位置放置我的可见部分不透明。提前致谢。
要将颜色转换为透明,请转到纹理属性、内容处理器并启用颜色键,并将颜色键设置为洋红色。
然后要将精灵定位在您想要的位置,您需要设置正确的原点。
要将船中心设置在所需位置,需要设置原点,如下所示:
所以当你绘制它时,你需要做类似的事情:
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)
尽管如果要将船定位在其中心,则可能需要更改原点
您需要使用诸如 Paint 之类的程序手动测量所需点的偏移量,然后在方法的参数Origin
中设置该偏移量Draw
。
一个更好的主意是测量精灵的像素大小(没有背景)并将其设置为方法sourceRectangle
中的Draw
。
spritebatch.Draw(textureToDraw, Position, sourceRectangle, Color.White)
SourceRectangle
是可空的,它的默认值为null
,在这种情况下,XNA 将绘制整个纹理,而您不需要它。
使用像洋红色这样的透明颜色编码非常过时。现在我们使用图像中的 alpha 来实现这一点。
我想做你想做的事情的唯一真正方法是搜索颜色数据以找到最小和最大的 x 和 y 坐标,它们的 alpha > 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;
我在 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
只要您的位图加载了透明颜色,就可以顺利进行。