Я пытаюсь переместить динамическое тело из точки A в точку B, используя Phaser 2.4.6 и версию p2.js, включенную в нее. Очень важно, чтобы тело точно остановилось в точке назначения, а не за точкой или после ее прохождения (допустимы очень низкие допуски). Я пробовал два подхода до сих пор, и не удался с обоими:«Прецизионное перемещение» тела с использованием физики Phaser и p2.js
- Используйте анимацию Phaser, чтобы изменить координаты тела по всему маршруту, в котором я хочу, чтобы он двигался дальше. Это прекрасно работает, за исключением того, что тело может пропустить статические тела.
Пример кода:
game.add.tween(sprite.body).to(
{ x: destinationX, y: destinationY },
timeInterval,
Phaser.Easing.Quadratic.InOut,
true
);
- Используйте p2
force
свойство для перемещения тела по заданной траектории. На этот раз столкновения с другими телами хорошо работают, но почти невозможно заставить тело остановиться точно в координатах, которые я хочу. Я попытался уменьшить силу, применяемую, когда тело приближается к месту назначения, которое отлично работает в 90% случаев. Однако в сценариях с низкой производительностью анимация «дрожащая» (что и следовало ожидать), но также не попадает в целевую точку и проходит через нее, иногда на много. Я бы даже согласился с возможностью принудительно остановить тело, когда он попал в пункт назначения, и немного повредил реалистичность сцены, но я не смог этого сделать (пытался установить как силу, так и скорость на 0, затухание до 1 и т. Д. - ничего не работало).
Ниже приведен пример кода (в двигателе Phaser sprite.body.data
указывает на p2.js физики тела):
// OUTSIDE OF THE GAME LOOP:
var magnitude = game.physics.p2.pxmi(-speed);
var angle = entity.body.data.angle + Math.PI/2;
var forceX = (magnitude * Math.cos(angle))/10;
var forceY = (magnitude * Math.sin(angle))/10;
// IN THE GAME LOOP:
sprite.body.data.force[0] = forceX;
sprite.body.data.force[1] = forceY;
// Decrease forceX and forceY as the body approaches the destination
Может кто-нибудь, пожалуйста, предоставить некоторые предложения? Я потерялся в этот момент, поэтому я мог даже использовать образованное предположение от кого-то, знакомого с каким-то другим физическим движком.
спасибо.
Можете вы добавить код для того, что вы пробовали, поэтому у нас есть отправная точка, чтобы помочь? –
@JamesSkemp Я добавил код. Я бы очень хотел получить второй подход к работе. В настоящее время я уменьшаю силу на осях X и Y, так как спрайт приближается к месту назначения, пока в конце концов они не равны нулю. Это работает, но если процессор очень занят, спрайт начинает двигаться неустойчиво (что следует ожидать) и в конечном итоге выходит за пределы точки назначения. – AdrianT