简体   繁体   中英

Corona SDK Attempt to compare number number to nil

Hi I am converting this simple "catch the egg" game from Godot engine to Corona. I am very new to programming and am using this project as a learning exercise.

I have run into a hurdle with it though. I keep getting the following error msg:

**

ERROR: Runtime error C:\\Users\\kdoug\\Documents\\Corona Projects\\cathchtheegg\\main.lua:19: attempt to compare number with nil stack traceback: C:\\Users\\kdoug\\Documents\\Corona Projects\\cathchtheegg\\main.lua:19: in function ?: in function

**

What I am trying to do is see if the egg will delete when it goes beyond a certain point, without having to use a collision with a physics object.

any help would be appreciated! thanks

Here is the code (a little less discombobulated):

local physics = require "physics"
physics.start()
local h = display.actualContentHeight
local w = display.actualContentWidth
local cx = display.contentCenterX
local cy = display.contentCenterY
local dnir = display.newImageRect
local dnr = display.newRect
local mr = math.random
--local egg 
local bask
local idx = 0
local eggs = {}


---------BACKGROUND---------------
local bg = dnir("bg.png", w,h)
bg.x = cx 
bg.y = cy

----------DISPLAY BASKET------------
bask = dnir("basket.png", 100,50)
bask.x = cx
bask.y = cy
physics.addBody(bask,"kinematic")
bask.myName = "bask"


----- BASKET MOVE W/ MUSE FUNCTION -----
local function baskMove (e)

  bask.x = e.x
  bask.y = e.y
end

Runtime:addEventListener("mouse", baskMove)


----------------GROUND---------------
local grd = dnr(cx,h-470,w+50,10)
grd:setFillColor(.1, .8, .15,0)
grd.myName = "ground"
physics.addBody(grd, "static")
grd.collision = collision
grd:addEventListener("collision", grd)

----------****DELETE EGG FUNCTION****------------
--function loop () 
--  if egg and egg.y > 100 then
--    print("Delete")
--    display.remove(egg)
--  end
--end
--
--Runtime:addEventListener("enterFrame", loop)


-----------COLLISIONS FUNCTIION-------------
local function collision ( s, e )
  if e.phase == "began" then

    if e.target.myName == "bask"
      and e.other.myName == "egg"  then
      display.remove(e.other)
      table.remove(eggs, idx)
    end

    if e.target.myName == "egg"
      and e.other.myName == "bask" then
     display.remove(e.target)
     table.remove(eggs, idx)
    end

    if e.target.myName == "ground"
      and e.other.myName == "egg"  then
      display.remove(e.other)
      table.remove(eggs, idx)
    end

    if e.target.myName == "egg"
      and e.other.myName == "ground" then
     display.remove(e.target)
     table.remove(eggs, idx)
    end

  end
end
--

 --------------EGG---------------------
function theEgg ()
egg = dnir("egg.png", 50,50)
physics.addBody(egg,"dynamic")
egg.myName = "egg"  
idx = idx + 1
egg.x = mr(w)
egg.y = - 100


transition.to (egg, {y = h + 50, time= mr(1000,8000)})

eggs[idx] = egg
eggs[idx].idx = idx
print(eggs[idx])


--------EGG COLLISIION CB-------------
egg.collision = collision
egg:addEventListener("collision", egg)

end
--

-----------Spawn EGG-----------
function spawner()
  theEgg()
  print(#eggs)-- PRINT AMT IN TABLE
end
timer.performWithDelay(2000, spawner, 0)

I don't know when you remove enterFrame listener. It is important. After you delete egg object loop may be called again. So when egg.y is not defined (=nil) comparision (in if statment) can not be done.

My solution:

function loop () 
  if egg and egg.y > 100 then
    print("Delete")
    display.remove(egg)
  end
end

Information from https://www.lua.org/pil/3.3.html

all logical operators consider false and nil as false and anything else as true

Or (use local variable index instead global variable egg) It is not clear for my purpose use of varaible egg in your code so it may be wrong.

local index

...

function loop () 
  if eggs[index] and eggs[index].y > 100 then
    print("Delete")
    local egg = table.remove(eggs, index)
    display.remove(egg)
    egg = nil
  end
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