0

我正在设计一个小游戏,其中对象一次被多个对象吸引。我正在做的是绘制这些物体的拍摄路线。

为了计算行星的拉力,我使用这个公式:gravityStr/distToTarg^2(伪代码)。我的问题在于计算我需要移动镜头的方向(以及随后的余弦和正弦)。下面是我的“Shot”类的代码。

此处未包括的其他类是“Planet”类,它具有 XY 值(表单的左上角为 0,0)。以及重力(拉力)。

似乎发生了什么,是行星击退了我的镜头。我试过反转planetModY 和planetModX 的符号,但我得到了更奇怪的效果。

值得注意的是,当它从行星的右上角开始,以及向下和向右移动时,它似乎有效。

我真的会欣赏一些答案以及代码更正。

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

暗示!每个物体不仅有位置,还有速度。在每一步,速度随物体加速度变化,位置随速度变化(二阶系统)。如果找出每个重力对的总贡献是对象并以矢量方式添加它们,您需要做什么。

如果我对你说希腊语(除了因为我是希腊人),那么你需要一本介绍矢量力学的物理书。

还要考虑两个物体靠得太近导致重力大和距离步长大的情况。要使其足够稳定以令人愉快,这不是一个微不足道的问题,但这是可能的。如果你成功了,那将是非常可喜的。

这是其他人以类似方式所做的(重力屏幕保护程序)

于 2010-07-23T03:54:07.100 回答