2013-12-21 65 views
4

我嘗試在我的場景中拖動一個動態的物體與重力= 0,0,我有一個正方形與體型動態,和一個圖像與體型靜態,但是當拖動廣場到這個圖片的有一點點力,但可以超過圖像,並傳送給對方喜歡的圖片:在電暈sdk中拖動物理對象

enter image description here

enter image description here

這是我的代碼拖動方:

local function dragBody(event) 
        local body = event.target 
     local phase = event.phase 
     local stage = display.getCurrentStage() 

     if "began" == phase then 
       stage:setFocus(body, event.id) 
       body.isFocus = true 
       body.tempJoint = physics.newJoint("touch", body, event.x, event.y) 

     elseif body.isFocus then 
       if "moved" == phase then 
         body.tempJoint:setTarget(event.x, event.y) 

       elseif "ended" == phase or "cancelled" == phase then 
         stage:setFocus(body, nil) 
         body.isFocus = false 
         body.tempJoint:removeSelf() 

       end 
     end 
     return true 
end 

這是創建對象的代碼:

function scene:createScene(event) 
    local group = self.view 
    my_square = display.newImage("square.png") 
    my_square.x = 60 
    my_square.y = 60 
    physics.addBody(my_square, "dynamic") 
    group:insert(my_square) 

    floor = display.newImage("piso.png") 
    floor.x = 160 
    floor.y = 240 
    physics.addBody(floor, "static") 
    group:insert(floor) 
end 

感謝您的幫助。

回答

2

當你手動移動一個物體時,你會失去物理的控制,基本上你可以強制物體移動通過靜態物體。

你可以做的是設置碰撞檢測,當你移動正方形時會給你一個事件,告訴你什麼時候停止移動。當然,如果你在移動代碼中不尊重它,你可以繼續移動你的對象。

+1

感謝您的回覆,我正在用物理移動廣場,現在我將使用更多的對象,並且不會聽到所有對象的碰撞只是爲了移動 –

2

首先,我推薦你試試:

physics.setContinuous(false) 

如果你這樣做已經:

有在Physics2D發動機3種不同的物理類型。爲了拖拽的目的,你可以使用「Kinematic」對象類型。但是,如果它有義務將Dynamic對象用作可拖動對象,那麼碰撞中可能存在錯誤。但是如果你的靜態對象每次都是相同的,你可以通過拖曳功能來控制它。

我已經實現了一個小手機遊戲,使用你想要達到的相同的東西。這裏是鏈接: https://itunes.apple.com/tr/app/bricks-world/id602065172?mt=8

如果你認爲你想在這個遊戲中類似的東西,只是留下評論^^我可以進一步幫助。

P.S:在遊戲中,控制器槳是動態的,屏幕周圍的牆是靜態的。

另一個解決方案:

local lastX, lastY 
local function dragBody(event) 
        local body = event.target 
     local phase = event.phase 
     local stage = display.getCurrentStage() 

     if "began" == phase then 
       stage:setFocus(body, event.id) 
       body.isFocus = true 
       lastX, lastY = body.x, body.y 
     elseif body.isFocus then 
       if "moved" == phase then 
         -- You can change 1's with another value. 
         if(event.x > lastX) body.x = body.x + 1 
         else body.x = body.x - 1 

         if(event.y > lastY) body.y = body.y + 1 
         else body.y = body.y - 1 

         lastX, lastY = body.x, body.y 

       elseif "ended" == phase or "cancelled" == phase then 
         stage:setFocus(body, nil) 
         body.isFocus = false 
       end 
     end 
     return true 
end 
+0

感謝您的回覆,但「physics.setContinuous(false)」不起作用,我嘗試將不同類型的物體結合起來,但不起作用,就是爲了這個,我提出了這個問題 –

+0

我又增加了一個解決方案。 –

2

嘗試把 physics.setContinuous(假) 「默認,Box2D的執行連續碰撞檢測,這將阻止物體從‘隧道效應’。如果它被關閉,一個對象。足夠快的移動可能會穿過薄壁。「