Физика Corona SDK - применить силу в определенном направлении? - PullRequest
2 голосов
/ 25 мая 2011

Я новичок в Corona и в качестве учебного упражнения создаю простую игру "keepie uppie" (http://en.wikipedia.org/wiki/Keepie_uppie) с использованием физического движка Corona SDK.

У меня все аспекты работают правильно, кроме движения мяча при «ударе». Я использую фазу «начало» сенсорного события, чтобы применить кик через метод 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 касания события, иначе оно отскочило бы горизонтально против ожидаемого направления.

Выше явно не идеально. Должен ли я остановить движение мяча перед применением силы, и если да, то как? Или я полностью ошибаюсь?

Ответы [ 2 ]

1 голос
/ 25 мая 2011

applyLinearImpulse - это команда, которую вы хотите использовать для этого, но во всех ваших обходных путях вы не упомянули первую поправку, которую я бы попробовал: изменить направление примененной силы.Код, который вы разместили, не сообщает нам значение «kickForce»;ты пытался это отрицать?

0 голосов
/ 01 сентября 2011
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 </p>

...