Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0 > Статьи

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 01.11.2014, 22:55
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 631  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Делайте, а то ошибку не увидите.

Старый 02.11.2014, 00:51
lammer.Ok вне форума Посмотреть профиль Отправить личное сообщение для lammer.Ok Найти все сообщения от lammer.Ok
  № 632  
Ответить с цитированием
lammer.Ok

Регистрация: Nov 2012
Сообщений: 55
Я догадываюсь в чём ошибка - неточное использование модели?
Код AS3:
//Модель 
GameModel {
   gameOver = false; 
   score = 0; 
 
   setGameOverState(flag) {
      gameOver = flag;
      dispatchEvent(Event.CHANGE_STATE);
   }
 
   getGameOverState() {
      return gameOver;
   }
 
   addScore() {
      score += 10;
	  //не кричим вьюшке
   }
 
   getScore() {
      return score;
   }
}
 
//Представление 
GameView {
   model;
   canvas; 
 
   constructor(_model) {
      model = _model; 
      canvas = new Canvas(); 
 
      model.addEventListener(Event.CHANGE_STATE, showScore);
	  stage.addEventListener(MouseEvent.MOUSE_DOWN, drawCircle);
      setTimeout(dispatchTimerOver, 20000);
   }
 
   drawCircle() {
	//тут типа окуружность рисуется и добавляется на сцену 
	 circle = new CircleView(canvas, canvas.mouseX, canvas.mouseY);
   }
 
   showScore() {
      if (model.getGameOverState() == true) {
         trace(model.getScore()); 
      }
   }
 
   dispatchAddScore() {
      dispatchEvent(Event.ADD_SCORE);
   }
 
   dispatchTimerOver() {
      dispatchEvent(Event.TIMER_OVER);
   }
}
 
//Контроллер
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);
   }
}
 
//Вьюшка Окружности
CircleView {
	//рисуется окружность
}

Старый 02.11.2014, 00:56
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 633  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Вы неправильно определяете логику приложения, то есть модель, а из этого вытекают и все последующие ошибки. Нужно научится отделять логику от представления и это уже mvc.
Прежде всего ответьте на вопрос - что в первом случаи логика и что логика во втором.
И вот только эта логика и должна быть в модели.

Старый 02.11.2014, 02:07
lammer.Ok вне форума Посмотреть профиль Отправить личное сообщение для lammer.Ok Найти все сообщения от lammer.Ok
  № 634  
Ответить с цитированием
lammer.Ok

Регистрация: Nov 2012
Сообщений: 55
И в первом и во втором случае логика это подсчёт очков и наверное запуск таймера.

Старый 02.11.2014, 15:22
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 635  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Цитата:
И в первом и во втором случае логика это подсчёт очков и наверное запуск таймера.
В том-то и дело, что логика, это очки и таймер. А все остальное, это представление.
Логика, это то, без чего приложение не будет приложением. Можно подумать, что таймеру и во вью неплохо,
но если заменить вью на другую, то таймера может и не быть и приложение сломается.

Я бы прежде всего разобрался с BaseView и выяснил, что будет входить в её обязанности.
Просто бывают моменты, когда удобней, чтобы Base или MainView выступала ещё и в роли
Mediator'a. Медиатор нужен для того, чтобы CanvasView, различные MenuBoxView могли общаться между собой.
Можно сделать отдельно медиатор, который будет связывать все представления событиями.
И этот же медиатор будет прокси для контроллера. То есть, медиатор будет хранить немного логики,
которая не должна находится в контроллере, а должна находится в представлении.
Эта логика и будет решать, передать событие в какую-то вью или передать в контроллер.

Далее, у Вас должен быть класс Слой, который реализует всевозможные интерфейсы - IDrag, IFilter и тд.
Так же должна быть фабрика этих слоев.
И когда Вы щелкаете по кнопке "создать новый слой", посылается событие, которое ловит медиатор.
Что делать с этим событием? Если у Вас логика приложения гласит "в этом приложении нельзя создать более
ста слоев", то медиатор должен послать сообщение для контроллера, который изменит модель.
Ну а дальше медиатор или модель посылает событие, которое ловит другой медиатор ( медиатор создания слоев )
и он уже берет из фабрики новый экземпляр класса Слой и.. И дальше уже Ваша фантазия - Вы можете передать его сразу во все можули ( драг, филтры и ... ) либо же просто отдать в коллекцию слоев и в канвас для addChild.

Объяснять можно бесконечно и вопросы у Вас никогда не закончатся, они есть у всех и решения их не дает заскучать.
По этому делайте и у Вас все получится. Самое главное в начале понять принцип разделения ответственности.
Писать код модульно и писать его не в контексте приложения, а в контексте теста. То есть, Вы создаете среду
имитирующую работу приложения и создаете модуль-библиотеку.

Старый 02.11.2014, 16:53
lammer.Ok вне форума Посмотреть профиль Отправить личное сообщение для lammer.Ok Найти все сообщения от lammer.Ok
  № 636  
Ответить с цитированием
lammer.Ok

Регистрация: Nov 2012
Сообщений: 55
Спасибо, очень ценный ответ. Не зря потратил время. Теперь прояснились многие непонятные моменты с моделями и я почему-то недооценил роль медиаторов для взаимодействия с представлениями, пытаясь привязать представления строго к моделями из-за чего и получил неудачную и неясную структуру. Спасибо вам за потраченное время, всё здорово и понятно изложено. Вопросов больше нет.

П.С. я не пытаюсь написать фотошоп, но хочу сделать продуманный костяк, на котором можно будет написать любой графический редактор.

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:05.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.