2013-06-19 9 views
6

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

В принципе, я пытаюсь иметь (меняющийся) список игровых персонажей (таких как Фродо или Сэм). Игровые персонажи могут обновляться на каждом тике игры (моделируется как событие галочки). Идея состоит в том, что всякий раз, когда меняется игровой символ, запускается одиночный Event (Character), и обновление символа, наконец, отправляется по сети. Преимущество этого по сравнению с примером Asteroids.hs должно состоять в том, что целое состояние игры (весь список игровых персонажей) не нужно отправлять по сети, так как будет число событий, имеющих один игровой символ вместо одно событие с списком игровых персонажей.

Для одиночного персонажа это прекрасно работает! Я создал Behavior (Character) с mapaccum, так что сигнал обновления символа отправляется, когда символ обновляется. Проблема, которую я не могу решить, заключается в том, как сделать эту работу списком игровых персонажей Behavior.

Я пытаюсь смоделировать список символов игры как Behavior, так как персонажи могут приходить и уходить во время игры. Нужно ли мне использовать динамическое переключение событий здесь? Или, если я не использую Behavior с отдельными игровыми персонажами (и используйте только Behavior с игровым символьным списком), есть ли способ условно инициировать события обновления, когда я просматриваю список символов? Или я что-то не понимаю?

ответ

5

Для управления динамической коллекцией поведения вы должны использовать динамическое переключение событий. См. Пример BarTab.hs для демонстрации.

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

  1. Коллекция поведений известна статически. TwoCounters.hs демонстрирует, что можно просто использовать комбинаторы аппликативных функторов для вычисления значения, зависящего от любого поведения.
  2. Динамическая коллекция может быть смоделирована как поведение коллекции (Behavior [a]) в отличие от коллекции поведений ([Behavior a]). Пример использования Asteroids.hs. Это стилистический компромисс: отдельные записи коллекции больше не могут быть сформулированы с помощью FRP, но сбор становится проще в управлении.
+1

Хорошо, я как бы думал, что это может быть так. Думаю, я попробую «Поведение коллекции», как вы упомянули, и отфильтруйте неизменяемые символы позже. – ipuustin

+0

В частности, я думаю, что я буду использовать функцию «spill» для разделения события на то, что список символов обновлен до нескольких событий для обновления одного символа. – ipuustin