2015-12-29 5 views
1

Я делаю 2d-игру в libgdx, и мне хотелось бы знать, какой стандартный способ перемещения (перевод между двумя известными точками) на экране.Анимационный перевод между двумя фиксированными точками (Libgdx)

Нажав кнопку, я пытаюсь оживить диагональное перемещение спрайта между двумя точками. Я знаю координаты x и y начальной и конечной точки. Однако я не могу понять математику, которая определяет, где текстура должна быть между каждым вызовом для рендеринга. На данный момент мой алгоритм вроде как:

textureProperty = new TextureProperty(); 
firstPtX = textureProperty.currentLocationX 
firstPtY = textureProperty.currentLocationY 
nextPtX = textureProperty.getNextLocationX() 
nextPtX = textureProperty.getNextLocationX() 
diffX = nextPtX - firstPtX 
diffY = nextPtY - firstPtY 
deltaX = diffX/speedFactor // Arbitrary, controlls speed of the translation 
deltaX = diffX/speedFactor 
renderLocX = textureProperty.renderLocX() 
renderLocY = textureProperty.renderLocY() 
if(textureProperty.getFirstPoint() != textureProperty.getNextPoint()){ 
    animating = true 
} 
if (animating) { 
    newLocationX = renderLocX + deltaX 
    newLocationY = renderLocY + deltaY 
    textureProperty.setRenderPoint(renderLocX, renderLocY) 
} 
if (textureProperty.getRenderPoint() == textureProperty.getNextPoint()){ 
    animating = false 
    textureProperty.setFirstPoint(textureProperty.getNextPoint()) 
} 
batch.draw(texture, textureProperty.renderLocX(), textureProperty.renderLocY()) 

Однако, я могу предвидеть несколько проблем с этим кодом. 1) Поскольку пиксели являются целыми числами, если я делю это число на то, что не идет равномерно, оно будет округлено. 2) в результате числа 1 он пропустит цель.

Также, когда я тестирую анимацию, объекты, перемещающиеся из точки 1, пропускают длинный снимок, что предполагает, что что-то может быть неправильно с моей математикой.

Вот что я имею в виду графически:

Желаемый результат: Desired Outcome

Фактический результат:

Actual Outcome

Несомненно, это стандартная проблема. Я приветствую любые предложения.

ответ

0

Прежде всего, вам нужен Vector2 direction, дающий направление между двумя точками.
Это Vector должна быть нормализована, так что его длина составляет 1:

Vector2 dir = new Vector2(x2-x1,y2-y1).nor(); 

Затем в методе render вам нужно переместить объект, который означает, что вы должны изменить это положение. У вас есть speed (задано на расстоянии/в секундах), нормализованный Vector, указав направление и время с момента последнего обновления.
Таким образом, новая позиция может быть рассчитана следующим образом:

position.x += speed * delta * dir.x; 
position.y += speed * delta * dir.y; 

Теперь вам нужно только, чтобы ограничить позицию целевой позиции, так что вы не перебарщивать:

boolean stop = false; 
if (position.x >= target.x) { 
    position.x = target.x; 
    stop = true; 
} 
if (position.y >= target.y) { 
    position.y = target.y; 
    stop = true; 
} 

сейчас к проблеме с пикселем:
Не используйте пиксели! Использование пикселей сделает ваше разрешение игры зависимым.
Используйте Libgdx Viewport и Camera вместо этого. Это позволяет вам рассчитать все в своем собственном мировом блоке (например, meter), и Libgdx преобразует его для вас.

0

Предположим, у вас есть начальные координаты X1, Y1 и конечные координаты X2, Y2. И предположим, что у вас есть переменная p, которая имеет преимущество передаваемого пути. Поэтому, если p == 0 означает, что вы находитесь на X1, Y1 и p == 100, это означает, что вы находитесь на X2, Y2, и если 0<p<100 вы находитесь где-то посередине.В этом случае вы можете рассчитать текущие координаты в зависимости от р, как:

X = X1 + ((X2 - X1)*p)/100; 
Y = Y1 + ((Y2 - Y1)*p)/100; 

Таким образом, вы не основывая текущие COORDS на предыдущий, но вы всегда рассчитывать в зависимости от начальной и конечной точки и процент пройденного пути.

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