Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 31.12.2017, 15:31
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 101  
Ответить с цитированием
Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 241
Напишу, чем по итогу сердце успокоилось в моём вопросе по поводу создания наследников Action-ов. Я использовал главный цимус паттерна "Фабрика", что создание новых экземпляров фактически оторвано от класса-клиента, использующего их. Собственно, так и сделал, но пока без лишних прибамбасов - создал новый класс ActionFactory, который на входе получает все те же вводные: одного из наследников ActionData и экземпляры Character, и возвращает новый экземпляр нужного наследника Action. А внутри тупо перебирает ActionDat-ы через "if is". Грубо, но работает. А сам факт того, что процесс вынесен в отдельный класс, во-первых, нормально воспринимается визуально, и во-вторых, позволит мне позднее вернуться к этому вопросу и сделать лучше. Наверное, большего пока и не требуется. Можно двигаться дальше.

[offtopic] Я от всей души поздравляю с наступающим новым годом всех форумчан и особенно дорогих и уважаемых экспертов. Удачи вам, ребята, успехов и хорошей имплементации всех ваших идей и жизнь. Чтобы наследовалось всё самое лучшее, проблемы делегировались кому-то на сторону, а исключения возникали только приятные, и не в коде, а в жизни
Я искренне рад, что в уходящем году познакомился с вами. [/offtopic]
__________________
Не сломано - не чини!

Старый 28.01.2018, 22:44
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 102  
Ответить с цитированием
Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 241
Друзья! Вновь прошу помочь и опять скорее с принципиальным решением, нежели чем с конкретной реализацией. Я добрался до самого важного - до подготовки и вывода игроку контекстных текстов. Вместе с артами это главное, что должно быть сделано, и сделано хорошо. Под хорошо я подразумеваю гибкий подбор нужных фраз в зависимости от значений различных игровых свойств. Так например, если наш персонаж наносит врагу удар, то в зависимости от его силы и скилла для выбранного оружия, игрок должен увидеть:

1. высокая сила, высокий скилл: "Идеально рассчитав момент, Вы нанесли удар сокрушительной силы"
2. высокая сила, низкий скилл: "Вы рубанули со всей дури, впрочем, не особо контролируя, куда прилетает острие вашего оружия"
3. низкая сила, высокий скилл: "Вы отлично рассчитали траекторию, однако вам не хватило силы как следует вложиться в удар."
...и так далее.

Решать данную задачу чисто математически, совершая какие-либо действия над численными значениями интересующих свойств и анализируя результат, я даже не стал пытаться. Если определяющих свойств два, то ещё можно придумать что-то типа метода наименьших квадратов, но если их 3 или 5, то такая модель становится нерешаемой.

При этом, разумеется, решение должно обеспечивать приличный уровень абстракции, чтобы не переписывать весь механизм под каждую конкретную ситуацию. Мне пока придумался (и уже реализован) такой вариант. Я определяю набор свойств, влияющих на текст (сила и скилл из примера выше), и проверяю их значения, используя уже существующий способ проверки условий доступности игровых действий. Каждая проверка возвращает результат true или false. Таким образом, для описанного в примере случая я по очереди проверяю:
  • сила больше N?
  • сила меньше M?
  • скилл больше N?
  • скилл меньше M?
и кодирую результат с помощью 1 или 0. Таким образом, на выходе получается последовательность типа String вида 0110 для низкой силы и высокого скилла или 0001 для средней силы и низкого скилла, а если все значения средние, то будет 0000 и т.д.

Полученный код отправляется в парсер, который загружает из ActionData заранее заготовленные варианты интерпретации таких последовательностей. Они построены по следующему принципу: 0 или 1 требуют строгого соответствия, а Х означает, что данный показатель не важен и подойдёт любой. Каждой комбинации соответствует свой вариант текста, портрет для вывода и т.п. Варианты сравниваются сверху вниз, чуть только соответствие найдено, алгоритм прекращает свою работу и возвращает найденные ID. А поставив в конец XXXX, мы гарантированно получаем вариант по умолчанию, мимо которого уже точно не проскочишь.

Выглядит примерно так:
Код AS3:
private const reactionProfile: Array =
			[
				{code: "1010", profileID: "mightySkilledPunch"},
				{code: "1001", profileID: "mightyUnskilledPunch"},
				{code: "10XX", profileID: "mightyPunch"},
				{code: "XXXX", profileID: "default"}
			];
Беда в том, что мне пока совсем не нравится то, что получилось. Главная проблема - читабельность и наглядность. Сказать, что они плохие - ничего не сказать! Буквально отошёл сварить кофейку, ответил на телефон, и вернувшись, смотрю как баран на эти единицы и нули. А учитывая, что для разных действий и разных ситуаций, под этими 1, 0, Х могут быть совершенно разные свойства, то совсем никуда не годится.

Надеюсь, понятно объяснил. Если у кого есть идеи как улучшить, буду признателен.
__________________
Не сломано - не чини!

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:57.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.