2013-10-22 100 views
1

對此question進行跟蹤,使用陶瓷磚引擎的故事板和碰撞檢測仍然是一個謎。下面是代碼:使用陶瓷磚引擎和箱子進行碰撞檢測2D

-- 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 

,然後將截圖的樣子:

Screenshot

然而,碰撞從來沒有觸發,因爲print消息沒有在終端出現在所有。

我使用:

  • 科羅娜SDK
  • 瓷磚引擎
  • 電暈模塊:故事板,物理

如何啓用衝突檢測?參數是否正確?


編輯2013年10月27日

的瓷磚地圖設置如下:

Collision Layer Settings

當在Mac OS X上運行,碰撞不會發生(僅混合層改變顏色)。

當在Windows 7上運行的代碼崩潰在這條線:

ceramic.buildMap("maps/map.lua") 

錯誤:

attempt to call global 'reversePolygon' (a nil value) in Ceramic.lua: 617

我註釋掉以下行後,錯誤消失:

collisionLayer = map.layer['Collision'] 
collisionLayer.ccName = "map" 
physics.addBody(collisionLayer, "static", { friction=0.5, bounce=0.3 }) 

但碰撞函數沒有被調用。

回答

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,你可以選擇任何你想要的名字,但它在瓷磚的對象列表進行設置)。

此外,我刪除了categoryBitsmaskBits,似乎他們使衝突檢測無效。

注意要點:

  • 碰撞層不必通過編程添加到場景(它會自動添加)
  • 只有1套的碰撞檢測方法(局部/全局)需要(但2臺可以並行運行)
  • 關閉混合顯示模式不需要時,獲得更好的性能
  • 不要緊層格式是什麼樣的(Base64/CSV正常工作)
  • 記得在碰撞層屬性(physics:frictionphysics:bounce是可選的,按照@ CalebP的評論)添加physics:enabled
1

通過對象層中的圖層,圖塊或對象的屬性指定Box2D碰撞檢測如果physics:enabled屬性設置爲true,陶瓷會自動添加物理。

物理參數也在屬性中設置。這:

physics.addBody(myObject, {friction = 0.5, bounce = 0.1}) 

將對應,在瓷磚的性能,這一點:

physics:friction    = 0.5 
physics:bounce    = 0.1 
+0

我已經添加了這些,但碰撞事件根本不會被觸發。我錯過了什麼?但我注意到物理混合層正在改變顏色 – Raptor

+0

而'physics:enabled'是真的嗎? –

+0

是的,請參閱我的更新。 – Raptor