2012-07-03 35 views
7

Vì vậy, tôi đang làm một trò chơi dựa trên gạch và tôi muốn thêm một số bóng giả vào gạch. Nó kinda khó để giải thích vì vậy tôi sẽ làm điều đó với hình ảnh:Làm thế nào tôi có thể tạo hiệu ứng đổ bóng giả?

Hãy nói rằng đây là gạch thế giới của tôi:

world

Và tôi muốn nó có bóng tối như thế này:

shadows

Vì thế giới dựa trên nền, tôi có thể chia tất cả các phần bóng thành hình ảnh riêng biệt:

parts

Nhưng bây giờ tôi không biết làm cách nào để đưa mã này vào. Vâng, thực sự tôi có những ý tưởng, nhưng họ không thể tin được tẻ nhạt và họ không làm việc tối ưu.

Tôi đã thử một đồ sộ nếu-tuyên bố ...

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"; 

Và một bảng tra cứu đồ sộ ...

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 } 
                         }) 
             }; 

Nhưng hoặc là tôi đang làm gì đó sai hoặc họ chỉ từ chối làm việc chút nào. Ý tưởng nào?

+0

Ý anh là gì bởi "họ từ chối việc ở tất cả"? – millimoose

+0

Về cơ bản, chúng tạo ra kết cấu bóng hoàn toàn sai. – Dlaor

+0

Được rồi, nhưng vì bạn chưa liệt kê bất kỳ mã vẽ nào, "hoàn toàn sai" không giúp được gì nhiều. – millimoose

Trả lời

3

Mỗi ô có tám hàng xóm. Mỗi người hàng xóm có hai trạng thái có thể. Ánh xạ trạng thái của các hàng xóm thành các bit theo một byte và sử dụng byte làm chỉ mục vào bảng tra cứu 256 phần tử.

Có, đây là giải pháp "sức mạnh vũ phu" và bạn có thể có được bằng một bảng nhỏ hơn nhiều bằng cách sử dụng một số cách tiếp cận thông minh hơn. Nhưng 256 yếu tố không phải là nhiều (bạn có thể dễ dàng tải nó từ một tập tin dữ liệu), và điều tốt đẹp về cách tiếp cận này là nó hoàn toàn chung chung — bạn có thể có tất cả 256 gạch nhìn tinh tế khác nhau nếu bạn muốn.


OK, lấy một cái nhìn sâu hơn về cách gạch ví dụ của bạn được bóng mờ, có vẻ như bạn thực sự chỉ cần bốn bit (và do đó một bảng 16 phần tử):

  1. Đặt bit này nếu các nước láng giềng phía bắc, tây và tây bắc đều xanh.
  2. Đặt bit này nếu hàng xóm phía bắc, đông và đông bắc đều có màu xanh lục.
  3. Đặt bit này nếu hàng xóm phía nam, tây và tây nam đều có màu xanh lá cây.
  4. Đặt bit này nếu các hàng xóm phía nam, phía đông và đông nam đều có màu xanh lục.

Thậm chí một số trong số 16 ô này vẫn được xoay/nhân đôi phiên bản của nhau, nhưng có thể dễ dàng nhất để lưu trữ hướng trong bảng cùng với chỉ mục lát thay vì cố gắng tính toán nó trong mã.

0

tôi sẽ cố gắng một cái gì đó như thế này:

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

Nếu bóng được cho là nằm trong tường, bạn có thể nhìn vào foreach như (khối đối tượng trong tường) – impyre

Các vấn đề liên quan