3. dubna 2009

Distribuce třídy jako Flash SWC komponenty v ActionScriptu 3

Občas se stane, že klient, pro kterého vyvíjíte Flash aplikaci, požaduje i zdrojové FLA a AS soubory. Chcete-li klientovi vyhovět, narazíte na vážný problém. Aby klient mohl aplikaci ze zdrojových souborů znovu zkompilovat, musí mít, vedle kódu, který jste napsali speciálně pro něj, k dispozici i vaše soukromé knihovny tříd. Jejich vývoj si klient ovšem nezaplatil. Jste tedy nuceni nedobrovolně odtajnit své vlastní know-how, nemluvě o nutnosti sestavit zvláštní distribuci vašich tříd, čímž si logicky jen „zaděláte“ na další a další problémy.

Situace si přímo žádá řešení, které by umožnilo dodat klientovi zdrojové soubory jeho Flash aplikace v takové sestavě, aby neměl přístup k vašemu „frameworku“ a přitom mohl zdrojový FLA soubor aplikace bez problémů zkompilovat do SWF, jako by zdrojáky vašeho frameworku měl.

Takové řešení naštěstí existuje a je ke všemu i velmi jednoduché a elegantní !!!

Třídu napsanou v ActionScriptu a uloženou v AS souboru lze totiž zkompilovat do SWC souboru, který pak v libovolné aplikaci můžete použít jako standardní Flashovou komponentu. Komponenta obsahující zkompilovanou třídu bude přitom uložená přímo v knihovně FLA souboru aplikace. Jako součást FLA souboru bude tedy distribuovaná ke klientovi zcela automaticky bez nutnosti přikládat k distribuci původní AS zdrojový soubor definice třídy.

Z pohledu ActionScriptu samotné klientovy aplikace přitom vše zůstane při starém. Instanci třídy vytvoříte v kódu Flash aplikace úplně stejným způsobem, jako byste se odkazovali na definici třídy uloženou v AS souboru, tedy např.:


var identifikator:Trida = new Trida();


Navíc SWC soubor obsahuje kód ve zkompilované podobě a podle toho, co jsem se o tomto formátu dočetl, má SWC lepší ochranu proti dekompilaci než SWF, což snižuje pravděpodobnost úniku vašeho know-how. Zkrátka a dobře, řeší to vše, co řešit potřebujete.

Pojďme si tedy ukázat, jak lze definici třídy, kterou máte uloženou ve zdrojovém AS souboru, zkompilovat do SWC-komponenty a tuto komponentu pak importovat do knihovny FLA aplikace. Vyzkoušíme si to na jednoduchém příkladě - v editoru Adobe Flash CS3 Profesional.

Kompilace třídy z AS do SWC

Nejprve si vytvořte speciální adresář pro kompilaci SWC-komponenty. Pojmenujte si ho podle svého. V tomto adresáři si pak založte nový soubor „Pokus.as“, který bude obsahovat kód ActionScriptu 3:


package
{
 import flash.display.MovieClip;

 public class Pokus extends MovieClip
 {
  private var str:String;

  public function Pokus()
  {
   this.str = "Konstruktor funguje";
  }

  public function setStr(str:String = "Zadal jsem řetězec ..."):void
  {
   this.str = str;
  }

  public function getStr():String
  {
   return this.str;
  }
 }
}


Je to velmi jednoduchá třída, jejíž instance bude mít jedinou soukromou vlastnost „str“ a pouze dvě veřejné metody: jednu pro nastavení hodnoty vlastnosti „str“ a druhou pro čtení hodnoty vlastnosti „str“. Pro ilustraci postupu to bohatě postačí. Důležité je to, že třída je odvozena od třídy MovieClip. Je to kvůli způsobu její kompilace do SWC komponenty, který uvádím dále.

Soubor „Pokus.as“ uložte. Můžete ho i zavřít. Dál už do něj zasahovat nebudete.

