tau productos pamesa equipe ceramicas ceramica catalogo atrium lua collision-detection box2d corona ceramic-tile-engine

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 y physics:bounce son opcionales, según el comentario de @ CalebP)