2015-03-27 2 views
0

Я действительно не понимаю, как разделить класс для модели и представления.View and Model in Java MVC game

Предположим, у меня есть класс Cat, который имеет некоторые параметры, такие как цвет, возраст, положение на карте и некоторые другие вещи. Я думал, что лучший способ создать пользовательскую картину - переопределить метод paintComponent. Однако класс Cat должен быть в модели, и он не должен знать ничего о том, как он визуализируется.

Как рисовать кошку? Предположим, что он представлен массивом изображений, а модель имеет переменное направление, которое может содержать int от 0 до 3, которое связано с изображениями в массиве. Что нужно сделать, чтобы нарисовать кошку? Должен ли он просто где-то внутри:

drawImage(model.getCat().getArray(model.getCat().getFrame())) ? 

ответ

2

Скажем, класс Cat представлен массив изображений и модель имеет переменную направление, которое может содержать Int от 0 до 3, который связан с картинками в массиве ,

В классе, который представляет собой панель чертежа, которая расширяет JPanel, вы сохраняете изображение.

Вы должны передать один или несколько экземпляров Cat классу панели чертежа в конструкторе.

В чертежной классе панели, вы бы метод setImage, который содержит следующую строку:

this.image = cat.getImage(imageNumber); 

В вашем переопределен метод paintComponent, вы бы следующую строку

drawImage(image, 0, 0, this); 

Совершите посмотрите мою статью, 2048 Game in Java Swing, чтобы узнать, как создаются и используются модели, представления и контроллеры в игре.

+0

Хорошо. Давайте возьмем класс «Cell» из вашей статьи. Он содержит метод 'paint()', но все еще находится внутри пакета модели. Правильно ли это? Он знает, что такое рецепт для рендеринга, хотя модель не должна знать (исправить меня, если я ошибаюсь), что-то о рендеринге. –

+0

@hejcz: Вот что я сказал, когда говорил о классе Game2048Model. это также справедливо для класса Cell. «Этот класс также привлекает сетку игр. Я знаю, я сказал ранее, что я отделяю модель от представления. Причина, по которой код чертежа включен в модель, заключается в том, что для объектов Java проще рисовать. входит в модель, ** выполняется ** как часть представления. " –

+0

Хорошо. Значит, это не STRICT MVC, но есть идея? Я благодарю вас за помощь и статью. Большое вам спасибо за помощь. –

0

Предположим, что Catявляется модель. Измените положение кошки примерно на Cat.setPosition(int position). Вызов, который должен запускать событие, которое может прослушать просмотр. Простой способ установить это, чтобы Cat расширить java.util.Observable и позвонить по телефону setChanged() и notifyObservers() с setPosition().

Теперь для вашего просмотра. Он будет иметь доступ к компонентам пользовательского интерфейса для обновления/рисования и использовать интерфейс java.util.Observer для прослушивания событий Cat. Передайте Cat в конструктор вашего представления и добавьте наблюдателя. Вам нужно будет выяснить, распространяется ли представление Observer или если вы используете какой-либо другой внутренний или анонимный класс. Теперь, когда кошка перемещается, представление получит событие и вызовет getPosition(), который будет использоваться для выбора правильного изображения из массива изображений. Любые изображения или инструкции по рисованию будут отображаться в представлении, но на основе свойств модели Cat.

Так что же такое контроллер? Это то, что обрабатывает пользовательские события, например, ActionListener на кнопке. Возможно, вы хотите, чтобы пользователь нажал на изображение кота в представлении, чтобы кошка переместилась на новую позицию. Обработчик клика компонента изображения является контроллером и будет вызывать Cat.setPosition(). Это приведет к тому, что модель Cat будет запускать событие, которое будет наблюдать вид, а затем перерисовать кошку в новой позиции.

Пока все происходит от событий компонента Swing/AWT, вам не нужно беспокоиться о безопасности потоков. В противном случае см. passing objects to another thread для некоторых идей.