flash, flex builder i konflikt nazw
Kiedy ktoś chciałby, jak ja, zmajstrować klip we Flashu, ale oprogramować go we Fleksie, może napotkać kłopot. Nazwy nadane obiektom we Flashu nijak nie są automatycznie rozpoznawane we Flex Builderze, bo i nie mogą. Dlatego przy próbie użycia takiego obiektu dostaniemy od razu komunikat “1120: Access of undefined property moj_biedny_mc [...]“. Niestety pierwsza reakcja ? zadeklarować zmienną ? również nie pomoże. Tu z kolei zostaniemy poczęstowani tekstem o konflikcie nazw przy kompilacji “1151: A conflict exists with definition moj_biedny_mc in namespace internal.“, bo Flash napotka deklarację zmiennej z kodu i drugą, automatycznie wygenerowaną z obiektu.
Najprostszym znanym mi sposobem, całkiem znośnym, jest przepisanie obiektów stworzonych ręcznie do zmiennych za pomocą getChildByName(); Musimy tylko znać nazwy nadane we Flashu, np.:
// zakładam, że w pliku .fla stworzyłem na scenie klip o nazwie "moj_reczny_mc".
public var moj_programowy_mc:MovieClip = getChildByName('moj_reczny_mc') as MovieClip;
// jeśli stworzyłem sobie pole tekstowe "moje_reczne_pole", to działam analogicznie:
public var moj_programowe_pole:TextField = getChildByName('moje_reczne_pole') as TextField;
Końcówki “as MovieClip” i “as TextField” są konieczne,bo metoda getChildByName() zwraca obiek typu DisplayObject i trzeba go rzutować na właściwy typ.
Jest jeszcze inny sposób na konflikty nazw, ale mniej wygodny: wszystkie “nazwane” elementy powiązać z odpowiednimi klasami, a w actionscripcie wstawiać ich egzemplarze w odpowiednie miejsca, np.:
moj_programowy_mc = new MojRecznyMC;
moj_programowy_mc.x = 10;
moj_programowy_mc.y = 10;
Jednak kiedy taki obiekt zawiera kilka nazwanych elementów, np. pól tekstowych, zabawa robi się żmudna.