Обнаружение столкновений с керамической плиткой 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
Другие вопросы по тегам