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

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

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
По умолчанию Про делегирование

Друзья! Заранее прошу простить за большую простыню, буду признателен тем, кто сподобится дочитать её до конца и ответить что-то вразумительное. Разрабатывая свою игру, я постоянно сталкиваюсь с одним и тем же вопросом, ответ на который всегда даётся мучительно, а будучи найденным, практически никогда не приносит удовлетворения от правильного решения. Это вопрос о том, какую полноту функционала давать тому или иному классу. Чтобы было понятнее, сразу покажу пример.

Вью персонажа - класс CharacterView, выводит и администрирует компоненты: портрет, шкалы здоровья, статус-иконки (типа "кровотечение", "благословение" и т.п.). Возьмём для примера область вывода статус-иконок. Это совсем "бездумный" класс StatusIconsArea, который реализует вот такие публичные методы:

Код AS3:
public function registerIcon (newIcon:BitmapIcon, iconID: String) : void // Регистрирует новую иконку статус-эффекта
public function showStatusIcon (iconID: String, showFirst: Boolean = false) : void // Показывает иконку
public function hideStatusIcon (iconID: String) : void // Прячет иконку
public function getIconByID(iconID: String) : BitmapIcon // Выдаёт зарегистрированную иконку
public function checkIconVisibility(iconID: String) : Boolean // Проверяет, отображается ли иконка
Таким образом, если из Модели "прилетает" событие на обновление статуса (типа push, с вложенным экземпляром StatusEffect), то класс CharacterView реализует всю логику, связанную с обработкой данного статус-эффекта. Код метода приведён ниже, но суть не в нём. Суть в том, что именно CharacterView проверяет, есть ли такая статус-иконка в числе отображаемых, если да, то не надо ли убрать, а возможно только изменить оставшееся время действия статуса, обновить текст тултипа и т.п.

Код AS3:
public function updateStatusArea (statusArea: StatusIconsArea, status: StatusEffect, ch: Character) : void 
		{	
			if (status.timeLeft > 0)
			{
				var tooltipID: String = LanguageIDs.getPhraseID(status.statusID, ch.genderID);
				var tooltipTxt: String = LanguagePack.getSinglePhrase(LanguageIDs.SECTION_TOOLTIPS_STATIC, tooltipID);
				trace ("Устанавливаем/обновляем тултип:" + tooltipTxt);
 
				if (status.timeLeft != GlobalDefaults.STATUS_TIME_PERMANENT)
				{
					var timeRemainTxt: String = LanguagePack.getSinglePhrase(LanguageIDs.SECTION_TOOLTIPS_DYNAMIC, LanguageIDs.TIME_REMAIN);
					timeRemainTxt = timeRemainTxt.replace("%VALUE1%", status.timeLeft);
					tooltipTxt = tooltipTxt.concat("\n", timeRemainTxt);
				}
 
				_tooltips.setDescription(_statusArea.getIconByID(iconFullID), tooltipTxt);
 
				if (!statusArea.checkIconVisibility(iconFullID))
				{
					trace ("Иконки ID " + iconFullID + " нет среди отображаемых. Выводим!");
					statusArea.showStatusIcon(iconFullID);
				}
			}
			else
			{
				trace ("Убираем статус-иконку");
				statusArea.hideStatusIcon(iconFullID)
			}
 
			dispatchEvent(new Event(ViewEventTypes.INSTRUCTION_COMPLETE));
		}
Приведённая схема нормально работала до поры. Теперь же возникла необходимость выводить иконки статус-эффектов не только для самого персонажа, но и для экипированного в руки предмета. Тут же началась хрень. Нужно либо инкапсулировать весь функционал непосредственно внутрь класса StatusIconsArea, чтобы на входе он получал экземпляр StatusEffect из события и дальше разбирался сам. Либо внутри CharacterView завести дополнительный экземпляр StatusIconsArea, прикрутить его к окошку вывода экипированного предмета и передавать в метод updateStatusArea ссылку на интересующую область (я так пока и сделал).

В общем, вопрос частный такой. Какому из классов правильнее поручить выполнение всей перечисленной выше логики? А вопрос общий, чем в принципе следует руководствоваться при решении подобных задач. Какие могут быть указатели/маркеры/индикаторы, которые могут помочь сориентироваться?

Спасибо.
__________________
Не сломано - не чини!

Старый 13.06.2018, 19:58
RedHead90 вне форума Посмотреть профиль Отправить личное сообщение для RedHead90 Найти все сообщения от RedHead90
  № 2  
Ответить с цитированием
RedHead90

Регистрация: Apr 2018
Сообщений: 42
Как я понял, ты просто слишком много водрузил на CharacterView. Это так называемый антипаттерн Божественный объект. Он слишком много знает и слишком много всего делает.

Цитата:
Вью персонажа - класс CharacterView, выводит и администрирует компоненты: портрет, шкалы здоровья, статус-иконки (типа "кровотечение", "благословение" и т.п.).
Я бы сделал, чтобы для главной вьюхи все эти шкалы, портреты и области со статусами были вообще не различимы, т.е. все компоненты имеют один тип. CharacterView должен просто следить за тем, что какой-то компонент нуждается в обновлении и вызывать соответствующий метод обновления по необходимости. Т.е. вместо кучи updateStatusArea, updateHealthBars, updateOver9000Component, должен быть всего один update, который пробегается по всем компонентам и вызывает уже их собственные update, делающие свое дело. Тогда логика по обновлению статусов уйдет в StatusIconsArea. Он станет модульным и главной вьюхе уже будет все равно, сколько таких компонентов она содержит - один, как было раньше, два, как сейчас или тысячу, как ты можешь захотеть завтра.

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

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

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


 


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


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