在Corona SDK中拖动物理对象。

我试图在我的场景中拖动一个重力为0,0的动态物体,我有一个类型为dynamic的正方形和一个类型为static的图像,但是当我拖动正方形超过图像时,图像会有一点力但是可以超过图像并通过至另一侧,就像这些图像:

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

谢谢帮忙。

点赞
用户1870706
用户1870706

当您手动移动一个物体时,您正在失去对物理的控制,基本上您可以强制物体移动过静态物体。

您可以设置碰撞检测,当您移动正方形时,会触发一个事件,告诉您何时停止移动。当然,如果您在移动代码中不遵守这一点,您可以继续移动物体。

2013-12-23 01:54:10
用户2186639
用户2186639

首先,我建议你尝试:

physics.setContinuous( false )

如果你已经这样做了:

在 Physics2D 引擎中有三种不同的物理类型,为了拖动目的,您可以使用“运动学”对象类型。但是,如果必须使用动态对象作为可拖动对象,则在碰撞中可能会出现错误。但是,如果您的静态对象每次都将相同,您可以在拖动函数中控制它。

我使用相同的东西实现了一个小型移动游戏。这是链接: https://itunes.apple.com/tr/app/bricks-world/id602065172?mt=8

如果您认为您想在这个游戏中获取类似的内容,只需留下一个评论^^ 我可以帮助进一步。

PS: 在游戏中,控制器挡板是动态的,屏幕周围的墙壁是静态的。

另一个解决方案:

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
                        -- 你可以用另一个值替换 1。
                        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
2013-12-25 16:01:07
用户3045251
用户3045251

尝试使用以下代码:

physics.setContinuous(false)

默认情况下,Box2D执行连续碰撞检测,防止物体“穿透”其他物体。如果关闭该功能,则可能造成一个移动得足够快的物体穿过一面薄墙。

2013-12-28 19:07:05