Corona SDK - Как убрать предмет (Coins) при столкновении с предметом (игроком)? - PullRequest
0 голосов
/ 29 апреля 2018

Я недавно начал изучать и разрабатывать игры с использованием Corona SDK, и сейчас я столкнулся с проблемой сбора монет в игровом процессе. Когда объект игрока сталкивается с объектом монеты, монета должна быть удалена / исчезла. Я попробовал приведенный ниже код, который не срабатывает всякий раз, когда монета сталкивается с игроком, который выдает ошибку

Попытка вызова метода translate (нулевое значение)

Ниже приведен код, который я использовал,

------Create Coins------

function coin()
token = display.newImage(sceneContainer, "gold.png")
token.x = math.random(320, 720)
token.y = math.random(160, 260)
token.myName = "token"
physics.addBody( token, "dynamic", { bounce=0, friction=1, radius=20 })

local function muovi()
token:translate(-2, 0) 
end

Runtime:addEventListener( "enterFrame", muovi )
end

tmr = timer.performWithDelay(5000, coin, 0)

------Collision Function------ 


function onCollision( event )
  if ( event.phase == "began" ) then
   if event.object1.myName == "player" and event.object2.myName == "token" then
      event.object2:removeSelf()
        print("hitting 1")
 elseif event.object1.myName == "token" and event.object2.myName == "player" then
   event.object1:removeSelf()
   print("hitting 1")
     end
    end
   end
 Runtime:addEventListener( "collision", onCollision)

1 Ответ

0 голосов
/ 09 мая 2018

Посмотрите на ошибки в документации Corona .

Рекомендуется установить для соответствующей переменной (ей) значение nil после вызова объекта: removeSelf ().

При удалении объекта ресурсы рендеринга Удаленный объект удаляется немедленно. То, что осталось от объекта просто простая таблица Lua со всеми неэкранными свойствами объекта - Параметр metatable имеет значение nil, и все свойства относятся к экранному объекту. удалены. Таким образом, если в Lua еще есть ссылки на объект, они просто будут ссылками на обычную таблицу Lua.

Попробуйте установить для объекта значение nil после вызова removeSelf ()

if ( event.phase == "began" ) then
   if event.object1.myName == "player" and event.object2.myName == "token" then
      event.object2:removeSelf()
      event.object2 = nil
        print("hitting 1")
 elseif event.object1.myName == "token" and event.object2.myName == "player" then
   event.object1:removeSelf()
   event.object1 = nil
   print("hitting 1")
     end
    end
   end

Если вы прочитаете вторую точку, вы заметите, что у вас все еще будет простая таблица Lua со всеми свойствами неэкранных объектов, поэтому я предполагаю, что она дважды вызывает removeSelf. В первый раз он удаляет объект с экрана, но не удаляет поле myName. Поэтому, когда он вызывается во второй раз, он снова пытается удалить себя.

...