对象遵循自定义路径

时间:2012-02-06 18:46:24

标签: android path draw android-canvas

我正在开发2D游戏开发项目。 这是一种棋盘游戏。

作为背景我有路径的棋盘游戏,这不是真正的圆圈,而是某种波浪线。 物体正在穿过那条路。

触摸事件......我需要让我的玩家的物体到达那个确切的位置,但他们需要遵循这条路径。

如何在某个自定义路径上翻译(绘制)对象?

2 个答案:

答案 0 :(得分:2)

您可以使用实际Path对象在Canvas上绘制路径(即波浪线),然后使用PathMeasure计算沿{{1}的X,Y位置}}

因此,如果您想要在屏幕上绘制一个似乎沿着路径移动的对象,您可以通过调用Path将对象顺序移动到X,Y位置,每次提供{{1带有递增(或递减)距离参数。我想你需要创建一个简单的算法(可能使用一些迭代逻辑)来确定沿着路径的哪个距离最接近实际的触摸X,Y坐标。您可能还会保留移动对象的当前位置,不仅包括当前的X,Y,还包括它在getPosTan()上的距离。然后,当您移动对象时,逐渐在当前距离和新目标距离之间移动它,使用这些距离调用getPosTan()以获得放置对象的X,Y位置。

这是我的头脑,我还没有尝试过。希望它有一定道理。

答案 1 :(得分:2)

我想出了这个简单的解决方案,我没有注意到性能,'我需要保持简单。

我使用Path和PathMeasure对象创建了类,mapPath是该类的实例。 我从touchEvent中获取了x和y坐标,并将它们作为参数提供给我的函数。

我使用简单函数来计算两个向量之间的距离,路径上的像素和从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);
}