0

オブジェクトが一度に複数のオブジェクトに引き付けられる小さなゲームをデザインしています。私がやっていることは、これらのオブジェクトのショットがとるコースをプロットすることです。

惑星の引力を計算するために、私は次の式を使用しています:gravityStr / distToTarg ^ 2(擬似コード)。私の問題は、ショットを移動する必要がある方向(およびその後のcosとsine)を計算することです。以下は私の「ショット」クラスのコードです。

ここに含まれていない他のクラスは、XY値(フォームの左上が0,0)を持つ「Planet」クラスです。重力(引っ張りの強さ)と同様に。

起こっているように見えるのは、惑星が私のショットを拒否することです。planetModYとplanetModXの符号を逆にしてみましたが、STRANGER効果もあります。

ショットが惑星の右上から始まったとき、およびそれが下に向かって右に移動しているときに、ショットが機能しているように見えることは注目に値します。

コードの修正だけでなく、いくつかの答えを本当に感謝します。

C#:

public class Shot
{
    static public Shot[] Shots = new Shot[0];
    static public int shotSteps = 3000;

    public const double rad = Math.PI / 180;

    PointF[] PointFs = new PointF[0];

    public Shot(int x, int y, int dir, int pow)
    {
        addShot(this);
        double cos = Math.Cos((dir * rad));
        double sin = Math.Sin((dir * rad));

        addPoint(new PointF(x, y));
        addPoint(new PointF((float)(cos * pow + x), (float)(sin * pow + y)));

        for (int step = 2; step < shotSteps; step++)
        {
            PointF prevPrevPoint = PointFs[step - 2];
            PointF prevPoint = PointFs[step - 1];

            Double radians = Math.Atan2(prevPoint.Y - prevPrevPoint.Y, prevPoint.X - prevPrevPoint.X);
            Double curCos = Math.Cos(radians);
            Double curSin = Math.Sin(radians);

            PointF curPoint = new PointF(prevPoint.X + (float)curCos * pow, prevPoint.Y + (float)curSin * pow);


            int planetModX = 0;
            int planetModY = 0;

            for (short index = 0; index < Planet.Planets.Length; index++)
            {
                Planet curPlanet = Planet.Planets[index];
                double planetRadians = Math.Atan2(curPoint.Y - curPlanet.Y, curPoint.X - curPlanet.X);
                double planetCos = Math.Cos(planetRadians);
                double planetSin = Math.Sin(planetRadians);

                double planetShotDist = distTo(curPlanet.X, curPlanet.Y, curPoint.X, curPoint.Y);

                double pullPower = curPlanet.Gravity / (planetShotDist * planetShotDist);
                planetModY += (int)(planetSin * pullPower);
                planetModY += (int)(planetCos * pullPower);
            }

            curPoint.X += planetModX;
            curPoint.Y += planetModY;

            addPoint(curPoint);
        }
    }
4

1 に答える 1

1

ヒント!各オブジェクトには、位置だけでなく速度もあります。各ステップでは、オブジェクトの加速度ごとに速度が変化し、速度ごとに位置が変化します (2 次システム)。各重力ペアの総寄与がオブジェクトであるかを把握し、それらをベクトル的に追加する場合に必要なこと。

もし私があなたにギリシャ語を話しているのなら (私がギリシャ人だからという理由以外に)、ベクトル力学を説明している物理学の本への紹介が必要です.

また、2 つのオブジェクトが互いに近すぎて、重力が大きくなり、距離ステップが大きくなる場合も考えてください。これは、安定して楽しめるようにするための簡単な問題ではありませんが、可能です。成功すれば、それは非常に喜ばしいことです。

これは、他の誰かが同様の方法で行ったことです(重力スクリーンセーバー)

于 2010-07-23T03:54:07.100 に答える