Цитата:
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 и т.п. В некоторых местах могут быть "полновесные" объекты модели для подписок. Например, такие полновесные объекты обычно используются для управления анимациями и групповыми взаимодействиями.
Ну и бонусами вроде независимого изменеия я уже несколько раз пользовался. Это позволяет независимо переделывать различные аспекты. Например, взаимодействие объектов в видимой части сцены не зависит от начисления очков, переноса уровней и т.п.