2013-08-13 4 views
3

Я начинающий пользователь Lua, я пытаюсь создать что-то в Lua, используя библиотеки Love2D.Использование таблиц Lua в качестве двумерных массивов

В функции загрузки я создаю таблицу и загружаю ее с элементами (которые являются числами) для использования позже в качестве многомерного массива.

function love.load() 

    Maximum_X = 32  
    Maximum_Y = 16 

    Start_X = 64 
    Start_Y = 32 

    MapTable = {}       -- empty table 

    for i=1,Maximum_X*Maximum_Y do   -- uploading table 
     table.insert(MapTable, 2) 
    end 


end 

Затем я создаю функцию, которая вносит изменения в таблицу. Поскольку я просто экспериментирую с таблицами, есть только одно измененное значение. По крайней мере, подумал я.

function KatamoriGen() 

    MapTable[4] = 3  

end 


function love.update(dt) 

KatamoriGen() 

end 

После этого я печатаю элементы таблицы в матрице с 32 столбцами и 16 строками. Я вижу здесь, что изменяется не только 4-й элемент 1-го ряда, но и 2-й элемент 2-го ряда, а 1-й элемент 4-го ряда становится 3.

Это, очевидно, означает, что Table[posX*posY] не работает ни с момента умножение число, например 4 и операция будет меняться каждые элементы, где

X coordinate + Y coordinate = posX*posY

является истинным. В примере кода правая часть этого уравнения была равна 4.

Небольшой вопрос: почему это происходит?

Главный вопрос: как я могу точно идентифицировать элементы MapTable? Как я могу реализовать размеры X и Y для таблиц Lua? использовать их в качестве двумерных массивов? Может быть, таблица столов?

EDIT: это функция рисования:

function love.draw()  

for j=1,16 do 
    for i=1,32 do 
    love.graphics.draw(Tileset[MapTable[j*Maximum_X + i]], Start_X + 32*(i-1), Start_Y + 32*(j-1)) 
    end 
end 

end 

Теперь для меня ясно, что это неправильно и право правило MapTable[j*Maximum_X + i], но я получаю сообщение об ошибке для этого: «ожидаемый тип параметра: ожидается, пользовательские данные»

+0

Не могли бы вы отправить весь свой код, пожалуйста? В частности, бит, в котором выполняется печать. В его нынешнем виде функции загрузки и обновления будут работать так, как вы ожидаете, например, просто обновляя одно значение (хотя оно будет повторяться в цикле обновления) – Alex

+0

Кажется, что я напортачил. В следующем примере: 'function love.draw()', то есть петля в другом цикле, чтобы создать матрицу, и это тело самого замкнутого цикла: 'love.graphics.print (MapTable [i * j], Start_X + 32 * (i-1), Start_Y + 32 * (j-1)) ' И« конец »после этого, из. Теперь мне ясно, что это неправильно, и правильное правило - «MapTable [j * Maximum_X + i]», но я получаю для него ошибку: «ожидаемый тип параметра: ожидаемый пользовательский указатель» Чтобы быть понятным, он также размещен в ОП. –

+1

Попробуйте MapTable [(j-1) * Maximum_X + i].Таким образом, он начинается с индекса 1, а не Maximum_X + 1 – Alex

ответ

3

Вы также можете использовать многодисковые таблицы. Что-то вроде:

local MapTable = {} 
local Maximum_X, Maximum_Y = 32, 16 
local Start_X, Start_Y = 64, 32 

function love.load() 
    for y = 1,Maximum_Y do 
     local row = {} 
     for x = 1,Maximum_X do 
      table.insert(row,2) 
     end 
     table.insert(MapTable,row) 
    end 
end 

function love.draw() 
    for y,row in ipairs(MapTable) do 
     for x,idx in ipairs(row) do 
      love.graphics.draw(Tileset[idx], Start_X + 32*(x-1), Start_Y + 32*(y-1)) 
     end 
    end 
end 
+0

Так что это фактически таблица таблиц, если я хорошо вижу, где внутренние таблицы содержат все строки. Довольно умный! Я попытался подумать об использовании таблиц в таблице, но не думал использовать их для хранения каждой строки. –

+2

И хотя этот код не показывает его, вы можете получить доступ к элементам с помощью команды «MapTable [row] [col]». – Alex

+1

Вы можете избежать 'table.insert', используя' row [x] = 2' и 'MapTable [y] = row'. – lhf

0

В качестве Alex shows it проблема была не в том, как работает таблица, а в том, что я неправильно отображал числа. Таблицы могут использоваться как одномерные массивы, и тогда все хорошо.

Несмотря на то, что это не решение для их использования в качестве двумерного массива, основная проблема решена.

Смежные вопросы