Corona SDK物理引擎 - 如何对特定方向施加力?

我正在学习 Corona,作为一个学习练习,我正在使用 Corona SDK 物理引擎创建一个简单的“保持球”的游戏(http://en.wikipedia.org/wiki/Keepie_uppie)。

除了“kick”时球的运动之外,我所有的方面都正常工作。 我正在使用触摸事件的“began”阶段,通过 applyLenearImpulse 方法来应用 kick。

我的问题是,球通常表现得好像是从上方施加了力量,使其向游戏环境的地板射击。这是尽管力量在球的接触点被施加。

我想出了以下解决方法:

function ball:touch( event )

     -- only allow taps in bottom half of ball
     if ( event.y > ball.y and event.phase == "began" ) then

         -- temporarily move floor to just below ball
         floor.y = ball.y + ballSize

         local flipx = 0

         if(event.x > ball.x) then
             flipx = event.x - ballSize
         elseif(event.x < ball.x) then
             flipx = event.x + ballSize
         else
             flipx = event.x
         end

         ball:applyLinearImpulse( 0, kickForce, flipx, event.y)

     end
end

以上作品通过在施加力量之前将地板位置临时移动到球的下方来起作用(然后通过 enterFrame 事件侦听器将地板移回正确的位置)。

我还发现,在此解决方案中,我必须翻转事件触摸的 x 位置,否则它将沿着水平方向反弹到预期方向相反的方向。

以上显然不是理想的。我应该在施加力量之前停止球的运动吗? 如果是这样,应该如何做? 或者我完全采取了错误的方法?

原文链接 https://stackoverflow.com/questions/6124909

点赞
stackoverflow用户686008
stackoverflow用户686008

applyLinearImpulse 是你想要使用的命令,但在你所有的变通方法中,你没有提到我会尝试的第一个调整:反转施加的力的方向。你贴出的代码并没有告诉我们 "kickForce" 的值;你尝试过否定它吗?

2011-05-25 14:28:14
stackoverflow用户88888888
stackoverflow用户88888888

physics = require("physics")
引入物理引擎
physics.start()
开启物理引擎
physics.setGravity(0, 9.8)
设置重力
ball = display.newCircle(400,100,100,100)
创建一个圆形球体
physics.addBody(ball)
将球体加入到物理引擎中

function ballf(event)
    if event.phase == "ended" then
       vx, vy = ball:getLinearVelocity()
       ball:setLinearVelocity( -vx, -vy )
    end
end

定义一个函数,当球体被点击时运行,获取球体的线性速度并翻转它
ball:addEventListener("touch", ballf)
为球体添加事件监听器,当触摸到球体时运行这个函数。

这是一种简单的"点击"弹球的方法。 它的原理是,当点击触摸事件结束时,它会获取当前球体的线性速度并反转它。我不知道你的代码是在干什么(看不到如何运行它)。因此我在一分钟内编写了这些代码:) 我已经爱上 Corona 不到一周了,<3。

2011-08-31 21:53:58