简体   繁体   中英

attempt to call method 'insert' (a nil value) when reloading a scene

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 78

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
     if (lines[i].parent) then
     lines[i].parent:remove(lines[i])
  end
  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
  if (lines[i].parent) then
     lines[i].parent:remove(lines[i])
  end
  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 78 is:

lineGroup:insert(lines[i])

I restart my game using

local replayBTN = display.newImageRect("images/replay.png", 25, 25)

 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)

How can I fix my problem? THANKS ;)

the moment you try to go to another scene don't reset all the values because you set it to nil so when you go back to your scene again you get an error and i see your using director class to change scene and go to the same scene have you try using storyboard i don't know if it will be much convenient to you because i'm thinking that your just trying to reset the value of the line storyboard can recreate and reset all the value as you remove the scene and go to another scene. you can visit this link to compare director class and storyboard. http://www.coronalabs.com/blog/2012/04/17/director-to-storyboard-transition-guide/

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