Предисловие
Когда я впервые полгода назад начал писать на 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. Если есть какие-то вопросы, буду рад ответить.