0

この質問が少しオープンエンドである場合は申し訳ありませんが、私はC#とXNAにかなり慣れていません...そして実際、このフォーラムです!

私はゲームを作成しており、固定点 (PowerStation という名前のクラスに属する添付のスクリーン キャプチャの左下) から光線を放射し、ユーザーが移動および回転できるミラーから反射する必要があります。添付のキャプチャで動作していることがわかるように、ピクセルごとの衝突検出方法を追加しました (ミラーが赤くなります)。

ここまでのゲームのスクリーン キャップです。

現在、ポイントを作成し、衝突が検出されるまで光のパスに沿って移動することにより、ビームのパスに対する障害物をテストしようとしています。そこから移動した距離を記録し、ビーム スプライトを不均一な方法で必要な量だけ引き伸ばします。これはすでに困難であることが証明されており、この方法にはまだ長い道のりがあると思います。

障害物とその回転を検出し、ビームを反射する方向 (ミラーのどちら側に当たるか) を決定するための最善の方法について誰かアドバイスがあればと思っていました。本当に複雑ですか、それともまったく機能しませんか?

現在、私の Beam クラスは次のようになっています... 1 つを除くすべてのクラスは、Object と呼ばれる 1 つの基本クラスから継承され、オブジェクトはすべて、別のクラス Items に属する静的な objectList で宣言されます。これが悪い、乱雑なコーディングである場合はお詫びします!

        class Beam : Object
{
    private Vector2 start;
    private double length;
    private Vector2 POC;



    public Beam(Vector2 pos)
        : base(pos)
    {

        spriteName = "beam";
        depth = 0.2f;
        solid = true;
        foreach (Object o in Items.objectList)
        {
            if (o.GetType() == typeof(PowerStation))
            {
                start = o.Origin;
            }
        }
    }

    public override void Update()
    {
        Point newPoint = new Point((int)Origin.X, (int)Origin.Y);
        while ((!(collision(new Mirror(new Vector2(0, 0))))) && (newPoint.X > 0) && (newPoint.Y > 0)) // && boundaries of window
        {
            newPoint.Y--; //will be changed to a Vector
        }

        POC = PointOfCollision(new Mirror(new Vector2(0, 0))); // Need to make it do POC of newPoint, not just the Beam Object!
        length = FindLength(start, new Vector2(50, 50));
        //Scale = new Vector2( , );     //amount to scale sprite


        base.Update();
    }

    private double FindLength(Vector2 pos1, Vector2 pos2)
    {
        return (Math.Sqrt(Math.Pow(Math.Abs(pos2.X - pos1.X), 2.0f) + Math.Pow(Math.Abs(pos2.Y - pos1.Y), 2.0f)));
    }
}

どんな助けでも大歓迎です!前もって感謝します

4

2 に答える 2

3

ピクセルを忘れてください-ミラーは明らかに任意の角度になる可能性があるため、偶数ピクセルではないミラーと交差する場所が必ずあります。単純に衝突点を偶数ピクセルとしてカウントすることもできますが、ビームの経路が少し間違ってしまいます。

代わりに、ビームを取得してすべてのミラーを反復処理し、ビームとミラーの平面の交差を計算してから (交差がない場合を処理します)、交差をチェックして物理ミラー内にあることを確認します。最短距離で発生する一致を記録します。

事前にすべてのミラーの境界ボックスを計算し、ビームをチェックするときに、現在のポイントからどの象限に向かっているのかを確認することで、この計算をほぼ確実に高速化できます。それぞれ 2 つの整数比較によるミラーリング。

交差がなくなる (ビームが逃げる) か、反射するのではなくビームを止める何かにぶつかるまで繰り返します。

ミラーがたくさんある場合は、これをさらに進めて、画面をセクターに分割し、それぞれにミラーのリストを含めることができます。現在のセクターのミラーのみをチェックし、ヒットしない場合は、次に入るセクターを見つけて繰り返します。これは、単一の指示なしでほとんどのミラーを除外する代わりに、ビームの光線をキャストするもう少し数学です。ユーザーが配置したミラーを扱っている場合、それを行う価値があるほど十分な数があるとは思えません。

于 2012-06-19T04:31:53.037 に答える
1

すべてをベクトルとして表現します: 光線とそれらが跳ね返る形状の側面。次に、交点と反射角を検出するのは非常に単純な代数です。また、ピクセルベースの検出よりもはるかに高速です。

于 2012-06-19T01:05:04.123 に答える