2016-02-19 7 views
-1

Я использую следующий метод, чтобы попытаться найти точку (координату), которая ранее не использовалась, и не находится в границах элементов, которые ранее использовались и координировались.Java: Итерация, чтобы найти точку координат, которая не была использована?

Способ, которым это работает, - это рендеринг «оснований» (игра сверху вниз RTS), и я создаю два места случайной переменной для x и y. Я передаю их вместе с основой текстуры в следующий метод. Метод проходит через список прямоугольников, которые являются прямоугольниками каждой ранее оказанной базы. Если точка находится внутри любого из прямоугольников, метод снова вызывается с использованием другого набора координат. Он делает это, пока не найдет набор, который не находится внутри прямоугольника. Затем он добавляет новый прямоугольник в список в этих координатах и ​​возвращает их, чтобы игра могла визуализировать новую базу.

Однако основания все еще перекрываются.

Вот метод:

private Point getCoords(int x, int y, Texture t){ 
    for (int i=bases.size()-1; i> -1; i--) { 
     if (bases.get(i).contains(new Point(x,y))){ 
      x = new Random().nextInt(map.getWidth() * map.getTileWidth()); 
      y = new Random().nextInt(map.getHeight() * map.getTileHeight()); 
      getCoords(x, y, t); 
     } 
    } 
    bases.add(new Rectangle(x,y,t.getImage().getWidth(), t.getImage().getHeight())); 
    return new Point(x, y); 
} 

А вот где она вызывается:

switch(ran){ 
      default: 
       int x = new Random().nextInt(map.getWidth() * map.getTileWidth()); 
       int y = new Random().nextInt(map.getHeight() * map.getTileHeight()); 
       Point p = getCoords(x, y, temp); 
       map.generateBase("air", p.x, p.y); 
       break; 
     } 

Любые идеи, что здесь не так?

Благодаря

ответ

1

Там есть несколько проблем:

  • Ваш алгоритм может быть overwritting хороших координат (бесплатные) с неправильными координатами, вы не есть любое условие выхода из цикла/рекурсии, если вы найдете хорошее место

  • Вы проверяете, содержит ли прямоугольник точку, но позже вы добавляете re ctanble, поэтому он не может содержать точку, но прямоугольник создан позже может столкнуться

попробовать это

private Point getCoords(int x, int y, Texture t){ 
    boolean found = false; 
    final int width = map.getTileWidth(); 
    final int height = map.getTileHeight(); 
    while(!found) { 
      x = new Random().nextInt(map.getWidth() * width); 
      y = new Random().nextInt(map.getHeight() * height); 
      for (int i=bases.size()-1; i> -1; i--) { 
       if (!bases.get(i).intersects(new Rectanble(x,y, width, height))){ 
         found = true; 
       } else found = false; 
      } 
    } 

     bases.add(new Rectangle(x,y,t.getImage().getWidth(), t.getImage().getHeight())); 
     return new Point(x, y); 
} 

*** EDIT: Я не уверен, если я должен был использовать TileWidth и TileHeight или ширина изображения и высота изображения для width и height: D

+0

Спасибо за ваш ответ. Однако есть проблема с этим. Я использую потоки для обновления и рендеринга игры.Цикл while заставляет поток останавливать обновление других вещей, и в данный момент многопоточность слишком сложна для задачи, настолько тривиальной. По этой причине я пытался избежать использования циклов. Есть ли другой способ этого? –

+0

Нет реальной разницы в потоке выполнения между рекурсией for + и while + for. Единственное различие может заключаться в том, что введенный вами код выполняет более легкие операции и возвращает неправильные позиции, поэтому он должен выполнять гораздо меньше итераций/вызовов для себя, чтобы найти точку. Если вы уже используете потоки, просто создайте новый, чтобы вызвать этот метод: когда у вас есть результаты, основной поток будет обновлять игру с помощью решения, но не будет блокировать поиск точки. – Nadir

1
  int x = new Random().nextInt(map.getWidth() * map.getTileHeight()); 

Может быть плохая копия пасты. Это может быть:

  int x = new Random().nextInt(map.getWidth() * map.getTileWidth()); 

В обоих кодах :-D

+0

aha спасибо, я посмотрю на это: P –

+0

Боюсь, что это не имело значения, они все еще накладываются друг на друга. Но спасибо, что указали это :) –

0

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

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