在电晕sdk中拖动物理对象

时间:2013-12-21 06:49:34

标签: lua corona game-engine game-physics

我试图在我的场景中拖动一个重力= 0,0的动态体,我有一个体型为动态的正方形,以及一个体型为静态的图像,但是当在图像上拖动正方形时,它有一个很小的力量,但可以超过图像,像图像一样传递到另一边:

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

感谢您的帮助。

3 个答案:

答案 0 :(得分: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

答案 2 :(得分:2)

尝试推杆     physics.setContinuous(false) “默认情况下,Box2D执行连续碰撞检测,防止物体”隧道穿过。“如果它被关闭,移动得足够快的物体可能会穿过薄壁。”