2015-11-30 3 views
1

Я пытаюсь создать игру с шашками, и в настоящее время я пытаюсь реализовать перемещение частей. Для этого я решил, что держать список, где части должны быть: blackPieces whitePiecesудаление всех узлов типа в GridPane

Затем, когда движение производится, я бы:

  1. обновление соответствующий список
  2. цикл через всех детей GridPane
  3. удалить все элементы шашек, т.е. все узлы типа Circle
  4. добавить новые изделия согласно соответствующему списку

Однако, я застрял на шаге 3, с помощью следующего кода Groovy я просто получить ConcurrentModificationException

def children = board.getChildren() 
for (child in children) { 
    if (child instanceof Circle) { 
     board.getChildren().remove(child) 
    } 
} 

Есть ли способ сделать это без перерисовки всей сцены?

Цените любую помощь!

+0

Вам нужен итератор для удаления во время цикла. –

+1

В Java вы можете сделать 'board.getChildren(). RemoveIf (Circle.class :: isInstance);'. Я не уверен, есть ли эквивалентная конструкция в Groovy. –

ответ

2

Существует еще более простой способ, благодаря методу groovy removeAll, который берет замыкание.

board.getChildren().removeAll{ it instanceof Circle } 
0

Wow so randomly browsing Groovy cheat sheets и методы сбора Я собрал это решение.

def pieces = board.getChildren().findAll { it instanceof Circle } // gets all the pieces 
board.getChildren().removeAll(pieces) // removes them 

выиграть.

1

You shouldn't use instanceof. Что вам нужно сделать, это программа против интерфейса, isntead против реализации. Под этим я подразумеваю, что все черно-белые части реализуют интерфейс, возможно Piece. Затем добавьте свой грид-панель в классы, которые реализуют Piece. В вашем интерфейсе Piece у вас может быть метод, возможно isCircle(), который делает очевидную проверку. Теперь вы можете использовать свое решение, но используя метод isCircle().

+1

Это не будет работать, потому что другие узлы в списке дочерних элементов «GridPane» не имеют метода 'isCircle(). Если вы хотите избежать 'instanceof', вы должны, вероятно, сохранить фрагменты в отдельной структуре данных. После этого вы довольно быстро переходите к реализации отдельного класса модели и следуете подходу MVC/MVP. –

+0

Вот почему я предложил, чтобы все узлы в «GridPane» реализовали интерфейс 'Piece', и пусть' Piece' имеет метод isCircle(). Но вы правы, MVC/MVP и отдельная структура данных, вероятно, лучше разрабатываются. –

+0

Я не вижу, как это работает, но, может быть, я чего-то не хватает. Обеспечьте быструю реализацию, если у вас есть время. Разумеется, он не решает исходную проблему 'для (дочерний элемент у детей) {if (child.isCircle()) {children.remove (child);}}' все еще выбрасывает 'ConcurrentModificationException', но вы знали, что уже, я думаю. –

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