2010-09-09 3 views
0

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

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

Установите плитку в сетке карты общественных недействительный setMapTile (интермедиат TILEINDEX, внутр строка, столбец INT) { mMapGrid [строка] [столбец] = tileindex; }

Названный в OnDraw(), перемещает данные из mMapGrid к mTileGrid

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

Log.w ("PassNumbers", "TopLeftCorner.column является:" + TopLeftCorner.column + "и TopLeftCorner. строка «+ 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() называется здесь

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

@Override public void onDraw (Холст холста) { super.onDraw (холст);

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

     } 
    } 

} 

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

+0

скриншот проблемы: http://s997.photobucket.com/albums/af100/shinysky/mystuff/?action=view¤t=device.png – dragonwrenn

+0

LogCat экспорт: http://www.mediafire.com/?svigjmd6vgegb81 – dragonwrenn

+0

любая другая информация, необходимая и больная с удовольствием опубликует ее – dragonwrenn

ответ

0

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

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

Edit:

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 больше. Вместо этого TopLeftCorner добавляется, когда данные извлекаются из mMapGrid. Я предполагаю, что TopLeftCorner указывает, какая часть карты в настоящее время отображается на экране. Убедитесь, что эти координаты остаются ограниченными, поэтому нет доступа к индексам mMapGrid, которые фактически не существуют.

+0

Сделал то, что теперь отображает только верхнюю половину экрана с плитками – dragonwrenn

+0

см. http://s997.photobucket.com/albums/af100/shinysky/mystuff/?action=view¤t = device2.png – dragonwrenn

+0

любая идея, почему ее поведение так странно? – dragonwrenn