Pull to refresh

Использование MVC шаблона в ActionScript3

Reading time 4 min
Views 7.4K

Предисловие


Когда я впервые полгода назад начал писать на actionscript3, я совсем не задумывался над оптимизацией кода. Просто хотелось, чтобы код, приведенный на многих блогах и сайтах для «начинающих», корректно работал после изменения мною базовых свойств объектов или добавления новых простеньких методов. После изучения базового функционала языка пришла очередь ознакомиться с дополнительными библиотеками, особенно с физическими движками и твиннерами для программной анимации, так как всё началось с желания написать собственную флэш-игру.

Мысли о оптимизации


Сейчас, имея в наработках довольно объемные запасы программного кода, два прототипа игрушек и какой-то небольшой, но всё же опыт, пришла идея использовать MVC шаблон для написания кода.
После поисков информации о MVC, я усвоил о шаблоне несколько вещей:
1. Использование шаблона дико экономит время
2. Итоговый код выходит структурированным
3. Возможность изменять любой модуль скрипта без необходимости полного переписывания кода

Использование MVC вместе с ActionScript3


А теперь переходим к самому программированию на примере простенькой игры о космическом корабле.

Model

Этот класс будет содержать данные о скорости корабля, его положении в пространстве — всю нужную информацию, которая необходима для передвижений корабля. Класс будет использовать get и set методы для изменения данных во время игры.

View

Класс содержит все видимые части нашей игрушки, а также прослушиватели событий на действия игрока.

Controller

Самый интересный класс — здесь размещена вся логика приложения. Допустим, класс прослушивает событие нажатия клавиши движения из класса View; изменяет данные в классе Model; затем класс View считает новые данные модели и обновит позицию корабля на экране.

Пишем код


Создадим базовый класс приложения, вместо корабля нарисуем какой-нибудь кружок во FlasDevelop или просто импортируем изображение космолёта — для тех, кто предпочитает Flex. Также создадим классы модели, контроллера и класс отображения. Собственно конструктор класса Main:

class Main
//......imports......

public class Main extends Sprite
	{
		private var m_model:Model;
		private var m_view:View;
		private var m_controller:Controller;
		
		public function Main()
		{
			m_model = new Model();
			m_controller = new Controller(m_model);
			m_view = new View(m_model, m_controller);
			addChild(m_view);
		}
	}


Здесь, в главном классе мы «определяем» все классы шаблона. Внимание на класс отображения — ему передаются сразу объекты классов модель и контроллер, так как он взаимодействует с ними двумя одновременно. В моей игрушке класс контроллер может изменяет только саму «модель».

class View
//......imports......

public class View extends Sprite
	{
		[Embed(source="my_small_spaceship_image.jpg")]
		public var m_image:Class;
		public var m_spaceShip:Bitmap = new m_image();
		private var m_model:Object;
		private var m_controller:Object;	
		
		public function View(model:Object, controller:Object):void
		{
			
			m_model = model;
			m_model.addEventListener(Event.CHANGE, changed);
			m_controller = controller;
			m_spaceShip.x = 200;
			m_spaceShip.y = 200;
			addChild(m_spaceShip);
			
			addEventListener(Event.ADDED_TO_STAGE, addedToStage);
		}
		
		public function addedToStageHandler(event:Event):void
		{
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
		}
		
		public function keyPressed(event:KeyboardEvent):void
		{
			m_controller.key_Pressed(event);
		}
		
		public function changed(event:Event):void
		{
			m_spaceShip.x = m_model.direction[0]
			m_spaceShip.y = m_model.direction[1];
		}
	}



Здесь есть два важных момента:
Первый — m_model прослушивается на изменения, и потом класс Model через метод get сможет возвратить новые координаты корабля.
Собственно строка m_spaceShip.x = m_model.direction[0] и вызывает get-метод.
Второй момент — прослушивается событие нажатия клавиш, и вызывается метод класса Controller.
Потом новые координаты записываются в модель с помощью set-метода(запись идёт с класса Controller).

class Controller
public class Controller 
	public class Controller
	{
		private var m_model:Object;
		
		public function Controller(model:Object):void
		{
			m_model = model;
		}
		
		public function key_Pressed(event:KeyboardEvent):void
		{
			switch (event.keyCode)
			{
				case Keyboard.LEFT: 
					m_model.direction = new Array(m_model.direction[0] - 5, m_model.direction[1]);
					break;
				case Keyboard.RIGHT: 
					m_model.direction = new Array(m_model.direction[0] + 5, m_model.direction[1]);
					break;
				case Keyboard.UP: 
					m_model.direction = new Array(m_model.direction[0], m_model.direction[1] - 5);
					break;
				case Keyboard.DOWN: 
					m_model.direction = new Array(m_model.direction[0], m_model.direction[1] + 5);
					break;
			}
		}
	}


Здесь мы передали объект класса Model и изменяем его позицию через метод set классаModel.
Тоисть переменная m_direction будет менять свое значения после вызова m_model.direction = new Array(m_model.direction[0] — 5, m_model.direction[1]) операций.
Ну и наконец пример класса Model:

class Model
public class Model extends EventDispatcher
	{
		private var m_direction:Array = new Array();
		
		public function Model()
		{
			m_direction.push(200, 200);
		}
		
		public function get direction():Array
		{
			return m_direction;
		}
		
		public function set direction(m_values:Array):void
		{
			m_direction[0] = m_values[0];
			m_direction[1] = m_values[1];
			dispatchEvent(new Event(Event.CHANGE));
		}
	}



Здесь set метод обновляет данные модельки о положении, вызывается прослушиватель, определенный в View — соответственно меняются координаты нашего кораблика.

В итоге, я рассмотрел простейший пример использования MVC шаблона на языке ActionScript3. Если есть какие-то вопросы, буду рад ответить.
Tags:
Hubs:
+4
Comments 18
Comments Comments 18

Articles