简体   繁体   中英

Attempt to index field 'parent' (a nil value)

I'm having some troubles when I try to reload a scene.

In my program, users are able to draw a line with their finger (it's an iOS/Android app), and it works pretty good, but, when I try to reload the scene, the console returns

"Attempt to index field 'parent' (a nil value)"

at line 39

The code I've used to perform the "drawline" and the reload (replay in this case) features is

local lines = {}
local lineGroup = display.newGroup()
local prevX,prevY
local isDrawing = true
local i = 1


local function distanceBetween(x1, y1, x2, y2)
local dist_x = x2 - x1
local dist_y = y2 - y1
local distanceBetween = math.sqrt((dist_x*dist_x) + (dist_y*dist_y))
return distanceBetween
end



local function drawLine(e)
if(e.phase == "began") then

    for i = #lines, 1, -1 do
  if (lines[i]) then
   lines[i].parent:remove(lines[i])
   lines[i] = nil
  end
end
lines = {}
line_number = 100


    prevX = e.x
    prevY = e.y
    isDrawing = true


elseif(e.phase == "moved") then
    local distance = distanceBetween(prevX, prevY, e.x, e.y)
    if(isDrawing and distance < 100) then
        if(lines[i]) then lineGroup:remove(i) end
        lines[i] = display.newLine(prevX, prevY, e.x, e.y)
        lines[i]:setColor(255, 255, 0)
        lines[i].width = 3
        lines[i].myName = "lines"


if(lines[i].y < 400) then
for i = #lines, 1, -1 do
  if (lines[i]) then
   lines[i].parent:remove(lines[i])
   lines[i] = nil
  end
end
end

        local dist_x = e.x - prevX
        local dist_y = e.y - prevY
        physics.addBody(lines[i], "static", 
        { density = 1, friction = 0.5, 
     bounce =  -0.8, shape = {0, 0, dist_x, dist_y,        0, 0} } )
        lineGroup:insert(lines[i])
    end


elseif(e.phase == "ended") then
    isDrawing = true
end

return lineGroup
end


Runtime:addEventListener("touch",drawLine)

where line 39 is lines[i].parent:remove(lines[i])

Any suggestions? Thanks! :)

** * HERE'S HOW I RESTART MY GAME * ** * ** * ** * **

--REPLAY

 local replayBTN = display.newImage("immagini/pause.png")

 replayBTN.alpha = 1
 replayBTN.x = _W/2 
 replayBTN.y = _H/2 

 localGroup:insert( replayBTN)

 function replay(event)
director:changeScene("game")
 return true
 end

 replayBTN:addEventListener("touch", replay)

If you want, you can just do an additional check:

  if (lines[i]) then
      if (lines[i].parent) then
         lines[i].parent:remove(lines[i])
      end
      lines[i] = nil
  end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM