オブジェクトが一度に複数のオブジェクトに引き付けられる小さなゲームをデザインしています。私がやっていることは、これらのオブジェクトのショットがとるコースをプロットすることです。
惑星の引力を計算するために、私は次の式を使用しています: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);
}
}