我正在开发2D游戏开发项目。 这是一种棋盘游戏。
作为背景我有路径的棋盘游戏,这不是真正的圆圈,而是某种波浪线。 物体正在穿过那条路。
触摸事件......我需要让我的玩家的物体到达那个确切的位置,但他们需要遵循这条路径。
如何在某个自定义路径上翻译(绘制)对象?
答案 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);
}