Объект по пользовательскому пути - PullRequest
1 голос
/ 06 февраля 2012

Я работаю над проектом 2D Game Dev. Это какая-то настольная игра.

В качестве фона у меня настольная игра с дорожкой, это не настоящий круг, а какая-то волнистая линия. Объекты движутся по этому пути.

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

Как перевести (нарисовать) объекты по некоторому произвольному пути?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Я придумал это простое решение, я не обращал внимания на производительность, потому что мне нужно, чтобы оно было простым.

Я создал класс с объектами Path и PathMeasure, mapPath - этоэкземпляр этого класса.Я взял координаты x и y из touchEvent и передал их в качестве параметров своей функции.

Я использую простую функцию для вычисления расстояния между двумя векторами, моими пикселями на пути и вектором, полученным из touchEvent.

Итерация, пока я не получу минимальное расстояние между ними.

Когда я получаю координаты x и y моего пути, где мне нужно разместить свой объект, я просто переводю объект в эти координаты.

Это так просто, но немного грязно :) Надеюсь, кто-нибудь может использовать его когда-нибудь, в час нужды.Ура;)

//Find point on path closest to touch coordinates    

public float[] findMinDistanceVector(int x, int y) {

 float[] xy = new float[2];
 float[] ten = new float[2];

 float distanceVectorOld = Float.MAX_VALUE;
 float distanceVectorNew = 0;
 float[] minXY = new float[2];
 for (float distance = 0; distance < mapPath.pathMeasure.getLength();distance++) {

 mapPath.pathMeasure.getPosTan(distance, xy, ten);

 distanceVectorNew = dist(x, y, xy[0], xy[1]);

      if (distanceVectorNew < distanceVectorOld) {

          minXY[0] = xy[0];
          minXY[1] = xy[1];
          distanceVectorOld = distanceVectorNew;

      }
 }

return minXY;
}

public float dist(float x1, float y1, float x2, float y2) {

    float distX = x1 - x2;
    float distY = y1 - y2;

    // Pythagora's theorem
    return FloatMath.sqrt(distX * distX + distY * distY);
}
2 голосов
/ 06 февраля 2012

Вы можете нарисовать свой путь (то есть свою волнистую линию), используя фактический объект Path на Canvas, а затем использовать PathMeasure , чтобы вычислить позиции X, Y вдоль этой Path.

Поэтому, если вы хотите нарисовать объект на экране, который, кажется, движется вдоль пути, вы бы последовательно перемещали свой объект в позиции X, Y, которые обеспечиваются вызовом getPosTan(), каждый раз предоставляя getPosTan()с увеличивающимся (или уменьшающимся) аргументом расстояния.Я предполагаю, что вам нужно создать простой алгоритм (возможно, с использованием некоторой логики итерации), который определяет, какое расстояние вдоль пути является ближайшим к фактической координате X, Y касания.Вы также можете сохранить текущую позицию вашего движущегося объекта не только с точки зрения его текущего X, Y, но и с точки зрения его расстояния вдоль вашего Path.Затем, когда вы приходите перемещать объект, вы постепенно перемещаете его между текущим и новым целевым расстоянием, вызывая getPosTan() с этими расстояниями, чтобы получить позиции X, Y для размещения вашего объекта.

Это не в моей голове, и я на самом деле не пробовал.Надеюсь, в этом есть смысл.

...