Я разрабатываю небольшую игру, в которой объекты притягиваются несколькими объектами одновременно.То, что я делаю, это намечает курс, который будут делать снимки этих объектов.
Чтобы рассчитать притяжение планет, я использую эту формулу: 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);
}
}