在lua表中移动显示组

时间:2014-05-31 03:02:12

标签: lua corona lua-table

我正在为我的游戏制作相机模块。我专门设计它来处理大量随机生成的数据。数据采用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

1 个答案:

答案 0 :(得分:0)

对于两个或更多newView.numViewChunksY][j].displayGroupj可能相同。同样取决于错误发生的时间(例如,如果第一次转换正常但第二次转换失败),可能newView.numViewChunksY][j] = imageChunk.new( chunk )不正确:可能imageChunk.new()返回nil或者没有返回组。 更新:

根据您的更新,我想知道代码的位置显示除最后一行之外的imageChunk.new的调用。此外,每个j对应于不同的图像块显示组newView.imageChunkTable[i][j] = newView.imageChunkTable[i + 1][j],这可能是导致问题的原因。