Возможно, вы захотите сделать это так, как это делали ранние устройства для видеоигр: хранить двумерный массив байтов, где каждый байт является индексом «плитки» размером 8x8 пикселей. В другом месте хранится массив плиток размером 8x8 пикселей. Также сохраняйте смещение в пикселях от левого верхнего угла карты до левого верхнего угла экрана.
Когда пришло время рисовать карту, визуализируйте только плитки, которые должны быть видны на экране, в соответствии со смещением в пикселях от угла карты к углу экрана:
int tile_x = pixel_x / tile_width;
int tile_y = pixel_y / tile_height;
for( int y=tile_y; y<=tile_y+screen_height_in_tiles; ++y )
{
for( int x=tile_x; x<=tile_x+screen_width_in_tiles; ++x )
{
int screen_x = tile_x * tile_width - ( pixel_x % tile_width );
int screen_y = tile_y * tile_height - ( pixel_y % tile_height );
render_tile( screen_x, screen_y, map[y][x] );
}
}
Этот код не является оптимально быстрым, и отсутствует некоторая логика, например, как работать с картой, которая частично прокручивается за пределы экрана. Но это только начало.