2015-01-19 6 views
0

나는 객체 (동물)가 무작위로 이미지로 배치되는 tilePanes의 그리드가 있습니다. 그들이 실제로 이동하기 전에 그 특정 세포 (북쪽, 남쪽, 동쪽, 서쪽) 옆에있는 4 개의 슬롯/세포를 확인하여 그 안에 음식물이 있는지 확인해야합니다. 사실이라면 그쪽으로 이동하십시오. 세포. false이면 다음 방향으로 시도하거나 모두 false이면 무작위로 이동하십시오.Javafx tilePane을 통해 객체를 이동하는 방법

지금은 무작위로 움직이며, 운이 좋다면 세포에 음식물이있을 경우 먹을 것입니다. 이것은 내가 현재

private void makeAnimalsMove() { 
    Random random = new Random(); 

    // Mark all animals that they haven't moved yet 
    for (Slot[] row : slots) { 
     for (Slot slot : row) { 
      for (Animal animal : slot.getAnimals()) { 
       animal.setMoved(false); 
      } 
     } 
    } 

    // Now we move only those who needs to be moved 
    for (int row = 0; row < slots.length; row++) { 
     for (int column = 0; column < slots[row].length; column++) { 
      final Slot slot = slots[row][column]; 

      for (final Animal animal : slot.getAnimals()) { 
       if (animal.hasMoved()) { 
        continue; 
       } 

       int[][] directions = { 
        {row - 1, column}, // north 
        {row, column + 1}, // east 
        {row + 1, column}, // south 
        {row, column - 1}, // west 
       }; 

       int[] selectedDirection = directions[random.nextInt(directions.length)]; 

       // Move the animal to the chosen direction if possible 
       final int rowDirection = selectedDirection[0]; 
       final int columnDirection = selectedDirection[1]; 

       if (rowDirection >= 0 && rowDirection < slots.length && columnDirection >= 0 && columnDirection < slots[rowDirection].length) { 
        Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         slot.removeObject(animal); 
         slots[rowDirection][columnDirection].addObject(animal); 
         } 
        }); 
       } 

       // Decrease the animal's life 
       animal.setMoved(true); 
       animal.setLifeSpan(animal.getLifeSpan() - 1); 
      } 
     } 
    } 
} 

셀이 음식 소스가 포함되어있는 경우, 호출 될 '먹는'부분에 대한 별도의 방법 거기 작동 않는,있는 것입니다. 나는 움직이기 전에 4 개의 세포를 어떻게 확인 할 수 있을지 모르겠다.

답변

0

내 솔루션이 작동하려면 TilePane에서 GridPane으로 전환하는 것이 좋습니다.

당신은 쉽게 요소의 격자 그릴 수 있습니다 :

GridPane grid = new GridPane(); 
grid.add(child, columnIndex, rowIndex); 

그리고 뭔가 특정 셀에있는 경우 나중에 감지를,이 도우미로 예를 들면 : 답장을 보내

private static boolean isCellOccupied(GridPane gridPane, int column, int row) 
{ 
    return gridPane 
      .getChildren() 
      .stream() 
      .filter(Node::isManaged) 
      .anyMatch(
        n -> Objects.equals(GridPane.getRowIndex(n), row) 
          && Objects.equals(GridPane.getColumnIndex(n), 
            column)); 
} 
+0

감사합니다, 나는 그것을 바꿨고 지금은 효과가있다. –

관련 문제