我正在设计一个小游戏,其中对象一次被多个对象吸引。我正在做的是绘制这些物体的拍摄路线。
为了计算行星的拉力,我使用这个公式: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);
}
}