Движение юнита по карте — вопрос выбора архитектуры?
Суть такова.
Есть класс Unit.
Есть класс World, который содержит массив юнитов и карту местности.
Нужно каким то образом реализовать движение юнита по карте.
Есть два метода решения:
1)Можно создать статический член — указатель на World для класса Unit, и двигать юнита вызовом Unit[u].Move(World.Map, new Point(x,y)). Таким образом, реализация Move() ложится на плечи Unit'a. Проблема в том, что на мой взгляд плохо давать юниту возможность управления целым миром.
2)Можно реализовать Move() в классе World, и делать вызов World.Move(Unit[u], new Point(x,y). Проблема в том, что методов может быть много (move,attack,follow, etc), и это является немного не логичным — реализовывать методы юнитов в классе Мира.
чтобы он в результате своего перемещения мог поменять положение на карте, которая хранится в классе мира. Или же, чтобы мог посмотреть на карту перед перемещением.
Ну так пусть у него меняются координаты в каких то переменных, по окончании перемещения он уведомляет мир и уже мир валидирует его координаты. Знать юниту о мире для передвижения — совсем не айс.
Так в этом то и загвоздка. Как уведомить мир что то сделать (из функции юнита, в данном случае уведомить о движении), не давая ссылки на него (мир). А что если подписать мир на ивент onUnitMove?
Тут есть несколько вариантов, зависит от внутренней реализации:
— в юнит передается колбек, который он должен дернуть по окончании движения. Колбек будет из мира, в нем будет валидироваться положение. ПО колбеку юнит миру ничего не сделает
— диспатчить событие завершения хода, на которое подписан мир
— перемещать юнит каждый апдейт из мира (или просто дергать его — готов ли он к проверке) и после перемещения валидировать. Тогда валидация будет на каждом шаге.