
Framework: State & StateManager
Как работает мой игровой фреймворк? В основе всего лежит State и управляющий им StateManager.
Наследуется от Sprite и реализует в своих наследниках логику игровых экранов. Например от него наследуются классы Mainmenu, Gameplay, Options и т.д.
Конструктор принимает не обязательный Object, который сохраняется в публичном параметре attr. Это позволяет передавать игровым экранам любое количество параметров любого типа и является универсальным. Такой метод передачи параметров используется почти во всех моих объектах.
Этот класс управляет игровыми экранами. Он добавляет их на сцену, инициализирует, удаляет. Экземпляр этого класса является статическим параметром моего основного класса Main, который либо является DocumentClass'ом, либо создаётся в Preloader'е.
Конструктор принимает Object с пока единственным свойством clip — сцена, в которую будут добавляться игровые экраны.
Выглядит это примерно так:
Продолжение следует...
State
elmortem.states.StateНаследуется от Sprite и реализует в своих наследниках логику игровых экранов. Например от него наследуются классы Mainmenu, Gameplay, Options и т.д.
Конструктор принимает не обязательный Object, который сохраняется в публичном параметре attr. Это позволяет передавать игровым экранам любое количество параметров любого типа и является универсальным. Такой метод передачи параметров используется почти во всех моих объектах.
StateManager
elmortem.states.StateManagerЭтот класс управляет игровыми экранами. Он добавляет их на сцену, инициализирует, удаляет. Экземпляр этого класса является статическим параметром моего основного класса Main, который либо является DocumentClass'ом, либо создаётся в Preloader'е.
Конструктор принимает Object с пока единственным свойством clip — сцена, в которую будут добавляться игровые экраны.
Выглядит это примерно так:
// Document Class
class Main extends Sprite {
static public var stateManager:StateManager;
public function Main() {
if(stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
stateManager = new StateManager({clip:this});
// clip - сцена, куда будут добавляться экраны
stateManager.show(new Mainmenu());
}
}
// MAINMENU
public class Mainmenu extends State {
public function Mainmenu(attrIn:Object = null) {
super(attrIn);
}
override protected function init():void {
// вызывается после ADDED_TO_STAGE, реализовано в State
addEventListener(MouseEvent.CLICK, onClick);
}
override public function free():void {
// free - единое для всех моих объектов название метода удаления объекта
// После вызова этого метода объект использовать нельзя
removeEventListener(MouseEvent.CLICK, onClick);
}
private function onClick(e:MouseEvent):void {
Main.stateManager.show(new Gameplay({map:1}));
}
}
// GAMEPLAY
public class Gameplay extends State {
public function Gameplay(attrIn:Object = null) {
super(attrIn);
}
override protected function init():void {
trace("Map "+attr.map);
addEventListener(MouseEvent.CLICK, onClick);
}
override public function free():void {
removeEventListener(MouseEvent.CLICK, onClick);
}
private function onClick(e:MouseEvent):void {
Main.stateManager.show(new Mainmenu());
}
}
Продолжение следует...
- +6
- elmortem
Комментарии (11)
я правда не совсем понял о каком фреймворке идет речь. такое ощущение, что ты об этом писал пост, а он потерялся). выложить свой фреймворк и написать по нему цикл статей это отлично! тем, кто только начинает было бы очень полезно. но такое ощущение, что ты пропустил вступительное слово про фреймворк с сылкой на скачивание и сразу начал со статей. или я не так понял?)
а было бы интересно посмотреть
и структура мне не оч понравилась,
хотя я юзаю твою стейт машину еще с двига ХГЕ ее увидел и переделал под себя)
у меня еще есть класс перехода, он останавливает текущий стейт -делает анимацию и показывает следующий.
Вообще у многих же есть свои фреймворки, было бы неплохо, если бы каждый рассказал про свой, мы бы друг у друга правильных идей позаимствовали и все бы были довольны.
ну не нравиться) на сколько я понял у тебя при переходе на новый виджет старый удаляется? и потом если надо вернуться на первый
— его нужно снова создать? да? вот этим подход и не понравился.
к примеру, у тебя пользователь на первом стейте — кнопку музыки нажал…
и в следующий раз при переходе на первый стейт тебе нужно этот параметр каждый раз передавать?
ПС мой фреймворк настолько мутный,
все руки не доходят его поправить)
и он на столько по-индуски написан, что даже я не смогу все пере-осознать.
А оставлять целый стейт в памяти может быть очень накладно по памяти. При этом ничто не мешает не реализовывать удаления в методе free и сам стейт хранить отдельно, тогда его не нужно будет пересоздавать.
Про профиль расскажу следующим постом, раз уж к слову пришлось…