我正在为我的游戏制作相机模块。我专门设计它来处理大量随机生成的数据。数据采用2d块的形式。它们被标记并由实际的x,y坐标引用。每个块都附有一个组,以便包含与之关联的图像。我有一个只包含屏幕上的块的组(我简单地尝试剔除)。当玩家沿任何方向移动一个块的宽度时,所有当前块需要在表中移动一个元素,并且需要在边缘行(或列)中加载新的行(或列)块。当我进行换档时,问题出现了。我收到一条错误消息,表示我已删除该图像组或其父组。问题是我没有这样做。以下代码是我遇到问题的部分(我认为整个代码很大,可以一次发布):
注意:非常结束的是删除元素的部分。我用星号标记了它。
if( changeBottom == true ) then
for i = 1, newView.numViewChunksY - 1 do
for j = 1, newView.numViewChunksX do
newView.imageChunkTable[i][j] = newView.imageChunkTable[i + 1][j]
end
end
for j = 1, newView.numViewChunksX do
local i = newView.numViewChunksY
local metaX
local metaY
if( newView.metaLoadingData.L == true ) then
if( ( newView.curChunk.x + ( j - 3 )*chunkSize ) < newView.curMetaChunk.x ) then
metaX = 1
else
metaX = 2
end
elseif( newView.metaLoadingData.R == true ) then
if( ( newView.curChunk.x + ( j - 3 )*chunkSize ) > ( newView.curMetaChunk.x + metaChunkSize*chunkSize ) ) then
metaX = 2
else
metaX = 1
end
else
metaX = 1
end
if( newView.metaLoadingData.T == true ) then
if( ( ( newView.curChunk.y + ( i - 2 )*chunkSize ) < newView.curMetaChunk.y ) ) then
metaY = 1
else
metaY = 2
end
elseif( newView.metaLoadingData.B == true ) then
if( ( newView.curChunk.y + ( i - 2 )*chunkSize ) >= newView.curMetaChunk.y + metaChunkSize*chunkSize ) then
metaY = 2
else
metaY = 1
end
else
metaY = 1
end
local chunk = newView.metaChunkTable[metaY][metaX].chunkTable[ ( newView.curChunk.y + ( i - 2 )*chunkSize )/chunkSize - newView.metaChunkTable[metaY][metaX].y/chunkSize + 1 ][ ( newView.curChunk.x + ( j - 3 )*chunkSize )/chunkSize - newView.metaChunkTable[metaY][metaX].x/chunkSize + 1 ]
newView.imageChunkTable[newView.numViewChunksY][j].displayGroup:removeSelf()----------
newView.imageChunkTable[newView.numViewChunksY][j] = nil *
newView.imageChunkTable[newView.numViewChunksY][j] = imageChunk.new( chunk ) *
end
编辑:我得到的错误的确切措辞(没有文件路径)如下:
错误:尝试删除已从舞台中删除的对象或其父/祖先组已被删除的对象。
以下是调试器引用的行:
newView.imageChunkTable[newView.numViewChunksY][j].displayGroup:removeSelf()
我在带有连字符的代码中标记了它。
编辑2: imageChunk模块:
local imageChunk = {}
local imageChunk_mt = { __index = imageChunk }
function imageChunk.new( infoChunk )
local chunkSize = 10
local tileSize = 48
local newImageChunk = {
objTable = {},
displayGroup = display.newGroup()
}
for i = 1, infoChunk.numLayers do
newImageChunk.objTable[i] = {}
for j = 1, infoChunk.layer[i].numMembers do
newImageChunk.objTable[i][j] = display.newImage( infoChunk.layer[i].group[j].kind.."/"..infoChunk.layer[i].group[j].subKind..".png", infoChunk.layer[i].group[j].x, infoChunk.layer[i].group[j].y )
newImageChunk.displayGroup:insert( newImageChunk.objTable[i][j] )
end
end
return setmetatable( newImageChunk, imageChunk_mt )
end
return imageChunk
答案 0 :(得分:0)
对于两个或更多newView.numViewChunksY][j].displayGroup
,j
可能相同。同样取决于错误发生的时间(例如,如果第一次转换正常但第二次转换失败),可能newView.numViewChunksY][j] = imageChunk.new( chunk )
不正确:可能imageChunk.new()
返回nil或者没有返回组。
更新:
根据您的更新,我想知道代码的位置显示除最后一行之外的imageChunk.new
的调用。此外,每个j对应于不同的图像块显示组newView.imageChunkTable[i][j] = newView.imageChunkTable[i + 1][j]
,这可能是导致问题的原因。