2D Tile System не работает должным образом - PullRequest
0 голосов
/ 09 сентября 2010

Я пытаюсь создать 2-D систему плиток, основанную на примере Snake.Оригинальный mTileGrid все еще там, но есть новый массив: mMapGrid.Смысл в том, чтобы копировать данные из mMapGrid в mTileGrid в каждом цикле обновления и, следовательно, имитировать область, большую, чем непосредственный экран.

Я написал больше функций, которые я сейчас кратко объясню ... После этогопроблема:

Установить плитку в сетке карты public void setMapTile (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 + "и TopLeftCorner.row равен "+ 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;
 }



}

}

Функция update () с вызовом здесь setMapTile ()

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 (): (без изменений по сравнению с исходным TileView в Snake, за исключением исключения проверки, если больше нуля, поскольку у нас есть плитка по умолчанию)

@ Переопределить 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);

        }
    }

}

Проблема заключается в том, что отображаемые плитки не располагаются равномерно и ведут себя не так, как должны.Они беспорядочно разбросаны по своему ряду.

1 Ответ

0 голосов
/ 09 сентября 2010

На первый взгляд, я бы сказал, что вы не должны увеличивать и countrow, и countcolumn в одном цикле for.Вот как я думаю, это должно выглядеть так:

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

Таким образом, функция циклически перебирает координаты в пространстве экрана, поэтому вам не нужны счетчик и счетчикбольше.Вместо этого TopLeftCorner добавляется, когда данные извлекаются из mMapGrid.Я предполагаю, что TopLeftCorner указывает, какая часть карты в данный момент отображается на экране.Убедитесь, что эти координаты остаются ограниченными, чтобы в mMapGrid не было доступа к индексам, которые на самом деле не существуют.

...