osadzanie czcionek we Flashu i formatowanie tekstów (bold/italic)

A oto błąd we Flash CS3: kiedy wstawimy sobie dynamiczne pole tekstowe i zaszyjemy czcionki, postępując całkiem przepisowo, możemy doznać przykrego zaskoczenia. Jeśli np. lubimy napisy rozstrzelone i pogrubione jednocześnie, pewnie ustawiliśmy odstępy między literami na więcej niż 0, no i mamy zaznaczone wytłuszczenie. Może nawet pamiętaliśmy o stworzeniu czcionki w bibliotece i wybraliśmy ją dla naszego TextFielda. Cóż, kiedy rezultat będzie nieco inny niż zamierzony… Flash zgubi pogrubienie! Czcionka niby jest zaszyta, tekst jest widoczny po maskowaniu i obróceniu, ale nie jest wytłuszczony. Będzie tak, jeśli tworzymy obiekt zawierający to pole tekstowe dynamicznie (np. var a:Naszobiekt = new NaszObiekt();) Jaka rada? Ano, odpuścić kerning na 0 w edytorze CS3, a ustawić go w ActionScriptcie:

var tf:TextFormat;
tf = label_tf.defaultTextFormat;
tf.letterSpacing = 1.5;
label_tf.defaultTextFormat = tf;

Opcje istotne przy osadzaniu czcionki dla dynamicznego pola tekstowego we Flash CS3

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.

ReferenceError: Error #1065: Variable xxx is not defined.

Chwilę walczyłem we Flashu z tym błędem. Pojawiał się, kiedy poniższą definicję klasy przypisywałem do dokumentu (klasa dokumentu), ale bez słówka “public” przed klasą.

package moje.com
{
import flash.display.MovieClip;


public class MainPage extends MovieClip
{
public function MainPage():void
{

//konstruktor
}
}
}