2012-07-03 20 views
7

因此,我正在製作基於平鋪的遊戲,並且我想爲這些貼磚添加一些假陰影。這是有點難以解釋,所以我會用圖片做:我如何有效地製作假瓷磚陰影?

比方說,這是我的瓷磚世界:

world

而且我希望它有一個像這樣的陰影:

shadows

因爲世界是基於瓦,我可以將所有的陰影部分拆分成獨立的圖像:

parts

但現在我不知道如何將它帶入代碼。其實,我確實有想法,但它們令人難以置信,而且它們不能以最佳方式工作。

我已經嘗試了大量的if語句...

bool ul = adjacentBlocks[0, 0] == Block.Type.Rock; //Upper Left 
bool um = adjacentBlocks[1, 0] == Block.Type.Rock; //Upper Middle 
bool ur = adjacentBlocks[2, 0] == Block.Type.Rock; //Upper Right 

bool ml = adjacentBlocks[0, 1] == Block.Type.Rock; //Center Left 
//bool cm = adjacentBlocks[1, 1] == Block.Type.Rock; //CURRENT BLOCK - NOT NEEDED 
bool mr = adjacentBlocks[2, 1] == Block.Type.Rock; //Center Right 

bool ll = adjacentBlocks[0, 2] == Block.Type.Rock; //Lower Left 
bool lm = adjacentBlocks[1, 2] == Block.Type.Rock; //Lower Middle 
bool lr = adjacentBlocks[2, 2] == Block.Type.Rock; //Lower Right 

if (ml) { texture = "Horizontal"; flipX = false; flipY = false; } 
if (mr) { texture = "Horizontal"; flipX = true; flipY = false; } 
if (um) { texture = "Vertical"; flipX = false; flipY = false; } 
if (lm) { texture = "Vertical"; flipX = false; flipY = true; } 
if (ml && ul && um) texture = "HorizontalVertical"; 
//More if statements I can't be bothered to write 
if (ul && um && ur && ml && mr && ll && lm & lr) texture = "Full"; 

和龐大的查找表...

var table = new List<TextureBlockLayout> 
             { 
              new TextureBlockLayout("Horizontal", false, false, new[,] 
                         { 
                          { true, true, false }, 
                          { true, true, false }, 
                          { true, true, false } 
                         }), 
              new TextureBlockLayout("Horizontal", true, false, new[,] 
                         { 
                          { false, true, true }, 
                          { false, true, true }, 
                          { false, true, true } 
                         }), 
              new TextureBlockLayout("Full", false, false, new[,] 
                         { 
                          { true, true, true }, 
                          { true, true, true }, 
                          { true, true, true } 
                         }) 
             }; 

但無論我做錯事或者他們只是拒絕一起工作。有任何想法嗎?

+0

你說的「他們拒絕在所有的工作」是什麼意思? – millimoose

+0

基本上他們給完全錯誤的陰影紋理。 – Dlaor

+0

好的,但由於您沒有列出任何繪圖代碼,「完全錯誤」並沒有多大幫助。 – millimoose

回答

3

每個瓷磚有八個鄰居。每個鄰居有兩種可能的狀態。將鄰居的狀態映射爲一個字節的位,並將該字節用作256元素查找表中的索引。

是的,這是「蠻力」解決方案,您可以使用一些更聰明的方法使用更小的表格。但是256個元素並沒有那麼多(你可以很容易地從數據文件中加載它),而且這種方法的好處在於它是完全一般的—如果你願意的話,你可以讓所有256個tile看起來微妙不同。


OK,考慮在你的例子瓷磚陰影的方式仔細一看,它看起來像你真的只需要四位(因此16單元表):

  1. 設置此位如果北部,西部和西北部的鄰居都是綠色的。
  2. 如果北,東和東北鄰居都是綠色,請設置此位。
  3. 如果南,西和西南鄰居都是綠色,請設置此位。
  4. 如果南,東和東南鄰居都是綠色,請設置此位。

即使這些16個瓷磚中的一些仍然是彼此的旋轉/鏡像版本,但可能最容易將方向存儲在瓷磚索引旁邊的表格中,而不是試圖在代碼中進行計算。

0

我會嘗試這樣的事:

struct surroundingTiles 
{ 
    static bool blockNE; 
    static bool blockN; 
    static bool blockNW; 
    static bool blockW; 
    static bool blockSW; 
    static bool blockS; 
    static bool blockSE; 
    static bool blockE; 
} 
foreach(object tile in floor) 
{ 
    if(currentTile.surroundingTiles.blockW && currentTile.surroundingTiles.blockNW && currentTile.surroundingTiles.blockN) 
     useTexture(currentTile, shadowSEtexture); 
} 
+0

如果陰影應該在牆上,那麼可以將foreach視爲(牆上的對象塊) – impyre