我有一个操作JSON库,我用它来加载一个tile ID数组 . 当我直接从文件浏览器双击main.lua时,它运行得很好,但是当我打开Corona Simulator并从那里打开我的项目或者构建我的项目并在我的测试设备上运行它时,当我尝试时它会给我一个空引用错误使用我加载的数据 .
以下是从JSON文件加载表的功能:
function fileIO.loadJSONFile (fileName)
local path = fileName
local contents = ""
local loadingTable = {}
local file = io.open (path, "r")
print (file)
if file then
local contents = file:read ("*a")
loadingTable = json.decode (contents)
io.close (file)
return loadingTable
end
return nil
end
这是用法:
function wr:renderChunkFile (path)
local data = fileIO.loadJSONFile (path)
self:renderChunk (data)
end
function wr:renderChunk (data)
local a, b = 1
if (self.img ~= nil) then
a = #self.img + 1
self.img[a] = {}
else
self.img[1] = {}
end
if (self.chunks ~= nil) then
b = #self.chunks + 1
self.chunks[b] = display.newGroup ()
else
self.chunks[1] = display.newGroup ()
end
for i = 1, #data do -- Y axis ERROR IS HERE
self.img[a][i] = {}
for j = 1, #data[i] do -- Z axis
self.img[a][i][j] = {}
for k = 1, #data[i][j] do -- X axis
if (data[i + 1] ~= nil) then
if (data[i + 1][j][k] < self.transparentLimit) then
self.img[a][i][j][k] = display.newImage ("images/tiles/"..data[i][j][k]..".png", k*self.tileWidth, display.contentHeight -j*self.tileDepth - i*self.tileThickness)
self.chunks[b]:insert (self.img[a][i][j][k])
elseif(data[i + 1] == nil) then
self.img[a][i][j][k] = display.newImage ("images/tiles/"..data[i][j][k]..".png", k*self.tileWidth, display.contentHeight -j*self.tileDepth - i*self.tileThickness)
self.chunks[b]:insert (self.img[a][i][j][k])
end
end
end
end
end
end
当它到达 for i = 1, #data do
行时,它告诉我它正在尝试访问 nil
字段的长度 . 我在哪里错了?
EDIT: 我觉得有必要对我的问题给出更明确的解释 . 我从这个程序得到了不一致的结果 . 当我在文件浏览器中选择main.lua并使用Corona Simulator打开它时,它可以工作 . 当我打开Corona Simulator并在内部导航到main.lua时,它不起作用 . 当我构建项目并在我的设备上测试它时,它不起作用 . 我真正需要的是对Corona的JSON库和APK内部目录结构要求(目录嵌套限制,命名限制等)的一些了解 . 如果有人想到可能导致我遇到问题的其他事情,请提出来!我对任何事情持开放态度 .
1 回答
没有看到整个错误消息而不知道“路径”的 Value 是什么,它将很难推测 . 但Corona SDK使用四个基本目录:
system.ResourceDirectory - 与main.lua相同的文件夹,是只读system.DocumentsDirectory - 您的数据所在的可写文件夹system.CachesDirectory - 用于下载文件system.TemporaryDirectory - 用于临时文件 .
最后三个,而在模拟器中是在项目的Sandbox主文件夹中 . 在知道文件夹真正位置的设备上 .
在您的情况下,如果您的JSON文件将包含在您的可下载应用程序中,则.json文件应与您的main.lua(或子文件夹)位于同一文件夹中,并在system.ResourceDirectory中引用 .