2011-10-08 99 views
3

因爲發佈的原因,這裏是我想要做的簡單版本。電暈/ Box2D檢測與非移動靜態物體的碰撞

在屏幕上我有一個簡單的圓形對象,它是靜態的,不會移動。用戶然後可以拖放一條直線。如果線條穿過那個圓圈,我希望觸發碰撞事件。

看來,除非其中一個物體正在移動,否則碰撞永遠不會被檢測到。畫線時可以檢測到碰撞嗎?

碰撞事件

function onHit(e) 
    print("hit"); 
end 
Runtime:addEventListener("collision", onHit) 

觸摸事件

local startX = 0; 
local startY = 0; 
local endX = 0; 
local endY = 0; 

function onTouch(e) 
    if(e.phase == "began") then 
     startX = e.x 
     startY = e.y 
    elseif(e.phase == "moved") then 
     endX = e.x 
     endY = e.y 
    elseif(e.phase == "ended") then 
     local line = display.newLine(startX, startY, endX, endY) 
     line:setColor(100, 100, 100) 
     line.width = 2 
     physics.addBody(line, "static", { }) 
    end 
end 
Runtime:addEventListener("touch", onTouch) 

創建圈子

local c = display.newCircle(50, 50, 24) 
physics.addBody(c, "static", { radius = 24 }) 

回答

1

本頁面從Corona SDK docs介紹有關網頁下半部的bodyType財產。當描述「靜」的機構,它說(我的重點):

靜態物體不動,而不互相交互; 靜態物體的例子包括地面或彈球機的牆壁。

這意味着其中一個對象必須是static以外的其他對象。

下面是一個想法,雖然我自己沒有嘗試過:(請參閱下面的更新。)當您第一次創建它時,創建行dynamic。使用timer.performWithDelay函數幾毫秒後將其設置爲static。如果在此期間發生碰撞事件,您將知道您有重疊,並且可以立即將bodyType設置回static。如果您沒有遇到碰撞事件,則延遲例程中的bodyType仍然爲dynamic,並且您會知道您沒有重疊。在這種情況下,您仍然需要在延遲例程中將行設置爲static


UPDATE:測試此,使用你的代碼爲出發點

我改變了碰撞事件總是設置bodyType靜態兩個對象:

function onHit(e) 
    print("hit") 
    e.object1.bodyType = "static" 
    e.object2.bodyType = "static" 
end 

然後,我改變addBody呼籲該行將其添加爲dynamic正文,使用新代碼設置timer.PerformWithDelay函數以在短時間後檢查:

physics.addBody(line, "dynamic", { }) 

timer.performWithDelay(10, 
    function() 
     if line.bodyType == "dynamic" then 
      print ("NO OVERLAP") 
      line.bodyType = "static" 
     end 
    end) 

不幸的是,結果是混合的。它大部分時間工作,大概95%,但偶爾會在繪製一條從圓圈外部開始並結束於內部的線條時偶爾失敗,這應該是重疊,但有時會報告爲不重疊。我無法弄清楚爲什麼會發生這種情況。無論如何,我都會發布這個消息,希望它能讓你繼續前進,同時也想到有人可能會發現不一致的行爲並教育我們兩人。

如果不成功,您可以爲「無重疊」情況添加額外的檢查,以檢查該線的任一端點是否比離開中心的圓的半徑更近。這將會使事情發揮作用,但我認爲它錯過了讓物理引擎工作的整個觀點。

無論如何,祝你好運!

+0

有趣的工作周圍。雖然不是最好的解決方案,正如你已經說過的,但它是唯一提供的解決方案。謝謝。 – Paramount

0

當您釋放鼠標按下時執行光線播放。通過這種方式,您可以使兩個對象保持靜態,並知道它們通過raycast回調相交。

(我知道這是舊的文章,但它是在我的谷歌搜索先打和是不正確afaic)