【问题标题】:Object following custom path遵循自定义路径的对象
【发布时间】:2012-02-28 05:50:59
【问题描述】:

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

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

在触摸事件中...我需要我的玩家的对象到达那个确切的位置,但他们需要遵循那个路径。

如何在一些自定义路径上平移(绘制)对象?

【问题讨论】:

    标签: android path draw android-canvas


    【解决方案1】:

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

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

    这不是我的想法,我还没有真正尝试过。希望它有一些意义。

    【讨论】:

    • tnx,我会尝试想出一些东西......如果我成功了,我会发布工作代码。
    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多