Как мне реализовать несколько источников гравитации, в частности, триггер требуется.(C #) VS 2010 - PullRequest
0 голосов
/ 15 июля 2010

Я разрабатываю небольшую игру, в которой объекты притягиваются несколькими объектами одновременно.То, что я делаю, это намечает курс, который будут делать снимки этих объектов.

Чтобы рассчитать притяжение планет, я использую эту формулу: gravityStr / distToTarg ^ 2 (псевдокод).Моя проблема в том, чтобы вычислить направление (а затем и cos, и синус), по которому мне нужно переместить выстрел.Ниже приведен код моего класса «Выстрел».

Другие классы, не включенные здесь, это класс "Планета", который имеет значение XY (где верхний левый угол формы равен 0,0).А также гравитация (сила притяжения).

То, что, похоже, происходит, - это планеты, ОТВЕТЯЩИЕ на мои выстрелы.Я пытался поменять знак 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);
        }
    }

1 Ответ

1 голос
/ 23 июля 2010

Подсказка!Каждый объект имеет не только позицию, но и скорость.На каждом шаге скорость изменяется в зависимости от ускорения объекта, а позиция - в зависимости от скорости (система 2-го порядка).Что вам нужно сделать, если выяснить, какой общий вклад каждой пары гравитации является объектом, и добавить их в векторе.

Если я говорю с вами по-гречески (кроме того, что я грек), то вам нужно введениев книгу по физике, где они описывают векторную механику.

Также рассмотрим случай, когда два объекта расположены слишком близко друг к другу, что приводит к большим силам гравитации и большим шагам на расстоянии.Это не тривиальная проблема, чтобы сделать его достаточно стабильным, чтобы быть приятным, но это возможно.Если вам это удастся, это будет очень приятно.

Вот то, что кто-то сделал подобным образом ( Gravity Screensaver)

...