2016-03-20 4 views
2

Я пытаюсь переместить динамическое тело из точки A в точку B, используя Phaser 2.4.6 и версию p2.js, включенную в нее. Очень важно, чтобы тело точно остановилось в точке назначения, а не за точкой или после ее прохождения (допустимы очень низкие допуски). Я пробовал два подхода до сих пор, и не удался с обоими:«Прецизионное перемещение» тела с использованием физики Phaser и p2.js

  • Используйте анимацию Phaser, чтобы изменить координаты тела по всему маршруту, в котором я хочу, чтобы он двигался дальше. Это прекрасно работает, за исключением того, что тело может пропустить статические тела.

Using a Phaser tween

Пример кода:

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 

Может кто-нибудь, пожалуйста, предоставить некоторые предложения? Я потерялся в этот момент, поэтому я мог даже использовать образованное предположение от кого-то, знакомого с каким-то другим физическим движком.

спасибо.

+0

Можете вы добавить код для того, что вы пробовали, поэтому у нас есть отправная точка, чтобы помочь? –

+0

@JamesSkemp Я добавил код. Я бы очень хотел получить второй подход к работе. В настоящее время я уменьшаю силу на осях X и Y, так как спрайт приближается к месту назначения, пока в конце концов они не равны нулю. Это работает, но если процессор очень занят, спрайт начинает двигаться неустойчиво (что следует ожидать) и в конечном итоге выходит за пределы точки назначения. – AdrianT

ответ

1

Я не играл с физикой широко, но из того, что я видел, перемещение тела с физикой обычно осуществляется через body.velocity.

См быстрый пример я ставлю вместе: http://phaser.io/sandbox/wUGlsnRx

+0

Я просто попробовал использовать 'velocity', но получаю те же результаты, что и с использованием свойства' force', которое является спрайтом, заканчивающимся выше точки назначения в сценариях, где процессор очень занят. Кажется невозможным, чтобы спрайт точно и последовательно останавливался в точке назначения. Я думаю, что, возможно, начну смотреть на использование ограничения расстояния, но я надеялся найти более простое решение. – AdrianT

0

@Kamen Минков прав. Если вы хотите использовать физику, то вы не можете подгонять свои тела или вручную менять позицию. Вы упомянули, что у него проблемы с высокой нагрузкой, может быть, это проблема с производительностью P2? Here's something similar for 3D games. Является ли аркадная физика опцией для вашей 2D-игры?

этот метод крайне бедна на производительность, потому что ваш коллайдер состоит из целого много вершин, которые он постоянно должен обновлять каждый кадр, и это гораздо более вычислительно дорогой, чтобы увидеть, если что-то столкнулся с ним из-за его нечетная форма. Гораздо гораздо быстрее использовать «капсульный» коллайдер для человеческого персонажа, который представляет собой просто цилиндр с закругленными вершинами, который примерно соответствует размеру вашего персонажа. Это намного проще в памяти, и гораздо быстрее вычислить столкновение на такой простой форме.

У вас также нет need a special outlining for P2 physics? Возможно, есть проблема с этим. Проверьте свое изображение в Physics Editor.

Проверьте P2 example, чтобы убедиться, что вы правильно настроили его.

Смежные вопросы