Примените импульс к SKNode, чтобы перемещаться по экрану и обнаруживать столкновения

Я делаю базовое приложение, которое перемещает фигуры по экрану и обнаруживает столкновение с Sprite Kit. Моя первая попытка заключалась в использовании moveTo на узлах. Проблема, с которой я столкнулся, заключалась в столкновении объектов, которые вращались вокруг друг друга, а не отскакивали.

Поэтому я обнаружил, что мне нужно использовать applyForce ИЛИ applyImpulse.

В этой ситуации у меня, например, есть круг, который находится за пределами экрана в начале его жизни. Затем мы определяем целевую точку выхода и хотим «щелкнуть»/«подтолкнуть» узел в этом направлении.

Я не могу понять, как применить Impulse к целевой конечной позиции, которая у меня есть как CGPoint. Мне нужно передать это в CGVector, но я не уверен, что нужно сделать. Я осмотрелся и нашел несколько статей Рэя, но они просто показывают applyForce или moveTo. Я не уверен, как это рассчитать.


person StuartM    schedule 28.04.2015    source источник
comment
Вы спрашиваете, какие значения dx и dy и как они работают?   -  person sangony    schedule 29.04.2015
comment
Хорошо, вкратце я спрашиваю... У меня есть начальная точка и конечная целевая точка. Я хочу переместить этот узел (через applyImpulse) к целевой точке. Итак, я хочу применить Impulse к целевой конечной точке, тогда, если он столкнется с чем-либо на пути, он изменит направление. Но я не уверен, как получить CGVector, который метод applyImpulse берет из двух точек (начало, конец цели).   -  person StuartM    schedule 29.04.2015
comment
Вероятно, это то, что вы ищете stackoverflow.com/questions/22157138/   -  person sangony    schedule 29.04.2015
comment
Да, я тоже нашел, но, к сожалению, нет. Если вы посмотрите на ссылку rayW из этого ответа, реализация Swift больше не использует applyImpulse и вместо этого использует moveTo. MoveTo будет работать нормально в той ситуации, когда они не двигаются после столкновения, но в этом случае это не будет...   -  person StuartM    schedule 29.04.2015
comment
По сути, вы должны применить Impulse к физическому телу вашего узла следующим образом [myNode.physicsBody applyImpulse:CGVectorMake(10, 10)]; Это подтолкнет ваш узел вверх и вправо. То, как вы вычисляете точные значения для dx,dy, является математической функцией, которую вы можете найти в Google.   -  person sangony    schedule 29.04.2015
comment
Да, я понимаю, что мог бы сделать это, т.е. 10,10, но я хочу конкретно подтолкнуть его к определенной точке. Итак, как мне перевести эту точку в CGVector. Кроме того, как бы я мог контролировать скорость, с которой узел движется к точке?   -  person StuartM    schedule 29.04.2015
comment
Спасибо уже было, посмотрю еще   -  person StuartM    schedule 29.04.2015


Ответы (2)


Я нашел сайт, который хорошо объясняет 2D-физику.
http://www.rodedev.com/tutorials/gamephysics/

С этим я понял, каким должен быть угол и скорость, которую я могу контролировать, и это работает хорошо.

person StuartM    schedule 30.04.2015

Вы можете переместить объект, вручную изменив положение x и y, чтобы вы могли достичь конечной точки. В функции обновления вы меняете yourObject.position.x и yourObject.position.y, если я правильно понял ваш вопрос. Если нет, пожалуйста, будьте более явными. Надеюсь, это поможет.

person Eduard    schedule 28.04.2015
comment
Я думал, что я был явным :) Я понимаю, что могу перемещать позицию по x и y, и я могу использовать moveTo, но это не будет работать с коллизиями. Поэтому мне нужно применить импульс к объекту, но я не могу понять, как определить dx и dy - person StuartM; 29.04.2015
comment
О, попробую разобраться. - person Eduard; 29.04.2015