Framework: StateManager class

Выкладываю реализацию класса StateManager.
package elmortem.states {
  import flash.display.Sprite;

  public class StateManager {
    private var clip:Sprite = null;
    private var list:/*State*/Array = null;
    
    public function StateManager(attrIn:Object) {
      clip = attrIn.clip;
      list = [];
    }
    public function free():void {
      if (list == null) return;
      for (var i:int = 0; i < list.length; i++) {
        list[i].free();
        clip.removeChild(list[i]);
        // порядок вызова важен, т.к. внутри free нам может понадобится parent
      }
      list = null;
      clip = null;
    }
    
    public function add(state:State):State {
      if (clip == null || state == null) return null;
      list.push(state);
      clip.addChild(state);
      return state;
    }
    public function remove(state:State):Boolean {
      if (clip == null || state == null) return false;
      var id:int = list.indexOf(state);
      if (id < 0) return false;
      list.splice(id, 1);
      state.free();
      clip.removeChild(state);
      return true;
    }
    public function clear():void {
      if (clip == null) return;
      for (var i:int = 0; i < list.length; i++) {
        list[i].free();
        clip.removeChild(list[i]);
      }
      list = [];
    }
    public function show(state:State):State {
      clear();
      return add(state);
    }
    public function swap(state0:State, state1:State):Boolean {
      if (clip == null || list.indexOf(state0) < 0 || list.indexOf(state1) < 0) return false;
      clip.swapChildren(state0, state1);
      return true;
    }
    public function sendToBack(state:State):Boolean {
      if (clip == null || list.indexOf(state) < 0) return false;
      clip.setChildIndex(state, 0);
      return true;
    }
    public function sendToForward(state:State):Boolean {
      if (clip == null || list.indexOf(state) < 0) return false;
      clip.setChildIndex(state, clip.numChildren - 1);
      return true;
    }
  }
}

Используя методы add и remove можно показывать сразу несколько Игровых экранов и даже реализовать что-то вроде виндовых окон, если это надо. Но в целом простейшая надстройка для любым списком.

Комментарии (1)

0
А вот и менеджер :) Действительно ничего сложного, но все равно его стоило выложить ИМХО. Спасибо за то, что не придется изобретать велосипед :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.