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);
                }
           }
      }

私が抱えている問題は、敵をこの道に従わせることができないということです。回転によっては、パスの反対側に移動する可能性があります。たとえば、画面の下部に向かって移動するときは1 cll右に移動しすぎますが、上に戻るときは、パスが描画されている右側のセルにあります。私はこれを地図で操作し、長方形を使用して描画しました。

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 に答える