PDA

Просмотр полной версии : Проблема с dispatchEvent


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));
}
}
}
}

cleptoman
03.03.2011, 18:45
dispatchEvent(new Event(Event.COMPLETE));
в конструкторе работать не будет...он просто отдиспатчица раньше чем вы на него подпишитесь..тут много раз поднимали эту тему..проблема не редкая )

metsys
03.03.2011, 18:52
Вот в чём проблема значит, с этим понятно, спасибо, буду что то думать. А что скажете по поводу кривости кода и второго вопроса?

gloomyBrain
03.03.2011, 18:55
в конструкторе работать не будет...
Иначе говоря, оператор new выполняет конструктор переданного класса, после чего возвращает ссылку на получившийся экземпляр. То есть ссылка в коде появляется уже после того, как диспатчится событие

По поводу второго вороса - приводите к DisplayObject или какому-то своему интерфейсу
По поводу кривости кода - смотря от чего отталкиваться =)

Котяра
03.03.2011, 19:21
По поводу кривости: с пивом пойдёт, только глаза режут имена не по конвенциям. Почитайте принятую конвенцию.