2012-06-02 36 views
0

我正在嘗試加載並掃描帶有XNA C#的Texture2D PNG圖像文件,以便在基於2D瓦片的遊戲中加載世界,我可以使用繪圖程序輕鬆創建該遊戲。我不知道如何去實際掃描和評估每像素的圖像。我需要掃描圖像文件的像素並獲取像素的RGB顏色值。然後我將加載世界,假定每個像素等於一個圖塊,並且圖塊的類型由所述像素的RGB顏色值確定。如何使用圖像文件在2D遊戲中加載世界/關卡?

我該如何去加載一個圖像作爲保存世界文件,並在每個像素的基礎上評估圖像?

+0

看看這個鏈接:http://stackoverflow.com/questions/190385/how-to-manipulate-images-at-pixel-level-in-c – user1431765

+0

非常感謝!我沒有想過要尋找更像這樣的東西。 – ColinBurke

回答

1

你爲什麼不使用更簡單的東西,我不知道嗎?

大多數情況下,您擁有關卡數據,該數據映射至少2-3項。

  1. 水平圖像(整體水平作爲一個整體,或地形設置)
  2. 磚的列表,在X,Y時尚或正交的方式通過文本文件與某種分隔符的畫,說逗號
  3. 用於繪製地圖

所以磚的每個位置屬性的列表,你的形象就會有一堆磚,我們會從1數到20,讓我們說

然後你的李瓷磚的ST(2號)會去像這樣:

5, 6, 10, 12, 15 
4, 8, 2, 2, 10 
5, 9, 12, 15, 20 

然後你可以從性能負載(3號)如下(其中0,是適合步行,1例不適合步行)

0, 1, 1, 1 ,1 
0, 0, 0, 0, 0 
1, 1, 1, 1, 1 

這會產生一個走廊,例如你可以走路。您可以使用無限量的數字來表示您可以想到的任何屬性。

從那裏,您知道源圖集的哪些部分可以繪製哪裏以及它們的碰撞屬性。這將比在圖像文件中存儲這些屬性節省更多的內存。通過SQL,文本文件,XML,二進制文件,任何東西,加載屬性,繪製的地方等都可以以任何你喜歡的方式存儲。

你甚至可以放棄tileset部分,只是使用一個巨大的圖像繪製到屏幕上,並繼續使用屬性文本文件來存儲碰撞和其他瓷磚屬性數據,如在圖像上的不可見屬性網格。

這比RGB數據解析要簡單得多。想知道爲什麼當人們使用更簡單的結構多年建造這樣的2D遊戲時,爲什麼要用圖像和RGB值做所有這些?

這是一種油漆和創造水平發電機?

+0

尼克是正確的。你的瓷磚地圖通常需要更多的信息,而不僅僅是瓷磚參考。比如碰撞圖和其他有關物品的分層信息等。您應該考慮更好的級別存儲機制。 – Ani

0

在基於XNA遊戲你能做到這樣....

Texture2D level = Content.Load<Texture2D>("level01"); 

    Color[] data = new Color[level.Width * level.Height]; 

    level.GetData(data); 

    for (int y=0; y<level.Height; y++) 
    for (int x=0; x<level.Width; x++) 
    { 
     int index = x + y * level.Width; 

     Color tile_data = data[index]; 

     int tile_type = tile_data.R; 
     int tile_aux_info1 = tile_data.G; 
     ... 
     CreateTile(x,y,tile_type,...)  
    }