2016-05-26 3 views
0

Я ищу некоторую помощь с кодом игры, который я унаследовал от полета sim. Приведенный ниже код имитирует взрывы бомб на земле, он отлично работает, но я пытаюсь его доработать.Наведение точек по прямой линии из случайной стартовой позиции

В настоящее время он принимает случайное значение для x и y в качестве начальной точки, а затем добавляет к этому случайное значение от -20 до 20. Он работает нормально, но не имитирует бомбы, падающие очень хорошо, поскольку рисунок не лежит вдоль прямой линии/

То, что я хотел бы достичь, но все х и у точек после первых случайных значений, прямую линию, так что эффекты, вызываемые для всех, кажутся лежащими в линии. Не имеет значения, в каком направлении линия ориентирована.

Спасибо за любую помощь

башмака

public static class BombUnit extends CandCGeneric 
{ 

    public boolean danger() 
    { 
     Point3d point3d = new Point3d(); 
     pos.getAbs(point3d); 
     Vector3d vector3d = new Vector3d(); 
     Random random = new Random(); 
     Aircraft aircraft = War.GetNearestEnemyAircraft(this, 10000F, 9); 
     if(counter > 10) 
     { 
      counter = 0; 
      startpoint.set(point3d.x + (double)(random.nextInt(1000) - 500), point3d.y + (double)(random.nextInt(1000) - 500), point3d.z); 
     } 
     if(aircraft != null && (aircraft instanceof TypeBomber) && aircraft.getArmy() != myArmy) 
     { 
      World.MaxVisualDistance = 50000F; 
      counter++; 
      String s = "weapon.bomb_std"; 
      startpoint.x += random.nextInt(40) - 20; 
      startpoint.y += random.nextInt(40) - 20; 
      Explosions.generate(this, startpoint, 7F, 0, 30F, !Mission.isNet()); 
      startpoint.z = World.land().HQ(startpoint.x, startpoint.y); 
      MsgExplosion.send(this, s, startpoint, getOwner(), 0.0F, 7F, 0, 30F); 
      Engine.land(); 
      int i = Landscape.getPixelMapT(Engine.land().WORLD2PIXX(startpoint.x), Engine.land().WORLD2PIXY(startpoint.y)); 
      if(firecounter < 100 && i >= 16 && i < 20) 
      { 
       Eff3DActor.New(null, null, new Loc(startpoint.x, startpoint.y, startpoint.z + 5D, 0.0F, 90F, 0.0F), 1.0F, "Effects/Smokes/CityFire3.eff", 300F); 
       firecounter++; 
      } 
      super.setTimer(15); 
     } 
     return true; 
    } 

    private static Point3d startpoint = new Point3d(); 
    private int counter; 
    private int firecounter; 


    public BombUnit() 
    { 
     counter = 11; 
     firecounter = 0; 
     Timer1 = Timer2 = 0.05F; 
    } 
} 

Image

ответ

0

я предполагаю, ваши начальный является StartPoint класса с й, у, г координат как целые числа в нем.

Надеюсь, я правильно понял вашу проблему. Похоже, вы либо хотите создать вертикальный взрыв, либо горизонтальный взрыв. Поскольку на земле всегда происходит взрыв, координата z будет равна нулю. Теперь вы можете изменить одну из координат x или y, чтобы дать вам случайный взрыв по прямой. Если вы выберете x или y, вы можете быть исправлены или могут быть рандомизированы сами. Потенциальный рандомизированное раствор ниже:

public boolean danger() { 
    // stuff 
    int orientation = Random.nextInt(2); 
    if(aircraft != null && (aircraft instanceof TypeBomber) && aircraft.getArmy() != myArmy) 
    { 
     // stuff 
     startPoint = randomizeStartPoint(orientation, startPoint); 
     // stuff 
    } 
} 

StartPoint randomizeStartPoint(int orientation, StartPoint startPoint) { 
    if(orientation == 0) { 
    startPoint.x += random.nextInt(40) - 20; 
    } 
    else { 
    startPoint.y += random.nextInt(40) - 20; 
    } 
    return startPoint; 
} 

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

