2014-12-17 2 views
1

Я создаю простую игру, чтобы изучить Flash-программирование. Чтобы иметь чистое разделение модели/представления, я хочу создать класс Player, который просто хранит данные, относящиеся к пользователю. Я также создаю класс StatusView, который расширяет MovieClip и который соответствует символу клипа, который я создал в своем проекте Flash. В основном StatusView будет отображать данные моего класса Player на экране.Модель-дизайн в Flash

Я привык делать подобные вещи с помощью слушателей, поэтому я нашел класс EventDispatcher и добавил его в качестве члена моего класса Player. Я хотел бы, чтобы мой клип StatusView добавлял прослушиватель событий в мой класс Player, чтобы он мог получать сообщения всякий раз, когда я меняю данные в классе Player.

Проблема заключается в том, что мне не кажется, что я должен помещать свой класс Player, чтобы StatusView мог его найти (чтобы добавить слушателя). Все в проекте создается непосредственно одним из фрагментов ролика, а время выполнения создает эти клипы в произвольном порядке. Например, скажем, я создаю символ MovieClip под названием GameView, и я создаю экземпляр Player там, а GameView является родителем StatusView. Когда StatusView сконструирован, я хотел бы иметь доступ к Игроку из его родителя, но в тот момент GameView еще не выполнил его код конструктора. Это верно, даже если я жду событие ADDED_TO_STAGE.

Я могу поставить код модели игры в одноэлементный, но это кажется взломом для меня. Есть ли способ передовой практики во Flash, который позволяет мне создавать и получать доступ к моей игровой модели независимо от всего материала символа MovieClip?

ответ

1

Если вы хотите передать ссылку модели на конструктор представления, но не вызываете конструктор самостоятельно (потому что вы не создаете объект по коду), вам здесь не повезло.

Вы могли бы вместо того, чтобы просто определить метод на вашем View передать ссылку на объект Model:

public function setModel(value:Model):void 

использование:

view.setModel(player); 

Там нет «закон», который вы должны пройти Модель для конструктора представления. Вы также можете создать набор функций для удобства:

public function set model(value:Model):void 

использование:

view.model = player; 

Я чувствую, что я не согласен с Singleton. Цель Singleton - гарантировать, что существует только один его экземпляр. Вот и все. Нельзя легко обходить ссылку (потому что метод для получения единственного экземпляра является статическим). Это (ИМО) - плохая практика. Вы можете сделать anythign static, чтобы передать его «легко». Но это создавало бы беспорядок, и никто этого не делает. Но внезапно, только потому, что шаблон singleton использует статический метод, многие люди считают, что это умный способ получить ссылку. Позволю себе не согласиться.

0

Прежде всего, вы можете реализовать класс Player как singleton, если вам нужен только один экземпляр. Я не думаю, что это выглядит как взломать (например, в PureMVC-каркасе каждая модель является синглом). Во-вторых, вы можете создавать экземпляры класса Player в каком-то общем классе (диспетчере) и отправлять их в представления.

P.S. Кроме того, я хочу отметить, что вы можете расширить свой класс Player из EventDisptacher, не создавая определенное поле «eventDispatcher» в классе Player. Я не знаю, какой путь лучше, но это проще, имхо.

+0

Согласен. Попросите игрока расширить EventDispatcher. –

Смежные вопросы