lua - equipe - pamesa productos
Detección de colisiones con motor y caja de azulejos de cerámica 2D (2)
La detección de colisiones Box2D se especifica mediante las propiedades de una capa, mosaico u objeto en una capa de objeto. Ceramic agrega física automáticamente si la propiedad physics:enabled
está establecida en true
.
Los parámetros de física también se establecen dentro de las propiedades. Esta:
physics.addBody(myObject, {friction = 0.5, bounce = 0.1})
Correspondería, en las propiedades de Tiled, a esto:
physics:friction = 0.5
physics:bounce = 0.1
El seguimiento de esta pregunta , Storyboard con Ceramic Tile Engine y con Collision Detection sigue siendo un misterio. Aquí está el código:
-- 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
Y la captura de pantalla se ve así:
Sin embargo, la colisión nunca se dispara, ya que el mensaje de print
no aparece en la Terminal en absoluto.
Estoy usando:
- Corona SDK
- Motor de azulejos de cerámica
- Módulo Corona: guión gráfico, física
¿Cómo puedo activar la detección de colisión? Son los parámetros correctos?
Editar 2013/10/27
La configuración del mapa de Tiled es la siguiente:
Cuando se ejecuta en Mac OS X, la colisión no ocurre (solo la capa híbrida cambia de color).
Cuando se ejecuta en Windows 7, el código falla en esta línea:
ceramic.buildMap("maps/map.lua")
con error:
intentar llamar global ''reversePolygon'' (un valor nulo) en Ceramic.lua: 617
Después de comentar las siguientes líneas, el error se ha ido:
collisionLayer = map.layer[''Collision'']
collisionLayer.ccName = "map"
physics.addBody(collisionLayer, "static", { friction=0.5, bounce=0.3 } )
pero la función de colisión no se llama.
Para las personas futuras que están atrapadas en la detección de colisión en Corona SDK con el motor de mosaico de azulejos y cerámica
En posteriores pruebas, descubrí que el problema del evento de colisión que no se dispara es que utilicé un conjunto incorrecto de eventos de colisión. Los eventos de colisión en funcionamiento son:
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)
y cada objeto de colisión debe tener un nombre (el nombre de propiedad ccName
, puede elegir el nombre que desee, pero debe establecerse en la lista de objetos de Tiled).
Además, maskBits
los categoryBits
y maskBits
, parece que hacen que la detección de colisiones sea inválida.
Puntos a tener en cuenta:
- La capa de colisión no tiene que agregarse a la escena mediante programación (se agregará automáticamente)
- Solo se necesita 1 conjunto de métodos de detección de colisiones (Local / Global) (pero se pueden ejecutar 2 conjuntos en paralelo)
- Desactive el modo de visualización híbrido cuando no sea necesario, para un mejor rendimiento
- No importa cuál sea el formato de capa (Base64 / CSV funciona bien)
- Recuerde agregar
physics:enabled
en propiedades de Collision Layer (physics:friction
yphysics:bounce
son opcionales, según el comentario de @ CalebP)