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

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

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

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

Друзья!

Судя по соотношению просмотров и ответов на мой предыдущий вопрос, делаю вывод о качестве его формулировки . Попробую ещё раз: компактно и с примерами.

Итак, у меня выполнено действие, вот сигнатура его контруктора:

Код AS3:
public function ActionEntity(data: ADEntity, attacker: Character, defender: Character)
Выбранное пользователем действие обрабатывается Моделью по паттерну Стратегия. В нём рассчитаны и доступны результирующие: ID свойства основного эффекта и его размер. Они действуют для того, кто защищался (т.е. имел статус IDs.CH_ACTION_STATUS_DEFENDER). По завершении действия, Модель запускает приватный метод finalazeAction:

Код AS3:
private function finalizeAction() : void // Финализирует основное действие
		{
			var propUpdatesArray: Array = new Array[]; 			// Массив изменяемых свойств персонажа
 
			for (var i: uint = 0; i <= _foregroundCharacters.length - 1; i++)
			{
				var ch: Character = _foregroundCharacters[i];
				trace("\nПодводим итоги для " + ch.characterID);
 
				if (ch.actionStatus == IDs.CH_ACTION_STATUS_DEFENDER)
					{
						propUpdatesArray.push(new CharacterPropUpdate(_currentAction.actionData.primaryEffectProp, _currentAction.primaryEffectValue)); // Например, пара: IDs.PROP_HEALTH, -25
// Тут может быть несколько эффектов
					}
 
			}
Последнее, что остаётся сделать, это отправить массив с инструкциями по обновлению значений свойств куда-то, где они будут применены. Вопрос в том, что я никак не могу определиться, куда именно. Есть вариант записать прямо там:

Код AS3:
ch.updateProps(propUpdatesArray);
и написать метод внутри класса Character, разместив там всю дополнительную логику (т.к. изменения свойств может подчиняться какой-то ещё дополнительной логике, в т.ч. контекстно-зависимой).

Либо в классе Модели создать новый метод (пишу прямо тут примерно):

Код AS3:
private function updateCharacterProps(ch: Character, propUpdatesArray: Array) : void
{
var instruction: CharacterPropUpdate;
var propID: String;
var currentValue: Number;
var newValue: Number;
 
for (var i: uint = 0; i <= propUpdatesArray.length - 1; i++)
{
instruction = propUpdatesArray[i];
propID = instruction.propID;
newValue = instruction.value;
currentValue = ch[propID];
 
// Тут какая-то дополнительная логика, общая для всех изменяемых свойств
 
ch[propID] += newValue;
}
Надеюсь, так понятнее, что я хочу спросить. Буду признателен за комментарии.
__________________
Не сломано - не чини!

Старый 12.04.2018, 15:04
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 2  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Мимопроходил, но для меня это звучит так, что у кажого персонажа есть свой инстанс модели, которому кто-то сообщает (видимо, более главная модель?) что его ударили. Внутри модели Character есть этот takeHit метод, который обрабатывает удар и меняет свои свойства (например, понижает здоровье в зависимости от того, насколько этот конкретный персонаж защищен от этого удара). После диспатчит событие, что он изменился, и вьюха этого конкретного персонажа перерисовывается

Старый 12.04.2018, 16:15
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 3  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Psycho Tiger, спасибо. Мне тоже кажется, что это должен быть метод в модели персонажа.
Правда у меня сегодня ударили, завтра поцеловали. Поэтому результат того или итого действия выглядит как массив из пар: строковый ID свойства, которое изменилось, и число с мерой этого изменения. Так что заранее не известно, потребуется ли takeHit или takeProfit Плюс к этом многие свойства изменяются сами собой со временем (как например, голод постоянно растёт между приёмами пищи) и т.п. В общем, я со всем этим хозяйством запутался.

Пока пришёл к тому, что более главная модель дёргает у Character публичный метод update и отдаёт всё, что претерпело изменения, а он уже будет разбираться, что к чему, и запускать поочерёдно приватные методы с обработкой каждого свойства по отдельности. Как-то так...
__________________
Не сломано - не чини!

Старый 15.04.2018, 20:09
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 4  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Да, как вариант. Но мне кажется, что выбранный путь больше навязан "правильной" архитектурой с каких-то статей, форумов. Например, `CharacterPropUpdate` – выглядит как какой-то паттерн.

Главное не загоняться и не делать слишком сложно. Большая часть паттернов была придумана в мире джавы, а джава как язык сосёт и именно поэтому джаве нужны паттерны.

Если есть возможность избежать сложной конструкции "зато через паттерн" и сделать проще, "читаемей", "поддерживаемей" – это путь лучше.

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

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

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


 


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


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