【发布时间】:2012-02-28 05:50:59
【问题描述】:
我正在开发 2d 游戏开发项目。 这是某种棋盘游戏。
作为背景,我有带路径的棋盘游戏,那不是真正的圆圈,而是某种波浪线。 物体正在这条路径上移动。
在触摸事件中...我需要我的玩家的对象到达那个确切的位置,但他们需要遵循那个路径。
如何在一些自定义路径上平移(绘制)对象?
【问题讨论】:
标签: android path draw android-canvas
我正在开发 2d 游戏开发项目。 这是某种棋盘游戏。
作为背景,我有带路径的棋盘游戏,那不是真正的圆圈,而是某种波浪线。 物体正在这条路径上移动。
在触摸事件中...我需要我的玩家的对象到达那个确切的位置,但他们需要遵循那个路径。
如何在一些自定义路径上平移(绘制)对象?
【问题讨论】:
标签: android path draw android-canvas
您可以使用实际的 Path 对象在 Canvas 上绘制路径(即波浪线),然后使用 PathMeasure 计算沿 Path 的 X、Y 位置。
因此,如果您想在屏幕上绘制一个看起来沿着路径移动的对象,您需要将对象依次移动到通过调用getPosTan() 提供的 X、Y 位置,每次都为getPosTan() 提供一个递增(或递减)距离参数。我想您需要创建一个简单的算法(可能使用一些迭代逻辑)来确定沿路径的距离最接近实际的触摸 X、Y 坐标。您还可以保留移动对象的当前位置,不仅根据其当前 X、Y,还根据其沿您的 Path 的距离。然后,当您开始移动对象时,您会逐渐在当前和新目标距离之间移动它,并使用这些距离调用getPosTan() 以获得放置对象的 X、Y 位置。
这不是我的想法,我还没有真正尝试过。希望它有一些意义。
【讨论】:
我想出了这个简单的解决方案,我没有关注性能,因为我需要保持简单。
我用 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);
}
【讨论】: