我正在製作大部分基於動態物理機構的遊戲,現在我需要在該元素與其他物品重疊時對其施加作用力(箭頭)這是一個傳感器主體。檢測動態物體停止與Corona SDK上的傳感器重疊時的檢測
我知道,只要碰撞事件的相位開始發生在箭頭上,我就可以開始施加力,但是,如何檢測何時停止施加此力?
有沒有辦法知道動態物體何時在傳感器體的邊界之外?
我正在製作大部分基於動態物理機構的遊戲,現在我需要在該元素與其他物品重疊時對其施加作用力(箭頭)這是一個傳感器主體。檢測動態物體停止與Corona SDK上的傳感器重疊時的檢測
我知道,只要碰撞事件的相位開始發生在箭頭上,我就可以開始施加力,但是,如何檢測何時停止施加此力?
有沒有辦法知道動態物體何時在傳感器體的邊界之外?
好,多次嘗試後,甚至想在分離軸定理後,我做了這對一個更簡單的方法(因爲SAT之一是速度太慢,我):
element:addEventListener("collision", function(event)
if (event.other.id=="ball") then
if (event.phase=="began") then
element.collision_counter=element.collision_counter+1
elseif (event.phase=="ended") then
element.collision_counter=element.collision_counter-1
end
end
end)
所以,從我理解,似乎event.phase=="began"
每次被調用時的Shape
的碰撞被驗證,而event.phase=="ended"
在對象不再與相同的Shape
碰撞時被調用。現在,使此代碼正常工作的「祕密」是這樣的事實,即如果對象仍在Body
上發生碰撞,但是與另一個Shape
發生衝突,則將首先調用event.phase=="began"
,然後調用Shape
,然後調用event.phase=="ended"
。
在此之後,因爲我想影響我物體的速度,而這是在我的element
(這是對我的情況下的箭頭),我只是在我的場景,下面這段代碼中使用的Runtime:addEventListener("enterFrame", scene)
:
function scene:enterFrame()
if (element.collision_counter>0) then
local rad=math.rad(element.rotation)
other_object:applyForce(15, 0, other_object.x, other_object.y)
end
end
鑑於您使用階段「開始」,您不能只使用相應的階段「結束」嗎? – 2015-04-02 09:43:57
我嘗試過,但即使當動態物體仍在傳感器內部時,它也會被調用...並且當動態物體在其內部睡眠時也會調用它(僅在調試階段時才進行測試)。 – 2015-04-02 10:04:12