анимация исчезновения цвета для ячеек сетки в свинг-булавке - PullRequest
0 голосов
/ 26 марта 2011

Я занимаюсь поиском путей в рамках 4-го курса обучения программисту. Предполагается, что мы дадим визуальное представление для множества алгоритмов поиска пути нескольких агентов. Самым простым является A *, адаптированный для мультиагентов.

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

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

Я использую адаптированную версию шаблона проектирования наблюдателя для отправки событий со своего уровня алгоритма на уровень моего контроллера и GUI. То, что я хочу сделать в слое GUI, это каждый раз, когда плитка добавляется в открытый список, я хочу, чтобы эта ячейка была окрашена в какой-то цвет, а затем постепенно исчезала в соответствии с предопределенным таймером или, возможно, позже добавляла ползунок для управления. этот таймер.

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

Так, каков наилучший способ достижения результатов, которые я ищу? Должен ли я просто открыть отдельный поток для каждой анимации или иметь готовый поток для каждой ячейки? Будет ли это излишним для приложения, поскольку может быть до 1000 ячеек и, следовательно, около 1000 потоков, выполняющих анимацию.

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

Надеюсь, я достаточно ясно понял, чего я пытаюсь достичь, если у кого-то есть какие-либо идеи или они думают, что это действительно может помочь мне в моем проекте.

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Вы можете найти Библиотека анимации Trident полезной. Больше информации на http://kenai.com/projects/trident/pages/Home

1 голос
/ 26 марта 2011

Я бы использовал javax.swing.Timer и AlphaComposite, как показано здесь .

1 голос
/ 26 марта 2011

Я бы рассмотрел сценарий только с одним потоком анимации. Вы можете, например, попробуйте следующую стратегию:

  • стандартный поток событий для событий свинга
  • один рабочий поток для вашей логики
  • только один дополнительный для всех анимаций

Этот третий поток управляет всей анимацией в вашем графическом интерфейсе. Поэтому он поддерживает список действий анимации для выполнения вместе с их отметкой времени. Такое действие может быть, например, msgstr "установить цвет ячейки [1,2] в CF0000 @ 17:01:00" в соответствующей структуре данных. Этот список действий затем заполняется рабочим потоком анимационными действиями (например, вы можете добавить сразу несколько действий для исчезающей ячейки - 1), установленным на 100% @ now; 2) установить 75% @ сейчас + 10с; 3) установите 50% @ сейчас + 20с ...). Убедитесь, что этот список правильно синхронизирован, так как к нему будут обращаться из обоих потоков.

Если вы сохраняете этот список отсортированным по отметке времени, довольно легко определить, какие действия должен выполнять этот поток в любое время. Этот поток имеет довольно простой цикл, например, что-то вроде

while(true) {
    AnimationAction action = list.get(0);
    if(action!=null && action.timestamp <= now()) {
            action.perform(); // <= be sure that paint events occur in the edt
        list.remove(0);
        continue;
    }
    sleep(...);
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...