Otevřete si nový FLA soubor ActionScriptu 3 a uložte ho stejného adresáře jako „Pokus.as“. Dejte mu například vznosné jméno „tovarna_swc.fla“.

V tomto FLA souboru začněte vytvářet nový symbol knihovny. Stiskněte např. CTRL+F8. Objeví se panel pro nastavení jména a typu symbolu. Jméno nastavte na „mc“ a typ symbolu na MovieClip. Zůstaňte ještě na panelu a rozklikněte si ho do režimu „podrobné nastavení“. Zde zaškrtněte „Exportovat pro ActionScript“. Ponechte zaškrtnuté „Exportovat v prvním snímku“. Do políčka Základní třída vepište „Pokus“. Bázová třída zůstane vyplněná jak byla, tzn. „flash.display.MovieClip" (to je důvod, proč musí být třída „Pokus“ odvozena od třídy MovieClip). Mělo by to vše vypadat, jako na následujícím obrázku. Pokud je to tak, klikněte na OK.



V knihovně klikněte pravým tlačítkem na symbol „mc“ a vyberte v kontextovém menu volbu „Definice komponenty“. Objeví se další dialogový panel (viz obrázek níže), kde do kolonky „Třída“ vepište „Pokus“. Pak ještě pro pořádek klikněte na tlačítko volby ikony symbolu a vyberte „Ikona komponenty ActionScript“. Panel zavřete pomocí OK.



Nyní jste již připraveni ke kýženému zkompilování AS definice třídy „Pokus“ do formy SWC-komponenty. Klikněte v knihovně na symbol „mc“ opět pravým tlačítkem myši a vyberte volbu „Exportovat soubor SWC“. Soubor komponenty uložte pod jménem „Pokus.swc“.

Hotovo. Soubor „tovarna_swc.fla“ již můžete zavřít. Nebudete ho dále potřebovat, jako nebudete potřebovat již ani soubor „Pokus.as“.

Použití SWC-komponenty v aplikaci

Otevřete si nový FLA soubor ActionScriptu 3 a uložte ho pod jménem např. „aplikace.fla“ do jiného adresáře, než kde máte uložený soubor „Pokus.as“. Zkontrolujte také, že v nastavení publikování není uvedená cesta ke třídám, která by vedla k souboru „Pokus.as“. Musíte mít prostě jistotu, že při kompilaci FLA do SWF se budete opravdu odkazovat na definici třídy uloženou v SWC-komponentě a nikoli na definici v původním AS souboru.

Soubor „Pokus.swc“ překopírujete do adresáře komponent - např. „C:\Program Files\Adobe\Adobe Flash CS3\cs\Configuration\Components“. Pak v souboru „aplikace.fla“ klikněte na panel komponent a zadejte volbu „Načíst znovu“. Ve stromu komponent by se ve složce „Standardní komponenty“ měla objevit nová položka - symbol „mc“.

Přetáhněte symbol „mc“ na scénu. Tím se zároveň přenese do knihovny v souboru „aplikace.fla“. Nyní zkuste do prvního snímku na hlavní časové ose přidat kód:


var p:Pokus = new Pokus();
trace(p.getStr());


a otestovat aplikaci. Pokud jste neudělali chybu, vypíše se text „Konstruktor funguje“. Zkuste si soubor „aplikace.fla“ uložit, zkompilovat (publikovat) do SWF a otestovat v prohlížeči. Zkuste si pohrát a použít i metodu třídy „setStr“. Nakonec soubor „aplikace.fla“ uložte a zavřete.

Pokud otevřete soubor „aplikace.fla“ na jiném počítači, bude v jeho knihovně stále přítomna komponenta „mc“, která bude obsahovat již předkompilovanou definici třídy „Pokus“. Kompilace FLA do SWF tedy bude možná i zde, aniž byste zdrojový AS soubor třídy „Pokus“ museli mít k dispozici.

Pěkné, že?

Žádné komentáře:

Okomentovat

Chovejte se zde, prosím, jako v místnosti plné lidí, na kterých Vám záleží. Děkuji :o)