2017-02-05 4 views
0

Я пишу настольную игру с сеткой 20x20.JavaFX прямоугольник mouseonclick grid return

Это в моем классе платы:

private final Position[][] grid = new Position[GRID_SIZE][GRID_SIZE]; 

каждая позиция имеет:

public class Position { 

    private final Coordinates pos; 
    private Player player; 

    private final static double RECTANGLE_SIZE = 40.0; 
    private final Rectangle rect = new Rectangle(RECTANGLE_SIZE, RECTANGLE_SIZE); 
} 

так в основном я 20x20 позиций и каждая из позиций имеет прямоугольник

Это то, что я делаю для отображения сетки

for (int cols = 0; cols < GRID_SIZE; ++cols) { 
    for (int rows = 0; rows < GRID_SIZE; ++rows) { 
     grid.add(gameEngine.getBoard().getGrid()[cols][rows].getRect(), cols, rows); 
    } 
} 

В любом случае, сетка инициализируется и работает правильно. То, что я хочу сделать, - сделать объекты прямоугольника интерактивными и иметь возможность возвращать их координаты при нажатии.

Это, как я обрабатывать мыши

private void setUpRectangle() { 
    rect.setOnMouseClicked(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 
      rect.setFill(Color.BLACK); 
     } 
    }); 
} 

Что делает этот код, чтобы изменить цвет прямоугольника до черного, но как я мог вернуть координаты. В принципе, я могу редактировать функцию onclick, чтобы возвращать координаты этой позиции, но как я могу их приобрести позже?

+0

Что вы подразумеваете под координатами? Вы можете попробовать 'rect.getX()' и 'rect.getY()', если это то, что вы хотите. –

+0

@Shashwat Каждая позиция имеет координаты (x, y) и объект прямоугольника. Я хочу знать, какой прямоугольник щелкнут, получая его координаты. Даже если я возвращу объект Coordinates прямоугольника, я не знаю, как его обрабатывать (дождаться их) –

+0

Где находятся координаты? Если они находятся в классе 'Position', вы можете создать ** getter ** для них. Кроме того, откуда вы хотите получить доступ к координатам, классу 'Main' или классу' Position'? –

ответ

0

Это не вопрос JavaFX, а вопрос дизайна. У вас есть контейнер (Position) из 2 объектов (Coordinates и Rectangle), и вы хотите, чтобы один из них знал о другом. То есть, прямоугольник должен знать координаты своего положения.

Здесь есть несколько подходов, и в зависимости от большей картины можно быть лучше других. James_D упомянул пару в comment.

  1. Держите ссылку на объект позиции в объекте прямоугольника. Это полезно, если прямоугольник должен получить доступ к различным данным в контейнере из разных мест. Вы бы сделали что-то вроде rectangle.getPosition().getCoordinates() или .getPlayer().
  2. Сохраните ссылку объекта координат в объекте прямоугольника. Это более конкретный подход 1, если вам нужен только этот объект. Вы бы сделали что-то вроде rectangle.getCoordinates().
  3. Передайте координаты вашему методу setUpRectangle. Это полезно, если прямоугольник не нуждается в доступе к этим данным из разных мест, это локальное решение. Затем в методе handle вы должны вернуть координаты, которые вы передали, setUpRectangle, хотя мы не можем видеть, в каком классе этот метод находится.
  4. Используйте внешнюю помощь. Вы можете оставить что-то вроде Map<Rectangle, Coordinates>, а затем позвонить map.get(rectangle). Вы можете скрыть эту карту в методе Coordinates getCoordinatesForRectangle(Rectangle rectangle) вместо прямого вызова.
0

Вы можете хранить эти данные как userData (или использовать properties в случае userData сохраняется для чего-то еще в вашей программе):

private final Rectangle rect; 

public Position() { 
    rect = new Rectangle(RECTANGLE_SIZE, RECTANGLE_SIZE); 
    rect.setUserData(this); 
} 
rect.setOnMouseClicked((MouseEvent event) -> { 
    Position pos = (Position) ((Node) event.getSource()).getUserData(); 
    ... 
}); 

Вы также можете использовать слушатель, который знает о позиции:

class CoordinateAwareListener implements EventHandler<MouseEvent> { 
    private final int coordinateX; 
    private final int coordinateY; 

    public CoordinateAwareListener(int coordinateX, int coordinateY) { 
     this.coordinateX = coordinateX; 
     this.coordinateY = coordinateY; 
    } 

    @Override 
    public void handle(MouseEvent event) { 
     // do something with the coordinates 
    } 

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