【问题标题】:Multiple spawned objects on collision - Corona SDK碰撞时产生多个对象 - Corona SDK
【发布时间】:2011-08-18 16:08:31
【问题描述】:

请帮忙!我试图从天空中一个接一个地生成 5 个球,并让它们在它们落地或击中地面上另一个用户控制的物体时立即消失。好消息是我可以按预期成功生成球,但是当它们撞到地面(或地面上的其他用户控制对象)时,它们不会消失。自过去 2 天以来,我一直在浏览大量示例代码,但我不知道该怎么做。游戏运行,但调试终端给我一个错误说:运行时错误 - 尝试索引全局 'self' 。这是源代码:

local randomBall = function()
    ball = display.newImage( "hardball.png" )
    ball.x = math.random (30, 450); ball.y = -20
    physics.addBody( ball, { density=2.9, friction=0.5, bounce=0.7, radius=24 } )
    local function whenHit (event)
        if(event.phase == "began") then
            self:removeSelf()       
        end
    end
    ball:addEventListener("collision", whenHit)
end

timer.performWithDelay( 500, randomBall, 5 )

【问题讨论】:

标签: iphone ios physics collision coronasdk


【解决方案1】:

告诉我们错误发生在哪一行会很好,但我可以看到你的问题出在函数 whenHit()

它指的是一个变量'self',只是你从来没有定义过那个变量。大概您希望该函数充当 'ball' 的方法,因此函数声明应使用冒号语法并且看起来像 ball:collision(event)


请注意,Corona 有两种设置事件侦听器的方法。他们的文档中对此进行了解释:http://developer.anscamobile.com/content/events-and-listeners

然后他们文档中的这个页面解释了它如何应用于碰撞事件: http://developer.anscamobile.com/content/game-edition-collision-detection

看起来您正在尝试做的是球上的表侦听器,在这种情况下,您对 addEventListener 的调用应该是 ball:addEventListener("collision", ball) 然后函数是 ball:collision(event)

他们描述的另一种方法是全局监听函数,然后在函数内部使用 event.object1 来引用碰撞的对象。

【讨论】:

  • 非常感谢您的回复,很抱歉没有提及行号。终端显示错误在self:removeSelf(); 5 个球仅由 randomBall 函数生成,所以我仍然无法弄清楚问题所在。请问您可以在这里为我发布一些代码或示例吗?
  • 看来问题出在 randomBall 函数本身。如果我将 ball:addEventListener("collision", whenHit) 放在 randomBall 函数之外,并在一个名为 whenHit 的新函数中尝试在每个球落地后立即移除它,终端会显示“ball”是一个 nil 值,球并没有消失。请帮忙
  • “ball”是在 randomBall() 函数中定义的,因此任何对“ball”的引用(例如对 ball:addEventListener 的调用)也需要在 randomBall() 中。我不知道你为什么认为把它放在外面会有所帮助。而且我不确定您为什么认为问题出在 randomBall() 函数上;我已经说过问题出在 whenHit() 上。具体来说,有错误的行在whenHit()里面
  • 我在 Corona 文档中发布了相关页面的链接,因为您似乎很困惑。
  • 看起来当多个相同类型的物理对象在单个函数中创建时,它们不能从同一个函数中销毁,这可能是因为系统将每个对象识别为同一个对象。我从以下代码实现了一些代码:developer.anscamobile.com/content/… 现在发生的情况是,当我通过以下方式对其进行测试时: if (event.phase == "began") then print("The ball has collided now")
【解决方案2】:
猜你喜欢
  • 2014-05-31
  • 1970-01-01
  • 2015-11-11
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多