Тема: Хорошее MVC
Показать сообщение отдельно
Старый 01.11.2014, 03:34
lammer.Ok вне форума Посмотреть профиль Отправить личное сообщение для lammer.Ok Найти все сообщения от lammer.Ok
  № 8  
Ответить с цитированием
lammer.Ok

Регистрация: Nov 2012
Сообщений: 55
Цитата:
Или если хотите, сделайте маленький пример - два квадрата, которые друг на друга заходят ровно на половину.
По клику мышки, они меняют глубину местами, то один выше, то второй. И при каждом клики пользователь получает +10
очков. И по завершению 20 секунд, в trace нужно вывести сумму всех очков.
Так как на as3 не программирую написал простой псевдокод.
Пусть это будет упрощенная игра. Тогда у нас есть GameModel, GameView и GameController. Также есть класс-вьюшка RectangleView.
Код AS3:
//Главный класс, инициализирует MVC
Main {
   model = new GameModel();
   view = new GameView(model);
   controller = new GameController(model, view);
}
Model
Код AS3:
//Модель 
GameModel {
   gameOver = false; //состояние игры
   score = 0; //очки
 
   //устанавливает и диспатчит состояние игры
   setGameOverState(flag) {
      gameOver = flag;
      dispatchEvent(Event.CHANGE_STATE);
   }
   //возвр. состояние игры
   getGameOverState() {
      return gameOver;
   }
   //суммирует и диспатчит очки
   addScore() {
      score += 10;
      dispatchEvent(Event.CHANGE_SCORE);
   }
   //возвр. очки
   getScore() {
      return score;
   }
}
View
Код AS3:
//Представление 
GameView {
   model; //модель игры
   box1; //вьюшка прямоугольника 1
   box2; //вьюшка прямоугольника 2
   canvas; //холст 
 
   //конструктор
   constructor(_model) {
      model = _model; //получаем модель игры
      canvas = new Canvas(); //создаём холст
      //создаём вьюшки прямоугольников
      box1 = new RectangleView(canvas, 150, 150, 1);
      box2 = new RectangleView(canvas, 75, 150, 2);
 
      //подписываемся на событие нажатия мыщи на прямоугольники, вызываем метод диспатча добавления очков
      box1.addEventListener(MouseEvent.MOUSE_DOWN, dispatchAddScore);
      box2.addEventListener(MouseEvent.MOUSE_DOWN, dispatchAddScore);
 
      //подписываемся на событие изменения очков игры, вызываем метод, который переставляет глубину для кажлого из прямоугольников 
      model.addEventListener(Event.CHANGE_SCORE, swapBoxes);
      //подписываемся на событие изменения состояния игры, вызываем метод вывода кол-ва очков
      model.addEventListener(Event.CHANGE_STATE, showScore);
 
      //запускаем таймер игры, по окончанию таймера вызываем метод, который диспатчит окончание таймера
      setTimeout(dispatchTimerOver, 20000);
   }
   //показывает кол-во очков пользователя
   showScore() {
      //если состояние конца игры - true 
      if (model.getGameOverState() == true) {
         trace(model.getScore()); //воводим кол-во очков
      }
   }
   //меняет местами глубины прямоугольников
   swapBoxes() {
      box1Depth = box1.getDepth();
      box1.setDepth(box2.getDepth());
      box2.setDepth(box1Depth);
   }
   //диспатчит добавление очков 
   dispatchAddScore() {
      dispatchEvent(Event.ADD_SCORE);
   }
   //диспатчит окончание таймера
   dispatchTimerOver() {
      dispatchEvent(Event.TIMER_OVER);
   }
}
Controller
Код AS3:
//Контроллер
GameController {
   model; //модель игры
   view; //вьюшка игры
 
   //конструктор  
   constructor(_model, _view) {
      model = _model; //получаем модель
      view = _view;	//получаем вьюшку
 
      //подписываемся на событие добавления очков, изменяем в модели очки
      view.addEventListener(Event.ADD_SCORE, addScore);
      //подписываемся на событие окончания таймера, изменяем состояние игры
      view.addEventListener(Event.TIMER_OVER, setGameOverState);
   }
   //добавляет очки в модели
   addScore() {
      model.addScore();
   }
   //меняет состояние игры
   setGameOverState() {
      model.setGameOverState(true);
   }
}
Код AS3:
RectangleView {
   //тут ничего интересного, всё обычно
}


Последний раз редактировалось lammer.Ok; 01.11.2014 в 06:55.