Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Брать свойство изнутри или через геттер (http://www.flasher.ru/forum/showthread.php?t=215646)

Appleman 10.08.2018 17:55

Цитата:

Сообщение от Appleman (Сообщение 1205859)
У нас есть свойство персонажа, пусть будет тот же интеллект. На него влияют статус-эффекты и снаряжение. Если например, шлем даёт +10%, а зелье - ещё +15%, означает ли это, что, надевая шлем, я должен пересчитывать оригинальное значение? И если у нас закончилось действие зелья, а шлем всё ещё на голове, то это же можно свихнуться с обратным пересчётом из процентов. Ведь база расчёта уже изменится. Или мне придётся иметь одно "эталонное" значение в досье, а другое "оперативное" - в классе, которое я буду постоянно актуализировать?

Простите мне моё самоцитирование, вопрос для меня архиважный. Я капитально начал "тонуть" в свойствах персонажей, их хранении, обновлении и т.п. Придумал решение, гляньте опытным глазом, плиз. На примере всё того же интеллекта (любимое свойство) :)

Перенёс все поля во внутренний класс Parameters, вместе с сеттерами и геттерами. В Character имеем:
Код AS3:

private var _params: Parameters = new Parameters();

Но поле _intelligence в классе Character остаётся, в нём теперь будет храниться read-only значение интеллекта, но уже со всеми модификаторами. Забрать его можно геттером.

При изменении интеллекта (любым методом класса Character) не избежим вот такой записи, т.к. нет другого способа установки нового значения:
Код AS3:

_params.intelligence += value;

Сеттер в классе Parameters посылает событие об изменении значения (он его и так посылает, чтобы поймать и отразить изменения во Вью), это событие ловит класс Character (опять же он его и сейчас ловит). В приёмнике события ставим:

Код AS3:

_intelligence = _params.intelligence;
// Вызываем методы, проверяющие статусы и экипировку на предмет модификаторов интеллекта
// Их же вызываем при смене статусов или экипировки

Таким образом, больше не парюсь с актуальностью свойств и чётко понимаю, где брать модифицированное, а где - "чистое". Цена решения: фактическое дублирование всех полей и геттеров в и без того распухшем Character.

Что думаете?

GBee 10.08.2018 23:12

Можно сделать оригинальный Parameters со стартовыми значениями полей и активный Parameters, который пересчитывается исходя из стартового + модификаторы. И все это обернуть в какой-нить фасад (тот же Character).

А можно дублировать поля в таком же стиле. Короче вариантов миллион.

Appleman 11.08.2018 01:37

GBee, вот это ты мне удружил! Действительно, просто и гениально сделать 2 зеркальных класса. А я уже приготовился всю грядку напрямую в Character опять возвращать. Спасибо.

СлаваRa 11.08.2018 01:44

мне кажется все это уже можно было бы свернуть, если не заниматься брутофорс разработкой. Автор, стеньте первым в истории, кто изложит модель игры, правила и т.п. и потом начнем задавать вопросы про код, ну пожалуйста :)

Appleman 13.08.2018 09:54

СлаваRa, да надо бы, конечно, по-хорошему. Но диздок у меня весьма объёмный, при этом создавался он отнюдь не для демонстрации, поэтому его нужно сперва "прополоть" и "причесать". Мне представляется свинством выкатывать сюда такие "простыни", это как бы намекало уважаемой аудитории прочитать, что никто делать не нанимался.

Более того, завтра в отпуск улетаю, так что даже поучаствовать в обсуждении не смогу :)

ZergMaster 14.08.2018 13:24

можно по диздоку диаграммку зафигачить на draw.io - все должно получиться довольно лаконично и читабельно.


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

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