Мне непонятно, как работать с анимацией и контролем одновременно.
Анимация происходит сама-по-себе по собственной инициативе (и визуально долго, чтобы было красиво),
а контроль идёт со стороны игрока в то же самое время
прямо сейчас в freeciv интерфейс на время анимации блокируется, мне это кажется неудобным
я считаю, что недоступными должны быть только анимируемые юниты и элементы модели, задействованные в операциях анимируемых юнитов
а всё остальное должно быть доступно игроку для управления как обычно
Как обычно делают анимацию:
Пользователь выполняет действие с моделью. Действие разбивается на шаги. Шаги анимируются.
Если анимируемое действие должно быть атомарным для игрока с точки зрения управляемости, то на время выполнения шагов
анимируемые объекты становятся неуправляемыми.
пример частичной неуправляемости - корабли в полёте в игре freeorion. Они могут лететь несколько ходов, но при перенаправлении должно учитываться их состояние.
в freeciv тоже такое есть - если отправить вертолёт на несколько ходов, то он полетит с остановками каждый ход и возможностью перенаправления,
при этом планируемый путь запоминается
То есть, длинное действие разбиваем по ходам, в пределах одного хода анимация непрерываема.
Анимация занимает сколько-то шагов (для того, чтобы быть плавной).
Запускают "таймер", таймер через определенные интервалы времени вызывает событие, код которого выполняет очередной шаг анимации.
Кроме freeciv ещё есть модельная игра "плоские танки". Её отличие в том, что управление выполняется не по ходам, а "в реальном времени".
Можно ли сказать, что здесь один ход равен одному шагу анимации? Это позволило бы свести задачу к предыдущей, более сложной.
Тут можно принять решение, что для разных танков выполнение не полностью асинхронное, а синхронизируется шагами анимации.
В момент синхронизции можно вычислить положение всех элементов и сымитировать коллизии и попадания симметрично (раноправно) для взаимодействующих сторон,
чтобы не получилось что кто-то реагирует на реакцию противника из-за несовершенства имитатора (изежать, например, такой ситуации - два танка стреляют друг в друга,
оба попадают, но движек зачел первое попадание, а второе попадание не зачтено, потому что от уже "мертвого" противника).
Для пиксельной анимации это должно работать так же хорошо, как и для поклеточной (просто шаги будут попиксельные, а не поклеточные)
Для субпиксельной анимации всё это должно работать так же хорошо (просто шаги будут субпиксельные, а не попиксельные)
Вопрос в том, что если есть моменты синхронизации, то зачем нужна многопоточность? можно было бы обойтись одним потоком, который рассчитывает собственно
моменты синхронизации (конечно, ЦПУ будет лучше использоваться для расчета стратегий AI-танков, но там же мизерные затраты, или нет?)
Можно сказать, что есть две модели:
отображаемая модель и логическая модель. Отображается только часть логической модели, видимая в данный момент
(вероятно - либо меньшая по размеру, либо с меньшей детализацией прорисовки, то есть карта, а не территория).
действие переводит логическую модель из одного состояния в другое. То есть, в двух версиях модели (до и после действия)
появляются различающиеся элементы.
все действия одной стороны некоторым образом упорядочены (в порядке совершения действия пользователя, например)
можно сказать, что действие - это такая транзакция, которая должна быть выполнена целиком (atomicity).
можно поискать действия, которые не пересекаются по элементам (как найти непересекающиеся действия? (транзакции?) могут ли быть неявные зависимости? "грязное чтение", например, ещё что-нибудь?)
для того, чтобы выполнить (анимировать) такие действия параллельно (одновременно с точки зрения номеров шагов анимации)
так же можно поискать и сгруппировать групповые действия (например Ctrl-V выделили 50 юнитов, самолётов, и отправили атаковать город, в этом случае не надо
анимировать каждый поштучно в начале хода, потому что это долго)
Что надо делать, чтобы сделать? Выписать все возможные юниты и элементы модели (города, клетки, модификаторы), выписать все возможные действия,
для каждого действия научиться определять множества блокируемых элементов, научиться находить пересечения множеств, научиться составлять списки непересекающихся действий
Как избежать неравноправия искинов в freeciv? (они могут реагировать только в моменты ходов, а надо бы на каждое действие разных игроков)