Показать сообщение отдельно
Старый 09.06.2012, 13:49
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 7  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
maxkar, а это - теоретически, или Вы именно так игры делаете?
Хотелось бы из опыта.
Это из опыта. Причем герой, например, обычно таки пилится на части. Одна часть - характеристики (уровень, урон, состояние). Вторая часть - положение в сцене. Отдельный контроллер для работы с характеристиками (как они в зависимости от чего изменяются). Отдельный контроллер героя для перемещения в сцене и взаимодействия с объектами сцены (координация анимаций). Отдельный "общий" контроллер для всех движущихся объектов в сцене (с ним контроллеры анимаций взаимодействуют). Ну и "общая" логика, когда кого куда добавить, куда удалить, что куда переключить, когда сменить уровень.

Еще раз повторю, что не обязательно делать "канонический" MVC с его большими объектами и уведомлениями об изменении свойства. Обычно удобнее работать с мелкой гранулярностью изменений:
Код AS3:
public interface Property {
  public function getValue() : *;
  public function addChangeListener(listener : Function) : void;
  public function removeChangeListener(listener : Function) : void;
}
 
public class HeroStats {
  public var hitpoints : Property /* int */;
  public var mana : Property /* int */;
  public var score : Property /* int */;
  public var level : Property /* int */;
}
 
// где-то в инициализации:
var mainHeroStats : HeroStats;
mainHeroStat.hitpoints = new PropertyVariable();
mainHeroStat.mana = new PropertyVariable();
mainHeroStat.score = new PropertyVariable();
mainHeroStat.level = Properties.lift(calculateLevel, score);
Properties.onPropertyChange(notifyLevelChanged, mainHeroStat.level);
Properties - это немного черной магии по работе с подобными гранулярными свойствами. Позволяет не писать новых классов с ручной подпиской, обновлением и т.п. В примере level всегда будет равен значению функции calculateLevel(score.getValue()) и будет автоматически изменять уведомления. notifyLevelChanged будет вызываться при изменении mainHeroStat.level и т.п. В некоторых местах могут быть "полновесные" объекты модели для подписок. Например, такие полновесные объекты обычно используются для управления анимациями и групповыми взаимодействиями.

Ну и бонусами вроде независимого изменеия я уже несколько раз пользовался. Это позволяет независимо переделывать различные аспекты. Например, взаимодействие объектов в видимой части сцены не зависит от начисления очков, переноса уровней и т.п.