Поскольку вам нужна любая случайная прямая линия, ваша проблема сводится к двум частям: 1. Создайте случайное уравнение прямой линии. 2. Создайте случайную точку вдоль этой линии.

Теперь уравнение прямой в координатной геометрии y = mx + c, где m - это наклон, а c - это постоянная, где линия пересекает ось y. Проблема с c заключается в том, что она порождает иррациональные координаты. Я предполагаю, что вы ищете только целые координаты, так как это гарантирует точное отображение ваших точек. (Вы можете делать рациональные фракции, но тогда доля, как 1/3, все равно приведет к потере точности). Лучший способ избавиться от этой иррациональной проблемы - избавиться от c. Итак, теперь ваша прямая линия всегда выглядит как y = mx. Итак, для первого шага вам нужно создать случайный m.

Затем для шага 2 вы можете либо создать случайный x, либо случайный y. Не имеет значения, какой из них, так как любой из них приведет к случайным координатам. Вот возможный код для решения:

int generateRandomSlope() { 
    return Random.nextInt(100); // arbitrarily chose 100. 
} 

int randomizeStartPoint(int m, StartPoint startPoint) { // takes the slope we generated earlier. without the slope, your points will never be on a straight line! 
    startPoint.x += random.nextInt(40) - 20; 
    startPoint.y += x * m; // because a line equation is y = mx 
    return startPoint; 
} 

public boolean danger() { 
    // stuff 
    int m = generateRandomSlope(); // you may want to generate this elsewhere so that it doesn't change each time danger() is called. 
    if(aircraft != null && (aircraft instanceof TypeBomber) && aircraft.getArmy() != myArmy) 
    { 
     // stuff 
     startPoint = randomizeStartPoint(m, startPoint); 
     // stuff 
    } 
} 

Опять же, это не является полным и лучшим решением.

+0

ritrattThanks для вашего пост – slipper23

+0

первый взрыв должен быть случайным, а остальная часть серии должна следовать по прямой линии (любое направление) от первый. Это то, что делает ваш код? – slipper23

+0

отправил изображение в первом сообщении – slipper23

0

Код в вопросе является беспорядком, но игнорирует это и пытается сосредоточиться на соответствующих частях: вы можете создать случайную позицию для первой точки и случайное направление, а затем пройти по этому направлению в несколько этапов ,

(Это все еще поднимает вопрос о том, действительно ли направление действительно. Не имеет значения, была ли сброшена только первая бомба в «действительной» области, а остальные - за пределами экрана?)

Однако соответствующий код может примерно выглядеть следующим образом:

class Bombs 
{ 
    private final Random random = new Random(0); 

    int getScreenSizeX() { ... } 
    int getScreenSizeY() { ... } 

    // Method to drop a single bomb at the given position 
    void dropBombAt(double x, double y) { ... } 


    void dropBombs(int numberOfBombs, double distanceBetweenBombs) 
    { 
     // Create a random position in the screen 
     double currentX = random.nextDouble() * getScreenSizeX(); 
     double currentY = random.nextDouble() * getScreenSizeY(); 

     // Create a random step size 
     double directionX = random.nextDouble(); 
     double directionY = random.nextDouble(); 
     double invLength = 1.0/Math.hypot(directionX, directionY); 
     double stepX = directionX * invLength * distanceBetweenBombs; 
     double stepY = directionY * invLength * distanceBetweenBombs; 

     // Drop the bombs    
     for (int i=0; i<numberOfBombs; i++) 
     { 
      dropBombAt(currentX, currentY); 
      currentX += stepX; 
      currentY += stepY; 
     } 
    } 
} 
+0

Спасибо Марко, я унаследовал код сам, и я тоже новичок в программировании, поэтому не так уж и пережил. Я попробую ваше предложение в выходные и отчитаю. Большое спасибо, что вы нашли время ответить. С уважением – slipper23

Смежные вопросы