【问题标题】:Exclude an object from colliding从碰撞中排除对象
【发布时间】:2014-01-06 14:59:00
【问题描述】:

我遇到了一个从上面掉下来的方块和地板上一个移动的立方体之间的碰撞。问题是,每当我执行 cube:addEventListener("collision", onCollision) 时,立方体会撞到地板上,电晕会认为那是碰撞。 block:addEventListener 也是如此。由于立方体在移动,方块并不总是撞到立方体,而是撞到地板上,电晕检测到碰撞。

我还有一个循环来生成块。有没有办法在碰撞发生时禁用此循环,因为它会不断产生块。

这是我的代码:

function blockremove()
display.remove( block )
timer.performWithDelay( 1000, blockspawn)
end

function collision(event)
if(event.phase == "began") then
    display.remove( cube )
    display.remove( block )
    gameover = display.newText( "Game Over", display.contentCenterX, display.contentCenterY, native.systemFontBold, 36 )
    gameover:setFillColor( 1,0,0 )
end
 end


 function blockspawn()
 block = display.newRect( 0, 0, 50, 50 )
 block:setFillColor( 1,0,0 )
 block.x = math.random(50, display.contentWidth -50 )
 block.y = -50
 physics.addBody( block, {density=50, friction=0, bounce=0.3} )
 timer.performWithDelay( 3000, blockremove )
 block:addEventListener( "collision", collision )
 end

【问题讨论】:

  • 你说你可能有多个碰撞(块地板、立方体地板、块立方体)并且找不到区分它们的方法?不清楚问题是什么。另外我建议您将问题分开,在我看来,“禁用循环”问题与第一个问题完全不同。
  • 是的,那是另一个问题,我会尽量不在同一个帖子中再问两个问题,是的,我有 3 个对象:一个地板、一个在地板上移动的立方体和一个掉落的块从空中看,我希望积木掉到立方体上时游戏结束,但我希望它掉到地板上时继续游戏。

标签: android lua coronasdk collision


【解决方案1】:

解决方案之一是

在 onCollision 函数中,您可以识别碰撞的对象块并相应地执行操作。

您可以使用识别对象

event.object1.myName event.object2.myName

if event.object2.myName ~= "floor" then

   -- do what you want here
else
    --do nothing

end

注意:您将首先命名对象 例如。

floor.myName="floor"

http://developer.coronalabs.com/content/game-edition-collision-detection 请在此处回复或投票给我。

【讨论】:

  • 每当我尝试这样做时:ground.myName = "ground" function collision(event) if event.object2.myName ~= "ground" then display.remove( cube ) display.remove( block ) gameover = display.newText( "Game Over", display.contentCenterX, display.contentCenterY, native.systemFontBold, 36 ) gameover:setFillColor( 1,0,0 ) end end IT 似乎不起作用我收到错误消息:尝试将 nil 值设置为 object2
  • 如果 cube~=nil 试试这个,然后删除它 & nil。
  • 请记住,它只会删除您所看到的,即视觉部分,但相同的物理身体将保留在您还需要删除的内存中。
  • 啊!我发现了问题
【解决方案2】:

当一个对象与其他对象发生碰撞时,您会看到它正在调用碰撞函数,但它调用了几次,所以当第一次调用它时,它删除了该对象,但下一次它试图清理一个已经干净的对象.

始终安全地移除对象。

如果对象~= nil 那么

--remove

结束

【讨论】:

  • 嗯,这解决了我遇到的错误,但现在同样的情况再次发生:当块撞到地板时,它检测到碰撞。我这样做对吗: function collision(event) if cube ~= nil and block ~= nil then display.remove( cube ) cube = nil display.remove( block ) block = nil gameover = display.newText( "Game Over" , display.contentCenterX, display.contentCenterY, native.systemFontBold, 36 ) gameover:setFillColor( 1,0,0 ) end
  • if event.object2.myName ~= "floor" then if cube ~= nil and block ~= nil then display.remove( cube ) cube = nil else --do nothing end
【解决方案3】:

Corona SDK 支持碰撞过滤器的概念,您可以在其中定义哪些对象与哪些对象交互。

见:http://docs.coronalabs.com/guide/physics/collisionDetection/index.html#filtering

【讨论】:

    【解决方案4】:
       if event.object2.myName ~= "floor" then
           if cube ~= nil and block ~= nil then 
                display.remove( cube ) 
                cube =nil end
           end
        end
    

    首先设置一个条件,碰撞的对象不应该是地板,如果它满足条件,那么它也应该通过另一个测试它不应该已经被移除。

    【讨论】:

      猜你喜欢
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      相关资源
      最近更新 更多