7

タイル ベースのゲームを作成していて、タイルに偽の影を追加したいと考えています。説明が難しいので、写真で説明します。

これが私のタイルの世界だとしましょう:

世界

そして、私はそれがこのような影を持っていることを望みます:

影

世界はタイル ベースであるため、すべての影の部分を個別の画像に分割できます。

部品

しかし、これをどのようにコードに組み込むかはわかりません。実際、私にはアイデアがありますが、それらは信じられないほど退屈で、最適に機能しません。

大規模な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 }
                                                                                         })
                                        };

しかし、私が何か間違ったことをしているのか、彼らはまったく仕事を拒否しているだけなのか. 何か案は?

4

2 に答える 2

3

各タイルには 8 つの隣接タイルがあります。各ネイバーには 2 つの可能な状態があります。近隣の状態をバイト内のビットにマップし、そのバイトを 256 要素のルックアップ テーブルへのインデックスとして使用します。

はい、これは「ブルートフォース」ソリューションであり、より賢いアプローチを使用して、はるかに小さなテーブルでうまくいく可能性があります。しかし、256 個の要素はそれほど多くはありません (データ ファイルから簡単にロードできます)。このアプローチの優れている点は、完全に一般的であることです。必要に応じて、256 個のタイルすべてを微妙に異なる外観にすることができます。


OK、例のタイルがシェーディングされる方法を詳しく見てみると、実際には 4 ビット (つまり 16 要素のテーブル) しか必要ないように見えます。

  1. 北、西、北西の隣人がすべて緑色の場合、このビットを設定します。
  2. 北、東、北東の隣人がすべて緑色の場合、このビットを設定します。
  3. 南、西、南西の隣人がすべて緑色の場合、このビットを設定します。
  4. 南、東、南東の隣人がすべて緑色の場合、このビットを設定します。

これらの 16 個のタイルの一部でさえ、相互に回転/ミラー バージョンになっていますが、コードで方向を計算するよりも、方向をタイル インデックスと共にテーブルに格納する方が簡単な場合があります。

于 2012-07-03T23:17:25.930 に答える
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);
}
于 2012-07-03T23:28:30.097 に答える