我最近开始使用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)
答案 0 :(得分:0)
查看Corona Documentation中的陷阱。
作为最佳实践,您应将关联变量设置为nil 在调用object之后:removeSelf()。
删除对象时,与渲染相关的资源 删除的对象会立即删除。剩下的目标是什么 只是一个普通的Lua表,包含所有非显示对象属性 - metatable设置为nil,并且所有属性都与显示对象相关 被删除。因此,如果在Lua中仍有对象的引用, 它们只是引用普通的Lua表。
尝试在调用removeSelf()
后将对象设置为nilif ( 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字段。因此,当它第二次被召唤时,它会再次尝试删除自己。