Если ваш массив имеет одно измерение, вы можете отобразить координаты x и y на индекс массива так же, как вы делаете пиксели в буфере vga.
offset = y * buffer_width + x
Если ширина плитки вашей карты равна 100 плиткам, и вы хотите получить плитку 5,5, то 5 * 100 + 5 = индекс массива 505 будет соответствующей плиткой в одномерном массиве.
Вы можете использовать это для объединения видимой области на экране. Например, видимые плитки размером 10x10: начните со смещения и возьмите следующие 10 элементов, добавьте buffer_width для удаления строки и добавьте следующие 10, и так далее, пока у вас не будет всех 10 строк для видимой области 10x10.
Вот пример меньшего набора плиток с шириной буфера плиток 5 и выбора видимой области 3x3:
buffer = ['0,0', '1,0', '2,0', '3,0', '4,0',
'0,1', '1,1', '2,1', '3,1', '4,1',
'0,2', '1,2', '2,2', '3,2', '4,2',
'0,3', '1,3', '2,3', '3,3', '4,3',
'0,4', '1,4', '2,4', '3,4', '4,4']
buffer_width = 5
buffer_height = 5
# now lets say we want to grab a 3x3 slice from right
# in the middle of the array from 1,1->3,3
x1,y1 = 1,1
x2,y2 = 3,3
view_width = x2 - x1
view_height = y2 - y1
(0..view_height).each do |row|
offset = (y1 + row) * buffer_width + x1
puts buffer[offset..offset+view_width].inspect
end
Наш результат будет следующим:
["1,1", "2,1", "3,1"]
["1,2", "2,2", "3,2"]
["1,3", "2,3", "3,3"]
Который вы можете связать вместе в новом одномерном или многомерном, который вы когда-либо посчитаете нужным.
Надеюсь, это поможет.