metsys
03.03.2011, 18:03
Сел програмировать, и сразу всплыло несколько вопросов.
1. В одном случае у меня замечательно срабатывает dispatchEvent, а в аналогичном ни в какую не работает. Классы которые должны оповещать о событиях не могут быть унаследованы от EventDispatcher. Находил аналогичную тему (http://www.flasher.ru/forum/showthread.php?t=111332) по этому вопросу. но так и не разобрался. - ответ получен.
2. Есть созданный объект во флеше состоящий из графических элементов и текстовых полей, но при передаче этого объекта другому классу не совсем понятно к какому типу его приводить и как с ним работать. Не совсем понятно объясняю. но по коду в принципе понять можно который я привёл ниже.
+скажите насколько кривой код и на что слелдует обратить внимание, или всё вообще безграмотно и лучше переписывать.
package
{
import as3.*;
import caurina.transitions.Tweener;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
public class ConsoleWeb extends Sprite
{
//--константы
private static const LOADING_TEXT_COLOR_1:uint=0x666666;
private static const LOADING_TEXT_COLOR_2:uint=0x0099FF;
//--объекты--
private var _locPan:LocationPannel;
private var _genMenu:GenerationMenu;
//--объекты нарисованные во флеше--
private var gen3:generation_3=new generation_3();
private var gen4:generation_4=new generation_4();
private var gen5:generation_5=new generation_5();
private var gen6:generation_6=new generation_6();
private var gen7:generation_7=new generation_7();
//--XML--
private var _someXML_1:XML;
private var _someXML_2:XML;
//--ARRAYS--
private var _generation_container:Array=new Array();
public function ConsoleWeb()
{
//--создаём xml списки
xmlLists();
createClassObjects();
listeners();
}
/**---------------------------------
* ------------------------------- *
* -------------------------------**/
//--формируем xml списки для дальнейшей работы с ними
private function xmlLists():void
{
//код
}
/**---------------------------------
* ------------------------------- *
* -------------------------------**/
private function createClassObjects():void
{
//--создаём DisplayObjectContainer'ы под каждый нарисованный объект
_generation_container[0]=new Sprite();
_generation_container[1]=new Sprite();
_generation_container[2]=new Sprite();
_generation_container[2].addChild(gen3);
_generation_container[3]=new Sprite();
_generation_container[3].addChild(gen4);
_generation_container[4]=new Sprite();
_generation_container[4].addChild(gen5);
_generation_container[5]=new Sprite();
_generation_container[5].addChild(gen6);
_generation_container[6]=new Sprite();
_generation_container[6].addChild(gen7);
//--объект нарисованный во флеше и вмещающий в себя несколько картинок и несколько текстовых полей
var lp:location_pannel=new location_pannel();
//--создаём экземпляр класса LocationPannel
_locPan=new LocationPannel(lp, _consoles);
//--создаём экземпляр класса GenerationMenu
_genMenu=new GenerationMenu(_consoles, _generation_container);
}
/**---------------------------------
* ------------------------------- *
* -------------------------------**/
//--вешаем слушатели и дожидаемся когда сработает событие--
private function listeners():void
{
_locPan.addEventListener(Event.COMPLETE, displayLocationPannel);
//--слушаем когда GenerationMenu будет готово к работе и отображению на экране
_genMenu.addEventListener(Event.COMPLETE, displayGenerationMenu);
//--если в GenerationMenu сработал слушатель мышки на нажатие, мы запрашиваем данные о том какое поколение и какая консоль были выбраны
_genMenu.addEventListener(Event.CHANGE, setGenerationAndConsole);
}
private function displayLocationPannel(e:Event):void
{
trace("_locPan added to stage");
addChild(_locPan);
}
//--отображаем GenerationMenu
private function displayGenerationMenu(e:Event):void
{
trace("_genMenu added to stage");
addChild(_genMenu);
}
//--запрашиваем данные у _genMenu и передаём их для обработки и отображения в _locPan
private function setGenerationAndConsole(e:Event):void
{
var generation:int=_genMenu.getGeneration();
var console:int=_genMenu.getConsole();
_locPan.setGenAndConsoleData(generation, console);
}
}
}
Собственно в этом классе вё работает хорошо и диспетчеры событий оповещают слушателей о событиях
package as3{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
public class GenerationMenu extends Sprite
{
//--CONST--
//--ARRAYS--
private var _small_logo_array:Array=new Array();
private var _generation_container:Array=new Array();
//--XML--
private var _someXML_1:XML;
//--VARIABLES--
private var _smallLogoCounter:int=0;
private var _generationChoosed:int;
private var _location:String="MAIN";
private var _generation:int;
private var _another:int;
private var _part:String="ALL";
//передаём xml в котором содержится информация о играх, приставках, поколениях и фильтрах которые есть у тех или иных устройств
public function GenerationMenu(xml:XML, ar:Array)
{
_consoles=xml;
_generation_container=ar;
//код
//--загружаем различные элементы xml списков
loadingSmallLogos();
}
//--в этой ф-ции подгружаются логотипы
private function loadingSmallLogos():void
{
var loader:Loader=new Loader();
var s:String=_consoles[0].descendants("small_logo")[_smallLogoCounter].attribute("url");
loader.load(new URLRequest(s));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, smallLogoLoaded);
}
//--записываем логотипы в массив
private function smallLogoLoaded(e:Event):void
{
e.target.removeEventListener(Event.COMPLETE, smallLogoLoaded);
var generation:int=_consoles[0].descendants("small_logo")[_smallLogoCounter].parent().parent().parent().childIndex();
var number:int=_consoles[0].descendants("small_logo")[_smallLogoCounter].parent().parent().childIndex();
//--создаём спрайт в который добавим маленький логотип
var sprite:Sprite=new Sprite();
sprite.addChild(e.target.content);
_generation_container[generation].addChild(sprite);
sprite.buttonMode=true;
sprite.useHandCursor=true;
sprite.visible=false;
sprite.alpha=GENERETAION_MENU_MOUSEOUT_ALPHA;
sprite.y=GENERETAION_MENU_ICON_HEIGHT+(number*SMALL_LOGO_HEIGHT);
if (_smallLogoCounter<_consoles[0].descendants("small_logo").length()-1)
{
_smallLogoCounter++;
loadingSmallLogos();
}
else
{
for(var i:int=FIRST_GENERATION; i<NUM_OF_GENERATIONS; i++)
{
_generation_container[i].addEventListener(MouseEvent.MOUSE_OVER, mouseOverGenerationMenu);
_generation_container[i].addEventListener(MouseEvent.MOUSE_OUT, mouseOutGenerationMenu);
_generation_container[i].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownGenerationMenu);
addChild(_generation_container[i]);
}
//--создаём слушатель, который оповещает о том что GenerationMenu готова к использованию и её можно добавлять на экран
dispatchEvent(new Event(Event.COMPLETE));
}
}
/**---------------------------------
* ------------------------------- *
* -------------------------------**/
private function mouseOverGenerationMenu(e:MouseEvent):void
{
//код
}
private function mouseOutGenerationMenu(e:MouseEvent):void
{
//код
}
private function mouseDownGenerationMenu(e:MouseEvent):void
{
//код
dispatchEvent(new Event(Event.CHANGE));
}
public function getGeneration():int
{
return _generation;
}
public function getConsole():int
{
return _console;
}
}
}
А вот тут диспетчеры не работают, +ко всему у меня во флеше нарисовано пару графических элементов и создано несколько текстовых полей, всё это выделено и кнопочкой F8 объеденено в один элемент. который расширяет класс Sprite, но если я _locPan приведу к типу Sprite у меня билдер начинает ругатся на то что в нём не может быть "_locPan.generationTXT.text=.....;" или "_locPan.anotherTXT.text=........;"
package as3{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
public class LocationPannel extends Sprite
{
private var _locPan:*;
private var _consoles:XML;
public function LocationPannel(mc:*, xml:XML)
{
_locPan=mc;
_consoles=xml;
_locPan.x=2;
_locPan.y=2;
addChild(_locPan);
dispatchEvent(new Event(Event.COMPLETE));
}
public function setGenAndConsoleData(generation, another):void
{
if(generation==(-1))
{
_locPan.generationTXT.text="all";
}
else
{
_locPan.generationTXT.text=String(int(generation+1));
}
if(another==0)
{
_locPan.anotherTXT.text="all";
}
else
{
_locPan.anotherTXT.text=String(int(another));
}
}
}
}
1. В одном случае у меня замечательно срабатывает dispatchEvent, а в аналогичном ни в какую не работает. Классы которые должны оповещать о событиях не могут быть унаследованы от EventDispatcher. Находил аналогичную тему (http://www.flasher.ru/forum/showthread.php?t=111332) по этому вопросу. но так и не разобрался. - ответ получен.
2. Есть созданный объект во флеше состоящий из графических элементов и текстовых полей, но при передаче этого объекта другому классу не совсем понятно к какому типу его приводить и как с ним работать. Не совсем понятно объясняю. но по коду в принципе понять можно который я привёл ниже.
+скажите насколько кривой код и на что слелдует обратить внимание, или всё вообще безграмотно и лучше переписывать.
package
{
import as3.*;
import caurina.transitions.Tweener;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
public class ConsoleWeb extends Sprite
{
//--константы
private static const LOADING_TEXT_COLOR_1:uint=0x666666;
private static const LOADING_TEXT_COLOR_2:uint=0x0099FF;
//--объекты--
private var _locPan:LocationPannel;
private var _genMenu:GenerationMenu;
//--объекты нарисованные во флеше--
private var gen3:generation_3=new generation_3();
private var gen4:generation_4=new generation_4();
private var gen5:generation_5=new generation_5();
private var gen6:generation_6=new generation_6();
private var gen7:generation_7=new generation_7();
//--XML--
private var _someXML_1:XML;
private var _someXML_2:XML;
//--ARRAYS--
private var _generation_container:Array=new Array();
public function ConsoleWeb()
{
//--создаём xml списки
xmlLists();
createClassObjects();
listeners();
}
/**---------------------------------
* ------------------------------- *
* -------------------------------**/
//--формируем xml списки для дальнейшей работы с ними
private function xmlLists():void
{
//код
}
/**---------------------------------
* ------------------------------- *
* -------------------------------**/
private function createClassObjects():void
{
//--создаём DisplayObjectContainer'ы под каждый нарисованный объект
_generation_container[0]=new Sprite();
_generation_container[1]=new Sprite();
_generation_container[2]=new Sprite();
_generation_container[2].addChild(gen3);
_generation_container[3]=new Sprite();
_generation_container[3].addChild(gen4);
_generation_container[4]=new Sprite();
_generation_container[4].addChild(gen5);
_generation_container[5]=new Sprite();
_generation_container[5].addChild(gen6);
_generation_container[6]=new Sprite();
_generation_container[6].addChild(gen7);
//--объект нарисованный во флеше и вмещающий в себя несколько картинок и несколько текстовых полей
var lp:location_pannel=new location_pannel();
//--создаём экземпляр класса LocationPannel
_locPan=new LocationPannel(lp, _consoles);
//--создаём экземпляр класса GenerationMenu
_genMenu=new GenerationMenu(_consoles, _generation_container);
}
/**---------------------------------
* ------------------------------- *
* -------------------------------**/
//--вешаем слушатели и дожидаемся когда сработает событие--
private function listeners():void
{
_locPan.addEventListener(Event.COMPLETE, displayLocationPannel);
//--слушаем когда GenerationMenu будет готово к работе и отображению на экране
_genMenu.addEventListener(Event.COMPLETE, displayGenerationMenu);
//--если в GenerationMenu сработал слушатель мышки на нажатие, мы запрашиваем данные о том какое поколение и какая консоль были выбраны
_genMenu.addEventListener(Event.CHANGE, setGenerationAndConsole);
}
private function displayLocationPannel(e:Event):void
{
trace("_locPan added to stage");
addChild(_locPan);
}
//--отображаем GenerationMenu
private function displayGenerationMenu(e:Event):void
{
trace("_genMenu added to stage");
addChild(_genMenu);
}
//--запрашиваем данные у _genMenu и передаём их для обработки и отображения в _locPan
private function setGenerationAndConsole(e:Event):void
{
var generation:int=_genMenu.getGeneration();
var console:int=_genMenu.getConsole();
_locPan.setGenAndConsoleData(generation, console);
}
}
}
Собственно в этом классе вё работает хорошо и диспетчеры событий оповещают слушателей о событиях
package as3{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
public class GenerationMenu extends Sprite
{
//--CONST--
//--ARRAYS--
private var _small_logo_array:Array=new Array();
private var _generation_container:Array=new Array();
//--XML--
private var _someXML_1:XML;
//--VARIABLES--
private var _smallLogoCounter:int=0;
private var _generationChoosed:int;
private var _location:String="MAIN";
private var _generation:int;
private var _another:int;
private var _part:String="ALL";
//передаём xml в котором содержится информация о играх, приставках, поколениях и фильтрах которые есть у тех или иных устройств
public function GenerationMenu(xml:XML, ar:Array)
{
_consoles=xml;
_generation_container=ar;
//код
//--загружаем различные элементы xml списков
loadingSmallLogos();
}
//--в этой ф-ции подгружаются логотипы
private function loadingSmallLogos():void
{
var loader:Loader=new Loader();
var s:String=_consoles[0].descendants("small_logo")[_smallLogoCounter].attribute("url");
loader.load(new URLRequest(s));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, smallLogoLoaded);
}
//--записываем логотипы в массив
private function smallLogoLoaded(e:Event):void
{
e.target.removeEventListener(Event.COMPLETE, smallLogoLoaded);
var generation:int=_consoles[0].descendants("small_logo")[_smallLogoCounter].parent().parent().parent().childIndex();
var number:int=_consoles[0].descendants("small_logo")[_smallLogoCounter].parent().parent().childIndex();
//--создаём спрайт в который добавим маленький логотип
var sprite:Sprite=new Sprite();
sprite.addChild(e.target.content);
_generation_container[generation].addChild(sprite);
sprite.buttonMode=true;
sprite.useHandCursor=true;
sprite.visible=false;
sprite.alpha=GENERETAION_MENU_MOUSEOUT_ALPHA;
sprite.y=GENERETAION_MENU_ICON_HEIGHT+(number*SMALL_LOGO_HEIGHT);
if (_smallLogoCounter<_consoles[0].descendants("small_logo").length()-1)
{
_smallLogoCounter++;
loadingSmallLogos();
}
else
{
for(var i:int=FIRST_GENERATION; i<NUM_OF_GENERATIONS; i++)
{
_generation_container[i].addEventListener(MouseEvent.MOUSE_OVER, mouseOverGenerationMenu);
_generation_container[i].addEventListener(MouseEvent.MOUSE_OUT, mouseOutGenerationMenu);
_generation_container[i].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownGenerationMenu);
addChild(_generation_container[i]);
}
//--создаём слушатель, который оповещает о том что GenerationMenu готова к использованию и её можно добавлять на экран
dispatchEvent(new Event(Event.COMPLETE));
}
}
/**---------------------------------
* ------------------------------- *
* -------------------------------**/
private function mouseOverGenerationMenu(e:MouseEvent):void
{
//код
}
private function mouseOutGenerationMenu(e:MouseEvent):void
{
//код
}
private function mouseDownGenerationMenu(e:MouseEvent):void
{
//код
dispatchEvent(new Event(Event.CHANGE));
}
public function getGeneration():int
{
return _generation;
}
public function getConsole():int
{
return _console;
}
}
}
А вот тут диспетчеры не работают, +ко всему у меня во флеше нарисовано пару графических элементов и создано несколько текстовых полей, всё это выделено и кнопочкой F8 объеденено в один элемент. который расширяет класс Sprite, но если я _locPan приведу к типу Sprite у меня билдер начинает ругатся на то что в нём не может быть "_locPan.generationTXT.text=.....;" или "_locPan.anotherTXT.text=........;"
package as3{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
public class LocationPannel extends Sprite
{
private var _locPan:*;
private var _consoles:XML;
public function LocationPannel(mc:*, xml:XML)
{
_locPan=mc;
_consoles=xml;
_locPan.x=2;
_locPan.y=2;
addChild(_locPan);
dispatchEvent(new Event(Event.COMPLETE));
}
public function setGenAndConsoleData(generation, another):void
{
if(generation==(-1))
{
_locPan.generationTXT.text="all";
}
else
{
_locPan.generationTXT.text=String(int(generation+1));
}
if(another==0)
{
_locPan.anotherTXT.text="all";
}
else
{
_locPan.anotherTXT.text=String(int(another));
}
}
}
}