Обнаружение столкновений с керамической плиткой Engine & Box 2D
В продолжение этого вопроса Storyboard с керамической плиткой Engine и Collision Detection до сих пор остается загадкой. Вот код:
-- 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
Настройки Tiled-карты следующие:
При работе в Mac OS X столкновения не происходит (только гибридный слой меняет цвет).
При запуске в Windows 7 код вылетает в этой строке:
ceramic.buildMap("maps/map.lua")
с ошибкой:
попытка вызвать глобальный reversePolygon (нулевое значение) в Ceramic.lua: 617
После того, как я закомментировал следующие строки, ошибка исчезла:
collisionLayer = map.layer['Collision']
collisionLayer.ccName = "map"
physics.addBody(collisionLayer, "static", { friction=0.5, bounce=0.3 } )
но функция столкновения не вызывается.
2 ответа
Для будущих людей, которые застряли в Collision Detection в 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
кажется, они делают обнаружение столкновения недействительным.
Обратите внимание:
- Столкновение слоя не нужно добавлять в сцену путем программирования (он будет добавлен автоматически)
- Необходим только 1 набор методов обнаружения столкновений (локальный / глобальный) (но 2 набора могут выполняться параллельно)
- Отключите гибридный режим отображения, когда это не нужно, для лучшей производительности
- Неважно, что формат Layer ( Base64 / CSV работает нормально)
- Не забудьте добавить
physics:enabled
в свойствах Collision Layer (physics:friction
а такжеphysics:bounce
являются необязательными, согласно комментарию @CalebP)
Обнаружение столкновения Box2D задается через свойства слоя, плитки или объекта в слое объекта. Керамика добавляет физику автоматически, если physics:enabled
свойство установлено в true
,
Физические параметры также задаются в свойствах. Это:
physics.addBody(myObject, {friction = 0.5, bounce = 0.1})
Соответствует, в свойствах Tiled, этому:
physics:friction = 0.5
physics:bounce = 0.1