我是Corona的新手,作为一个学习练习,我正在使用Corona SDK物理引擎创建一个简单的“keepie uppie”游戏(http://en.wikipedia.org/wiki/Keepie_uppie)。
我的所有方面都正常工作,除了“踢”球运动。我正在通过applyLenearImpulse方法使用触摸事件“开始”阶段来应用踢。
我的问题是球通常表现得好像是从上方施加力,导致它射向游戏环境的地板。尽管在球上的接触点处施加了力。
我提出了以下解决方法:
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位置,否则它会在预期方向上水平反弹。
以上显然不理想。我应该在施加力之前停止球运动,如果是的话,怎么做?或者我完全采取了错误的做法?
答案 0 :(得分:1)
applyLinearImpulse是您要用于此的命令,但在您的所有解决方法中,您没有提到我将尝试的第一个调整:反转所施加的力的方向。您发布的代码并没有告诉我们“kickForce”的价值;你试过否定这个吗?
答案 1 :(得分:0)
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)
是一种在点击时“反弹”球的简单方法。
它的作用:
function ballf(event)
if event.phase == "ended" then
vx, vy = ball:getLinearVelocity()
ball:setLinearVelocity( -vx, -vy )
end
end
如果点击事件结束,它将获取当前球的线速度并反转它。
我不知道你的代码在做什么(无法看到如何运行它。)所以我在一分钟内做到了这一点:)
爱日冕不到一周<3