我对xna很新。我刚刚创建了一个透明背景(品红色)的精灵。问题是我的Rectangle正在读取整个精灵的坐标而不是可见的精灵。如何使它只读取可见的精灵。
myrectangle = new Rectangle(0, 0, box.Width, box.Height);
我想将可见部分放在那个位置不透明。提前致谢。
答案 0 :(得分:6)
要将颜色转换为透明,请转到纹理属性,内容处理器和启用颜色键,然后将颜色键设置为洋红色。
然后,要将精灵定位在您想要的位置,您需要设置正确的原点。
要将船舶中心设置在所需位置,需要设置原点,如下所示:
所以当你绘制它时,你需要做类似的事情:
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)
如果您想将船舶定位在其中心位置,可能需要更改原点
答案 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
只要您的位图加载了透明颜色,它就可以很流畅地工作。