2013-08-24 30 views
3

我對xna相當陌生。我剛創建了一個透明背景(洋紅色)的精靈。問題是我的矩形正在讀取整個精靈的座標,而不是可見的座標。我如何讓它只讀取可見的精靈。XNA如何使xna不能讀透明顏色

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

我想讓我的可見部分在該位置不透明。提前致謝。

+0

有沒有簡單的方法,xna看到精靈作爲圖像框,無論是否可見或不。您可以手動調整偏移量。你爲什麼需要這個? –

+0

好吧,如果我有不規則形狀的人在那個矩形精靈中,我如何將這個人放置在0,0的位置不是整個精靈? – user2618465

+0

pinckerman回答你。在「spritebatch.Draw」中使用surceRectangle。當你有一個大的圖像與所有的精靈(精靈表)時使用。並且您必須手動設置sourceRectange座標以獲取該精靈。也會很好地設置「原點」,因爲默認是在0,0座標上,所以精靈將圍繞該角旋轉。 –

回答

2

您需要使用Paint等程序手動測量所需點的偏移量,然後在參數OriginDraw方法中設置該偏移量。
一個更好的主意是測量精靈的像素大小(沒有背景),並將其設置爲Draw方法中的sourceRectangle

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

SourceRectangle是空的,它的defalut值null,而在這種情況下,XNA將以此爲整機的質感,而你不需要這個。

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

雖然您可能需要更改原點,但如果要將船舶置於其中心

+0

這不是他要問的,改變這個值只會讓XNA畫出洋紅色的背景。 – pinckerman

+0

更改該值導致不繪製洋紅色背景,並且主題是「如何使xna不能讀取透明顏色」,即使如此我添加了定位部分解釋... – Blau

+0

是的,但他的問題的重點是「我想讓我的可見部分在這個位置不透明」,而不是洋紅色的透明度。 – pinckerman

1

使用像Magenta這樣的透明顏色編碼是非常過時的。現在我們在圖像中使用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; 
+0

+1引入alpha通道,絕對是需要的東西要進一步解釋。 – SD1990