2013-05-11 145 views
0

我正嘗試在每個像素碰撞中與我的XNA遊戲中的spritesheets進行整合。我主要是基於this,但它不適合我。Texture2D.GetData「索引超出範圍」

以下是我在從spritesheet左上角的sprite獲取數據的過程。它似乎工作正常 - 至少沒有錯誤。

Rectangle SpriteSource = new Rectangle(0, 0, 32, 32); 
ColorData = new Color[SpriteSource.Width * SpriteSource.Height]; 
Owner.Spritesheet.GetData(0, SpriteSource, ColorData, SpriteSource.X * SpriteSource.Y, 
SpriteSource.Width * SpriteSource.Height); 

我們得到一個精靈,這不是在左上角:

Rectangle SpriteSource = new Rectangle(48, 32, 16, 32); 
ColorData = new Color[SpriteSource.Width * SpriteSource.Height]; 
Owner.Spritesheet.GetData(0, SpriteSource, ColorData, SpriteSource.X * SpriteSource.Y, 
SpriteSource.Width * SpriteSource.Height); 

完全相同的代碼,除了由(48,32)抵消的矩形。但由於某些原因,它會拋出異常「此參數必須是數組中的有效索引。」 參數名稱:dataIndex「

我在做什麼錯?在這種情況下,dataIndex指的是什麼 - ColorData數組或實際的Texture2D?另外,如果我沒有做任何特殊的「mipmapping」 - 不完全確定那是什麼,但我有一個粗略的想法 - 我將使用0作爲mipmapping級別,對吧?

編輯:一些更多的信息(SS = SpriteSource,O.Tex = Owner.Spritesheet):

只要SS.X <= O.Tex.Width - SS.WidthSS.Y == 0,代碼編譯/運行正常。 如果SS.X > O.Tex - SS.Width,它會產生一個完全預期的「矩形對於此資源來說太大或太小」的錯誤。 用於更改Y並將X保持爲零。

但是,如果滿足以下條件:SS.X > 0 && SS.Y > 0 && (SS.X * SS.Y) < (SS.Width * SS.Height),同樣令人沮喪但不同的錯誤「此參數必須是數組中的有效索引。參數名稱:elementCount」被生成。

EDIT2:似乎我對elementCount錯誤略有誤解,它可以在SS.X * SS.Y > SS.Width * SS.Height的條件下生成。我很高興至少這樣一個愚蠢的條件不是問題的一部分。

+0

一個像素碰撞提示,檢查第一個箱體碰撞,然後像素碰撞。但最終我會刪除像素collsion,因爲當你有很多對象時它確實滯後。現在我只用盒子和圓圈碰撞。 – 2013-05-11 09:23:12

回答

1

我不是XNA程序員,但如果Spritesheet是Texture2D我相信我知道你爲什麼有問題。 讓我們來仔細看看參數:

  • INT水平 - MIPMAP級
  • 可空 - 的 紋理複製的部分。 指示數據將從 整個紋理複製
  • T []數據 - 數據的陣列詮釋
  • 的startIndex - 第一個元素的索引以獲得
  • INT elementCount中 - 元素Numnber得到

由於您將SpriteSource作爲第二個參數傳遞,因此您已經選擇了紋理的子部分。第四個參數是作爲第二個參數傳入的矩形(SpriteSource)的起始索引!

在第一種情況下,一切都按預期工作,因爲您有效地傳入0作爲GetData的第四個參數(SpriteSource.X和SpriteSource.Y都爲0,並且0 * 0 = 0)。第二種情況失敗,因爲你說起始索引應該是1024,這大於SpriteSource的大小(16 * 32 = 512)。如果你傳入0作爲第四個參數,它將起作用,因爲它意味着「從SourceSprite中的索引0開始」。

因此,如果SourceSprite始終是您想要的spritesheet中的精靈的矩形,請以startIndex的形式傳入0,然後您將得到您之後的精靈。

我認爲...

+0

你完全正確。事情是,在我鏈接的線程中,這個人爲他所有不同的精靈使用一個ColorData數組,這就是爲什麼它不適合我。我現在已經掌握了所有的工作。雖然我不明白爲什麼startIndex參數的描述是「要獲取的第一個元素的索引」 - 不應該設置它?無論哪種方式,非常感謝您花時間幫助我。 – 2013-05-11 07:12:20

+0

@ 7heSama 很高興聽到我說得對。至於「get」與「set」,你從源頭獲取元素(第二個參數)並將其複製到目標中(第三個參數)。 – user1323245 2013-05-11 07:48:09