使用陶瓷砖引擎跟踪此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
消息根本不会出现在终端中。
我正在使用:
如何启用碰撞检测?参数是否正确?
修改2013/10/27
Tiled地图设置如下:
在Mac OS X中运行时,不会发生碰撞(只有混合层会改变颜色)。
在Windows 7中运行时,代码在此行崩溃:
ceramic.buildMap("maps/map.lua")
有错误:
尝试在Ceramic.lua中调用全局'reversePolygon'(零值): 617
在我注释掉以下行后,错误消失了:
collisionLayer = map.layer['Collision']
collisionLayer.ccName = "map"
physics.addBody(collisionLayer, "static", { friction=0.5, bounce=0.3 } )
但是没有调用碰撞函数。
答案 0 :(得分:1)
Box2D碰撞检测通过对象图层中图层,图块或对象的属性指定。如果physics:enabled
属性设置为{{1},则Ceramic会自动添加物理图像}。
物理参数也在属性中设置。这样:
true
在Tiled的属性中,对应于:
physics.addBody(myObject, {friction = 0.5, bounce = 0.1})
答案 1 :(得分:1)
对于陷入使用瓷砖和瓷砖引擎的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的对象列表中设置。)
此外,我删除了categoryBits
和maskBits
,似乎它们使碰撞检测无效。
注意事项:
physics:enabled
(physics:friction
和physics:bounce
是可选的,根据@ CalebP的评论)