|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Напишу, чем по итогу сердце успокоилось в моём вопросе по поводу создания наследников Action-ов. Я использовал главный цимус паттерна "Фабрика", что создание новых экземпляров фактически оторвано от класса-клиента, использующего их. Собственно, так и сделал, но пока без лишних прибамбасов - создал новый класс ActionFactory, который на входе получает все те же вводные: одного из наследников ActionData и экземпляры Character, и возвращает новый экземпляр нужного наследника Action. А внутри тупо перебирает ActionDat-ы через "if is". Грубо, но работает. А сам факт того, что процесс вынесен в отдельный класс, во-первых, нормально воспринимается визуально, и во-вторых, позволит мне позднее вернуться к этому вопросу и сделать лучше. Наверное, большего пока и не требуется. Можно двигаться дальше.
[offtopic] Я от всей души поздравляю с наступающим новым годом всех форумчан и особенно дорогих и уважаемых экспертов. Удачи вам, ребята, успехов и хорошей имплементации всех ваших идей и жизнь. Чтобы наследовалось всё самое лучшее, проблемы делегировались кому-то на сторону, а исключения возникали только приятные, и не в коде, а в жизни Я искренне рад, что в уходящем году познакомился с вами. [/offtopic]
__________________
Не сломано - не чини! |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Друзья! Вновь прошу помочь и опять скорее с принципиальным решением, нежели чем с конкретной реализацией. Я добрался до самого важного - до подготовки и вывода игроку контекстных текстов. Вместе с артами это главное, что должно быть сделано, и сделано хорошо. Под хорошо я подразумеваю гибкий подбор нужных фраз в зависимости от значений различных игровых свойств. Так например, если наш персонаж наносит врагу удар, то в зависимости от его силы и скилла для выбранного оружия, игрок должен увидеть:
1. высокая сила, высокий скилл: "Идеально рассчитав момент, Вы нанесли удар сокрушительной силы" 2. высокая сила, низкий скилл: "Вы рубанули со всей дури, впрочем, не особо контролируя, куда прилетает острие вашего оружия" 3. низкая сила, высокий скилл: "Вы отлично рассчитали траекторию, однако вам не хватило силы как следует вложиться в удар." ...и так далее. Решать данную задачу чисто математически, совершая какие-либо действия над численными значениями интересующих свойств и анализируя результат, я даже не стал пытаться. Если определяющих свойств два, то ещё можно придумать что-то типа метода наименьших квадратов, но если их 3 или 5, то такая модель становится нерешаемой. При этом, разумеется, решение должно обеспечивать приличный уровень абстракции, чтобы не переписывать весь механизм под каждую конкретную ситуацию. Мне пока придумался (и уже реализован) такой вариант. Я определяю набор свойств, влияющих на текст (сила и скилл из примера выше), и проверяю их значения, используя уже существующий способ проверки условий доступности игровых действий. Каждая проверка возвращает результат true или false. Таким образом, для описанного в примере случая я по очереди проверяю:
Полученный код отправляется в парсер, который загружает из ActionData заранее заготовленные варианты интерпретации таких последовательностей. Они построены по следующему принципу: 0 или 1 требуют строгого соответствия, а Х означает, что данный показатель не важен и подойдёт любой. Каждой комбинации соответствует свой вариант текста, портрет для вывода и т.п. Варианты сравниваются сверху вниз, чуть только соответствие найдено, алгоритм прекращает свою работу и возвращает найденные ID. А поставив в конец XXXX, мы гарантированно получаем вариант по умолчанию, мимо которого уже точно не проскочишь. Выглядит примерно так: private const reactionProfile: Array = [ {code: "1010", profileID: "mightySkilledPunch"}, {code: "1001", profileID: "mightyUnskilledPunch"}, {code: "10XX", profileID: "mightyPunch"}, {code: "XXXX", profileID: "default"} ]; Надеюсь, понятно объяснил. Если у кого есть идеи как улучшить, буду признателен.
__________________
Не сломано - не чини! |
Часовой пояс GMT +4, время: 01:15. |
|
« Предыдущая тема | Следующая тема » |
|
|