2014-02-14 3 views
0

Я пытаюсь найти какое-то столкновение, но я не могу понять, в чем проблема.Corona/Lua и collisions: «попытка конкатенации поля« имя »(значение nil)«

Ошибка я получаю

...\main.lua:178:attempt to concatenate field 'name' (a nil value)

Что у меня есть это: у меня есть коробка («корабль»), который остается при фиксированном X координат, но движется вверх и вниз. Он предназначен для прохождения «туннеля», состоящего из двух прямоугольников с промежутком между ними, и я пытаюсь обнаружить столкновение между судном и стенами туннеля (т. Е. Прямоугольники).

Эта ошибка возникает при столкновении. Многие из моих кодов - это просто измененные версии официальной документации Corona, и я просто не могу понять, в чем проблема.

Вот соответствующие фрагменты кода:

function playGame() 
    -- Display the ship 
    ship = display.newRect(ship); 
    shipLayer:insert(ship); 
    -- Add physics to ship 
    physics.addBody(ship, {density = 3, bounce = 0.3}); 

    ... 

    beginRun(); 
end 

function beginRun() 
    ... 
    spawnTunnel(1100); -- this just calls the createTunnel function at a specific location 
    gameListeners("add"); 
    ... 
end 

function gameListeners(event) 
    if event == "add" then 
     ship.collision = onCollision; 
     ship:addEventListener("collision", ship); 
     -- repeat above two lines for top 
     -- and again for bottom 
    end 
end 

-- Collision handler 
function onCollision(self,event) 
    if (event.phase == "began") then 
     -- line 178 is right below this line ---------------------------------- 
     print(self.name .. ": collision began with " .. event.other.name) 
end 

-- Create a "tunnel" using 2 rectangles 
function createTunnel(center, xLoc) 
    -- Create top and bottom rectangles, both named "box" 
    top = display.newRect(stuff); 
    top.name = "wall"; 
    bottom = display.newRect(stuff); 
    bottom.name = "wall"; 

    -- Add them to the middleLayer group 
    middleLayer:insert(top); 
    middleLayer:insert(bottom); 

    -- Add physics to the rectangles 
    physics.addBody(top, "static", {bounce = 0.3}); 
    physics.addBody(bottom, "static", {bounce = 0.3}); 
end 

я только получаю сообщение об ошибке, как только два объекта приходится сталкиваться, так что кажется, что столкновение происходит, и он был определен. Но по какой-то причине self.name и event.other.name ноль.

ответ

0

О, ничего себе. После долгих часов я наконец понял свою тупую, простую ошибку.

Проблема в том, что я забыл дать кораблю свое имя. Код теперь выглядит так и отлично работает:

function playGame() 
    -- Display the ship 
    ship = display.newRect(ship); 
    ship.name = "ship"; -- added this line to give the ship a name 
    shipLayer:insert(ship); 
    -- Add physics to ship 
    physics.addBody(ship, {density = 3, bounce = 0.3}); 

    ... 

    beginRun(); 
end 
0

Попробуйте использовать:

top.name = "wall"; 

и

bottom.name = "wall"; 

в

top.myName = "wall" 

и

bottom.myName = "wall"; 

использования onCollision после вашего "createTunnel: function:

-- Collision handler 
function onCollision(self, event) 

    if (event.phase == "began") then 
     print(self.myName .. ": collision began with " .. event.other.myName) 
    end 
end 
+0

Я думал, что свойство .name, которое я добавил, было обычным? Насколько мне известно, любое свойство может быть добавлено в таблицу lua, и это было одним из них. Так что имя не имеет значения. Тем не менее, я изменил его, чтобы быть уверенным. Ошибка осталась прежней (кроме имени name -> myName). Кроме того, обработчик столкновений называется только AFTER createTunnel. Я отредактировал свое оригинальное сообщение, потому что оставил это. Я все еще получаю ошибку. Я даже попытался переместить функцию createTunnel над функцией onCollision безрезультатно. – Gakor

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