2016-10-24 4 views
0

Привет, я конвертирую эту простую игру «поймать яйцо» от двигателя Godot до Corona. Я очень новичок в программировании и использую этот проект в качестве учебного упражнения.Corona SDK Попытка сравнить номер с nil

Я столкнулся с этим препятствием. Я получаю следующее сообщи об ошибке:

**

ОШИБКА: ошибка во время выполнения C: \ Users \ kdoug \ Documents \ Корона Projects \ cathchtheegg \ main.lua: 19: попытка сравнить число с нулем стека Обратное прослеживание: C: \ Users \ kdoug \ Documents \ Корона Проекты \ cathchtheegg \ main.lua: 19: в функции : в функции

**

То, что я пытаюсь сделать, это см., если яйцо w плохое удаление, когда оно выходит за определенную точку, без необходимости столкновения с объектом физики.

любая помощь будет оценена! благодаря

Вот код (чуть меньше 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) 
+0

Существует много путаницы в отношении переменной 'egg'. Функция 'loop()' обращается к глобальной переменной 'egg', функция' collision' обращается к локальной переменной, функция 'spawn()' должна добавить новое яйцо в список 'eggs', но в то же время изменяет локальную переменную' egg'. Начните с очистки этих отношений. – Vlad

+0

Спасибо Владу. Я пытался очистить отношения, как вы предлагали –

ответ

0

Я не знаю, когда вы удалите enterFrame слушателя. Это важно. После удаления цикла объекта яйца можно снова вызвать. Поэтому, когда egg.y не определен (= nil), сравнение (в случае, если состояние) не может быть выполнено.

Мое решение:

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

Информация https://www.lua.org/pil/3.3.html

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

Или (используйте локальный переменный индекс вместо глобального переменного яйца) Не ясно, для моего использования целью Названия переменного яйца в коде так это может быть неправильно.

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 
+0

Спасибо за вашу помощь Idurniat. Ваше предложение имеет большой смысл, и я поместил его в свой код, но я все еще получаю ту же самую ошибку. Я думаю, что здесь что-то еще не так. –

+0

Добавление этого параметра в функцию thisEgg, похоже, помогло. Функция петля() , если яйцо и egg.y> 100 затем печати ("Удалить") display.remove (яйцо) table.remove (яйца, IDX) конца конца timer.performWithDelay (33, петля, 0) Тем не менее, он все же срабатывает при одной и той же ошибке. –

+0

@ Vlad имеют право. Вам нужно очистить его. Может быть установлено переменное яйцо как локальное в функции Egg и сохранить в другой локальной переменной для индексации в таблице яиц этой переменной? – ldurniat

Смежные вопросы