【问题标题】:Collision Detection with Ceramic Tile Engine & Box 2D使用 Ceramic Tile Engine 和 Box 2D 进行碰撞检测
【发布时间】:2013-10-22 06:54:32
【问题描述】:

跟进这个question,带有陶瓷砖引擎和碰撞检测的故事板仍然是一个谜。代码如下:

-- hide status bar
display.setStatusBar(display.HiddenStatusBar)
local storyboard = require("storyboard")
--Set up the physics world
local physics = require("physics")
physics.start()
physics.setGravity(0, 0)
physics.setDrawMode('hybrid')
local scene = storyboard.newScene()
local widget = require("widget")

-- Add Hero to Physics
local hero = display.newImage("images/man.png")
hero.x = 40
hero.y = 80
local heroCollisionFilter = { categoryBits = 4, maskBits = 2 }
local heroBody = { filter=heroCollisionFilter, isSensor=true }
physics.addBody(hero, "dynamic", heroBody)

function scene:createScene( event )
    local group = self.view
    local ceramic = require("Ceramic")
    ceramic.showPrints = false
    local map = ceramic.buildMap("maps/map.lua")
    -- collisionLayer = map.layer['Collision']
    -- collisionLayer.ccName = "map"
    -- physics.addBody(collisionLayer, "static", { friction=0.5, bounce=0.3 } )
    map.y = 0
    map.setCameraDamping(10)
    map.layer['World']:insert(hero)
end

function onGlobalCollision(event)
    if(event.phase == "began") then
        print( "Global report: " .. event.object1.ccName .. " & " .. event.object2.ccName .. " collision began" )
    elseif(event.phase == "ended") then
        print( "Global report: " .. event.object1.ccName .. " & " .. event.object2.ccName .. " collision ended" )
    end
    print( "**** " .. event.element1 .. " -- " .. event.element2 )
end

Runtime:addEventListener("collision", onGlobalCollision)
scene:addEventListener( "createScene", scene )

return scene

截图如下:

但是,冲突永远不会触发,因为 print 消息根本不会出现在终端中。

我正在使用:

  • Corona SDK
  • 瓷砖引擎
  • Corona 模块:故事板、物理

如何启用碰撞检测?参数是否正确?


编辑 2013/10/27

平铺地图设置如下:

在 Mac OS X 中运行时,不会发生碰撞(只有混合层会改变颜色)。

在 Windows 7 中运行时,代码在此行崩溃:

ceramic.buildMap("maps/map.lua")

有错误:

尝试在 Ceramic.lua 中调用全局“reversePolygon”(一个 nil 值): 617

注释掉以下几行后,错误消失了:

collisionLayer = map.layer['Collision']
collisionLayer.ccName = "map"
physics.addBody(collisionLayer, "static", { friction=0.5, bounce=0.3 } )

但是碰撞函数没有被调用。

【问题讨论】:

    标签: lua collision-detection box2d coronasdk ceramic-tile-engine


    【解决方案1】:

    Box2D 碰撞检测是通过层、平铺或对象层中的对象的属性指定的。如果physics:enabled 属性设置为true,Ceramic 会自动添加物理。 p>

    物理参数也在属性中设置。这个:

    physics.addBody(myObject, {friction = 0.5, bounce = 0.1})
    

    在 Tiled 的属性中对应于:

    physics:friction              = 0.5
    physics:bounce                = 0.1
    

    【讨论】:

    • 我已经添加了这些,但是碰撞事件根本没有触发。我错过了什么?但我注意到物理混合层正在改变颜色
    • physics:enabled 是真的吗?
    【解决方案2】:

    对于未来在使用 Tiled 和 Ceramic Tile Engine 的 Corona SDK 中陷入碰撞检测的人

    在进一步的测试中,我发现碰撞事件不触发的问题是我使用了错误的碰撞事件集。有效的碰撞事件是:

    local function onLocalCollision(self, event)
        print("collision")
        if event.phase == "began" then
            print("Collision began")
        elseif event.phase == "ended" then
            print("Collision ended")
        end
    end
    
    function onGlobalCollision(event)
        if(event.phase == "began") then
            print( "Global report: " .. event.object1.ccName .. " & " .. event.object2.ccName .. " collision began" )
        elseif(event.phase == "ended") then
            print( "Global report: " .. event.object1.ccName .. " & " .. event.object2.ccName .. " collision ended" )
        end
        print( "**** " .. event.element1 .. " -- " .. event.element2 )
    end
    
    function onPostCollision(event)
        print("postCollision")
    end
    
    -- Local Collision
    hero.collision = onLocalCollision
    hero:addEventListener("collision", hero)
    -- Global Collision
    Runtime:addEventListener("collision", onGlobalCollision)
    Runtime:addEventListener("postCollision", onPostCollision)
    

    并且每个碰撞对象都必须有一个名称(属性名称ccName,你可以选择任何你想要的名称,但它必须在Tiled的对象列表中设置)。

    另外,我删除了categoryBitsmaskBits,似乎它们使碰撞检测无效。

    注意事项:

    • 碰撞层不必编程添加到场景中(会自动添加)
    • 只需要 1 套碰撞检测方法(Local / Global)(但可以并行运行 2 套)
    • 在不需要时关闭混合显示模式,以获得更好的性能
    • Layer 格式是什么都没关系(Base64 / CSV 可以正常工作)
    • 记得在碰撞层属性中添加physics:enabledphysics:frictionphysics:bounce 是可选的,根据@CalebP 的评论)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多