Corona SDK - 如何在碰撞对象(玩家)与物体(金币)相撞时移除物体?

我最近开始学习和使用 Corona SDK 开发游戏,目前我正在面临一个问题,就是在游戏过程中收集金币。当玩家对象与金币对象碰撞时,金币应该被移除/消失。我尝试了下面的代码,但每当金币与玩家碰撞时都会抛出错误

尝试调用方法'translate'(一个空的值)

下面是我使用的代码,

------创建金币------

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)

------碰撞函数------

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)
点赞
用户2305605
用户2305605

请查看Corona文档中的陷阱。

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

当对象被删除时,被删除对象的渲染相关资源将立即被删除。剩下的对象只是一个普通的Lua表,具有所有非显示对象属性 - 元表设置为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

如果您阅读第二点,您会注意到您仍将具有所有非显示对象属性的普通Lua表,因此我猜它调用了removeSelf两次。第一次它正在从显示中删除对象,但它没有删除myName字段。因此,当第二次调用时,它正在尝试再次执行removeSelf。

2018-05-09 05:10:31