0

我正在尝试构建一个路径系统,其中涉及使用带有航点的路径。目前我正在尝试渲染到屏幕的路径。我正在取得一些成功。

但是,我有一个问题,在这些检查点之间我需要制作“线条”。逻辑如下。

    for (int i = 0; i < paths.Count; i++)
        {
            for (int j = 0; j < paths[i].wayPoints.Count; j++)
            {
                if ((j + 1) < paths[i].wayPoints.Count)
                {
                    Vector2 point1 = paths[i].wayPoints[j];
                    Vector2 point2 = paths[i].wayPoints[j + 1];
                    Vector2 origin = new Vector2();


                    float angle = (float)Math.Atan2(point2.Y - point1.Y, point2.X - point1.X);
                    float length = Vector2.Distance(point1, point2);

                    //batch.Draw(tileTexture, new Rectangle((int)point1.X, (int)point1.Y, cellSize, cellSize), Color.White);

                    batch.Draw(tileTexture, new Vector2((int)point1.X, (int)point1.Y), null, Color.White,
                        angle, origin, new Vector2(length/40, 1),
                        SpriteEffects.None, 0);
                }
           }
      }

我遇到的问题是我无法让我的敌人走这条路。根据轮换,他们可能会走错路。例如,当它们向屏幕底部移动时,它们向右走得太远了,但是当它们返回时,它们在正确的单元格中,路径正在绘制的地方。如果有帮助的话,我可以使用地图和矩形进行绘图。

4

1 回答 1

0

您是在谈论像素完美精度吗?是的,我也遇到过这个问题,它是旋转的工作原理,它围绕像素的角落而不是像素的中间旋转所有东西。所以旋转后没有像素留在同一个位置。我放弃了试验,因为这是一件非常小的事情,当我完成所有小错误时,我可以修复它。

这是我的游戏的样子:

在此处输入图像描述

你可以看到它们相差 1 个像素,我只是接受它,因为我只是在制作一个原型,正如我所说,这是一个需要修复的小问题,我选择添加更多功能!

基本上,你需要有一个基于旋转的动态原点,让它看起来正确的确切角度范围是你只需要试验的东西。

认为,如果我正确阅读了您的路径绘制代码,您只能支持非对角线。值得一提的是,可能是您的线条图导致了错误,而不是您绘制的沿路径的对象!这是我用来画线的代码:

public void DrawLine(SpriteBatch spriteBatch, Vector2 lineStart, Vector2 lineEnd)
{
    Vector2 d = lineEnd - lineStart;

    float angle = (float)Math.Atan2(d.Y, d.X);

    float distance = d.Length() + 1;

    if (Math.Abs(angle - MathHelper.Pi) < 0.01 || 
        Math.Abs(angle + MathHelper.PiOver2) < 0.01)
    {
        distance--;
    }

    spriteBatch.Draw(ScreenManager.BlankTexture, 
        new Vector2(lineStart.X + 0.5f, lineStart.Y + 0.5f), 
        null, nodes[i].Item2, angle, new Vector2(0f, 0.5f),
        new Vector2(distance, level.GridLineThickness), 
        SpriteEffects.None, 0);
}

这对我来说效果很好,nodes[i].Item2只是一个颜色参考。据我所知,这适用于所有情况......但是它再次适用于我的工作的所有情况,我相信如果你决定使用它,你可以根据你的需要调整它。

于 2012-09-10T21:51:28.597 回答