Corona SDK - 如何在与对象(玩家)发生碰撞时删除项目(硬币)?

时间:2018-04-29 20:11:32

标签: lua corona game-development

我最近开始使用Corona SDK学习和开发游戏,现在我面临着在游戏中收集硬币的问题。当玩家对象与硬币对象碰撞时,硬币应被移除/消失。我尝试了以下代码,当硬币与播放器发生错误时会发生错误

,但这个代码不成功
  

尝试拨打电话'翻译' (零值)

以下是我使用的代码,

------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 :(得分:0)

查看Corona Documentation中的陷阱。

  

作为最佳实践,您应将关联变量设置为nil   在调用object之后:removeSelf()。

     

删除对象时,与渲染相关的资源   删除的对象会立即删除。剩下的目标是什么   只是一个普通的Lua表,包含所有非显示对象属性 -   metatable设置为nil,并且所有属性都与显示对象相关   被删除。因此,如果在Lua中仍有对象的引用,   它们只是引用普通的Lua表。

尝试在调用removeSelf()

后将对象设置为nil
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字段。因此,当它第二次被召唤时,它会再次尝试删除自己。