2

タイルマップを正常に生成して動作しますが、スクロールしたいときにタイルの一番上の行が移動し、すべてのタイルが画面からドラッグされます.説明するのは難しいです.

これがタイルだと想像してください: X

XXXXXXXXXXXXXXXXXXXXXXXXXXX //カメラが動いているときにタイルごとに削除を開始します。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //他のすべてのタイルを私のラインの上に移動させます。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

私のコードを見てください:

public void Draw(SpriteBatch spriteBatch)
{
    currentLevel = level1;
    //Its here i need the value from Player class!
    int currentX = cameraX; //The current x cordiate to draw the tile too
    int currentY = 0; //The current y cordiate to draw the tile too
    for (int i = 0; i < currentLevel.Length; i++)
    {
        /*
         * A switch statement to see if the current level1[i] is either a grass, sky or stone tile
         */
        switch(currentLevel[i])
        {
            case 1:
                //Draw a sky tile
                spriteBatch.Draw(tileSheet, new Rectangle(currentX, currentY, 32, 32), skyTile, Color.White);
                break;

            case 2:
                //Draw a grass tile
                spriteBatch.Draw(tileSheet, new Rectangle(currentX, currentY, 32, 32), grassTile, Color.White);
                break;

            case 3:
                //Draw a stone tile
                spriteBatch.Draw(tileSheet, new Rectangle(currentX, currentY, 32, 32), stoneTile, Color.White);
                break;
        }

        //Add 32 to the current cordinate so we don't draw to the same spot all the time
        currentX = currentX + 32; 
        if (currentX >= 896) //If we hit the width of the map we want:
        {
            //Start drawing from X cordinate zero
            cameraX = 0;
            currentX = cameraX;
            //And Y cordinate + 32
            currentY = currentY + 32;
            //This will make so we draw one line and when we hit a full line on the map then we draw next line and soo on.
        }
    }
}

CameraX 変数は、Player クラスの getter です。キーボードの左ボタンを押している間、減少します。

配列から描画したタイル マップを次に示します (1 = 空、2 = 草、3 = 石:

int[] level1 = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3};

何か案は?

4

3 に答える 3

4

マップ全体で常にすべてのタイルを描画しているようです (i は 0 から始まり、すべてのタイルをループします)。ただし、各行に常に同じ数のタイルを描画しているわけではありません。CameraX が 0 の場合、32*28 (896) ピクセル後に次の行に移動するため、行ごとに 28 タイルを描画します。ただし、CameraX が 480 の場合、各行に 13 ((896-480)/32) タイルしか描画されず、最初の行の残りのタイルは 2 番目の行に描画されます (まだすべてのタイルを描画しようとしているため)。 )。マップ内のすべてのタイルをループして個別に位置を計算するのではなく、描画する各行と列をループして、それらからタイル インデックスを計算する必要があると思います。

編集 列数がわかっていると仮定して、列と行のインデックスを指定して、1 次元配列のタイル インデックスを計算するためのコード例を次に示します。(または、2 次元配列の使用に切り替えることもできます):

i = row * columnCount + column;
于 2011-12-06T16:44:39.390 に答える
1

あなたの問題は、行末に到達したときにをに設定することだと思いCameraXます0

各行の最後でカメラを移動するのではなく、x 描画位置をリセットするだけです (次の行で行うように)。

だから、削除cameraX = 0;

それがあなたが説明した問題を引き起こすかどうかは100%確信が持てませんが、プレイヤーがコントロールすると言うように、それは間違いなく正しくcameraXないので、描画機能で変更しないでください。

于 2011-12-06T16:40:11.340 に答える
1

あなたのコードはよくわかりませんが、2 次元配列を使用するか、1 次元配列に適切な方法でアクセスすることをお勧めしますarray[ Y * ARRAY_Width + X]。それに加えて、なぜレベル全体でループを開始するのですか。カメラの内部は重要です。そうしないと、とにかく表示されない多くのタイルを反復処理することになります。

カメラの X と Y から始めて、カメラ ビューポート内に描画する水平および垂直のタイルの数を計算します。反復する必要があるのはこれらのタイルだけです。また、タイルを移動しているようにも見えます。動かしたいのはタイルではなく、カメラです。SpriteBatch.Beginカメラの動きを含む Matrix を設定するためのオーバーロードがあります。マトリックスの操作方法がわからない場合は、電話してください

Matrix view = Matrix.CreateTranslate(new Vector3( myCam.X, myCam.Y, 0));

それをビュー マトリックスとして BeginSprite メソッドに渡します。

これらの変更により、コードがはるかに簡単になります。

それが役立つことを願っています。

于 2011-12-06T16:43:36.290 に答える