Показать сообщение отдельно
Старый 16.12.2010, 19:56
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 16  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Я пришел к выводу, что лично мне очень даже неудобно разделять логику.
Так, чтобы часть была в swc, а часть в основном проекте в билдере, например.
Теперь вообще не создаю *.as файлов в flashIDE-проекте. Линковать можно благо в любой пакет и без создания файла. Классы соответственно получают имена в стиле CircleView, EnemyView, LevelView;
В основном проекте же все классы, которые будут работать с символами из библиотеки наследуются от, например, класса BaseControlLogic (его идею подрезал у коллеги) (сам класс наследуется, например, от EventDispatcher).
Он может выглядеть так:


Код AS3:
package base {
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.events.EventDispatcher;
	import flash.events.MouseEvent;
	import tools.CursorMgr;
 
	public class BaseControlLogic extends EventDispatcher {
		protected var _view : Sprite;
		protected var _owner : DisplayObjectContainer;
 
		public function BaseControlLogic(){
			super();
		}
 
		public function setView(view : Sprite) : void {
			if(view) {
				initView(view);
			} else {
				removeView();
			}
		}
 
		public function getView() : Sprite {
			return _view;
		}
 
		protected function initView(view : Sprite) : void {
			_view = view;
		}
 
		protected function removeView() : void {
			if(_owner) {
				_owner.removeChild(_view);
				_owner = null;
			}
			_view = null;
		}
 
		public function set owner(owner : DisplayObjectContainer) : void {
			_owner = owner;
			_owner.addChild(_view);
		}
 
		public function get visible() : Boolean {
			return _view ? _view.visible : false;
		}
 
		public function set visible(visible : Boolean) : void {
			if(_view) {
				_view.visible = visible;
			}
		}
	}
}
В потомках же переопределяем initView(); как нам надо.
Например так.

Код AS3:
package levels{
	import dialogs.base.BaseControlLogic;
 
	import flash.display.DisplayObject;
 
	public class Level extends BaseControlLogic{
		private var _enemies : Vector.<Enemy>;
		public function Level(){
		}
 
		override protected function initView(view : Sprite) : void {
			super.initView(view);
			getEnemiesFromView(); // получаем всех врагов
			/*
			* делаем с ними, что надо
			*/
		}
 
		private function getEnemiesFromView():void{
			var child : DisplayObject;
			var enemy : Enemy;
			_enemies = new Vector.<Enemy>();      
 
			for(var : int = 0; i < _view.numChildren; i++){
				child = _view.getChildAt(i);
				if(child is EnemyView){
					enemy = new Enemy();
					enemy.setView(child);
					_enemies.push(enemy);
				}
			}
		}
  }
}

Естественно, Enemy наследуется от BaseControlLogic примерно таким же образом.

Мне кажется, что такой способ должен тебе подойти.
Ну или хотя бы натолкнуть на действия.
В общем использовать flashIDE как редактор уровней вполне себе можно.
И я уже такое делал. Правда тогда весь проект был во флеше, но это не имеет значения. Каждый клип уровня был слинкован со своим классом и передовался методу compileLevel(levelView):Level, который возвращал уже удобно подготовленный к обращению в коде уровень. Ну или не возвращал, если я в дизайне налажал и не поставил, например, ни одного респауна.


Я сам новичок, поэтому могу не видеть кучи подводных камней такого метода.
Но мне пока нравится.


Так. Кажется, я прослоупочил ответ =)
И немного протупил =(


Последний раз редактировалось ChuwY; 16.12.2010 в 20:15.