0

Snakeの例に大きく基づいて2Dタイルシステムを作成しようとしています。元のmTileGridはまだありますが、新しい配列mMapGridがあります。重要なのは、更新サイクルごとにmMapGridからmTileGridにデータをコピーすることです。したがって、直接の画面よりも広い領域をシミュレートします。

さらに関数を作成しましたが、これについて簡単に説明します...その後、問題は次のとおりです。

マップグリッドにタイルを設定しますpublicvoidsetMapTile(int tileindex、int row、int column){mMapGrid [row] [column] = tileindex; }

onDraw()で呼び出され、データをmMapGridからmTileGridに移動します

private void CopyArrayData()
{
 //TODO: TAG
 int countrow, countcolumn;
 countrow = 0;
 countcolumn = 0;

Log.w( "PassNumbers"、 "TopLeftCorner.column is:" + TopLeftCorner.column + "and TopLeftCorner.row is" + TopLeftCorner.row);

 for(int x = TopLeftCorner.column; x <= mXTileCount; x++)
 {
  for(int y = TopLeftCorner.row; y <= mYTileCount; y++)
  {
   countrow++;
   countcolumn++;


   if(countrow == mXTileCount)
   {
    countrow = 0;
   }
   if(countcolumn == mYTileCount)
   {
    countcolumn = 0;
   }




   int set = mMapGrid[y + TopLeftCorner.row][x + TopLeftCorner.column];
   if(set == SnakeView.GRASS)
   {
    setTile(set, countrow, countcolumn);
   }
   else
   {
    setTile(SnakeView.ROCK, countrow, countcolumn);
   }


   if(pass1 == false)
   {
    Log.w("TileGridAccess",("TileGrid Access: row" + countrow + " column" + countcolumn));
    Log.w("MapGridAccess","MapGrid Access: row" + (y + TopLeftCorner.row) + " column:" + (x + TopLeftCorner.column));
   }

  }

  pass1 = true;
 }



}

}

ここで呼び出されるsetMapTile()を使用したupdate()関数

public void update() {
    if (mMode == RUNNING) {


            clearTiles();


            setMapTile(GRASS, 5, 5);
            setMapTile(GRASS, 5, 6);
            setMapTile(GRASS, 5, 7);
            setMapTile(GRASS, 5, 8);
            setMapTile(GRASS, 5, 9);



        mRedrawHandler.sleep(mMoveDelay);
    }

}

onDraw()関数:(デフォルトのタイルがあるため、ゼロより大きい場合のチェックが削除されていることを除いて、Snakeの元のTileViewから変更されていません)

@Override public void onDraw(Canvas canvas){super.onDraw(canvas);

    CopyArrayData();

    for (int x = 0; x < mXTileCount; x += 1) {
        for (int y = 0; y < mYTileCount; y += 1) {
                canvas.drawBitmap(mTileArray[mTileGrid[x][y]], 
                  mXOffset + x * mTileSize,
                  mYOffset + y * mTileSize,
                  mPaint);

        }
    }

}

問題は、表示されるタイルが等間隔に配置されておらず、正常に動作しないことです。彼らは彼らの列の周りに無計画に散らばっています。

4

1 に答える 1

0

一見すると、同じ for ループで countrow と countcolumn の両方をインクリメントするべきではないと思います。これは私がそれがどのように見えるべきだと思うかです:

for(int x = TopLeftCorner.column; x <= mXTileCount; x++)
 {
  countcolumn++;
  for(int y = TopLeftCorner.row; y <= mYTileCount; y++)
  {
   countrow++;
  ...

編集:

for(int x = 0; x <= mXTileCount; x++)
 {
  for(int y = 0; y <= mYTileCount; y++)
  {

   int set = mMapGrid[y + TopLeftCorner.row][x + TopLeftCorner.column];
   if(set == SnakeView.GRASS)
   {
    setTile(set, y, x);
   }
   else
   {
    setTile(SnakeView.ROCK, y, x);
   }
   ...

このように、関数は画面空間の座標をループするので、countrow と countcolumn はもう必要ありません。代わりに、データが mMapGrid から取得されるときに TopLeftCorner が追加されます。TopLeftCorner は、マップのどの部分が現在画面に表示されているかを指定していると思います。実際には存在しない mMapGrid のインデックスにアクセスできないように、これらの座標が制限されたままであることを確認してください。

于 2010-09-09T03:18:19.600 に答える