18. září 2008

Když vázne komunikace mezi flash animacemi při více otevřených oknech prohlížeče

Komunikace mezi více Flash animacemi, které jsou umístěny na jedné HTML stránce se dá velmi elegantně řešit pomocí třídy Action Sriptu LocalConnection. Je však nutné ošetřit případ, kdy bude stejná HTML stránka otevřená ve více oknech. Jedno z řešení tohoto problému popisuji níže.

Jak se komunikace mezi SWF v jedné HTML stránce vlastně naprogramuje?

Představte si, že máte na stejné HTML stránce vložené dvě Flash animace (movie_1.swf a movie_2.swf) a chcete je navzájem synchronizovat, tzn. že animace z movie_2.swf se má spustit až v okamžiku, kdy animace v movie_1.swf dospěje do určité fáze - dejme tomu až přehrávání animace doběhne k snímku č.79.

Pomocí třídy Action Scriptu LocalConnection to vyřešíte tak, že do movie_1.swf na snímek č.79 vložíte následující kód:

var LC_12:LocalConnection = new LocalConnection();
LC_12.connect("CN_12");
LC_12.send("CN_12","FN_receiver_12");

a do movie_2.swf na první snímek tento kód:

stop();
var LC_12:LocalConnection = new LocalConnection();
LC_12.connect("CN_12");
LC_12.FN_receiver_12 = function()
{
_root.gotoAndPlay(2);
};

Přepodkládám přitom, že obě animace probíhají na hlavní časové ose, že animace v movie_1.swf se spustila a že animace v movie_2.swf začíná až na snímku č.2. Jiný způsob užití stejného postupu najdete např. v článku Komunikace mezi dvěma SWF soubory.

Je to jednoduché a jasné - prostě skvělé pro použití. Zádrhel je ovšem v tom, že když tutéž HTML stránku se zmíněnými Flash animacemi otevřete ve více oknech, budou všechny instance LocalConnection shodné napříč všemi okny. To, že se budou jmenovat stejně nevadí. Vadí to, že volají i naslouchají na stejné "telefonní lince", jejíž "číslo" jsem v AS nastavil natvrdo na "CN_12" - okno, neokno. Tím ovšem příjímač ve všech otevřených movie_2.swf totálně zmatu.

Co s tím?

Chtělo by to prostě pro každé okno unikátní "telefonní číslo". Pokud HTML stránku generujete dynamicky, nebo se můžete spolehnout na pomoc Java Scriptu, máte vyhráno. Stačí, když do tagu OBJECT, kterým vkládáte každou z obou zméněných Flash animací do HTML stránky, připojíte za název SWF souboru proměnnou, jejícž hodnotu nastavíte pro obě animace v téže HTML stránce sice shodně, ale okno od okna unikátně.

Proměnná se může jmenovat např. "cnprefix" a v HTML stránce pak bude na místě vložení SWF tento kód:

movie_1.swf?cnprefix=abcd

a

movie_2.swf?cnprefix=abcd

Pozor! Hodnota proměnné "cnprefix" musí být v jedné HTML stránce stejná, ovšem různá v různých oknech s toutéž stránkou. Asi nejbezpečnější je vkládat hodnotu časového razítka sečtenou s nějakým náhodně vygenerovanýcm řetězcem, což zaručí neopakovatelnost. Takže v jednom okně najdneme např.:

movie_1.swf?cnprefix=abcd2368358479
movie_2.swf?cnprefix=abcd2368358479

v druhém

movie_1.swf?cnprefix=xac2368358479
movie_2.swf?cnprefix=xac2368358479

(i když, jak to mohl vlastně uživatel stihnout, že) a v třetím

movie_1.swf?cnprefix=efg2368358521
movie_2.swf?cnprefix=efg2368358521

V obou Flash animacích se pak trochu změní kód Action Scriptu. V movie_1.swf bude:

var LC_12:LocalConnection = new LocalConnection();
LC_12.connect(_root.cnprefix + "CN_12");
LC_12.send(_root.cnprefix + "CN_12","FN_receiver_12");

a v movie_2.swf:

stop();
var LC_12:LocalConnection = new LocalConnection();
LC_12.connect(_root.cnprefix + "CN_12");
LC_12.FN_receiver_12 = function()
{
_root.gotoAndPlay(2);
};

Proč pro hodnotu "telefonnícho čísla" používám součet řetězců _root.cnprefix + "CN_12" a ne přímo hodnotu _root.cnprefix? Je to proto, že v rámci obou animací mohu chtít pro jiné účely vytvářet další instance LocalConnection a každá z nich musí používat unikátní "telefonní číslo".

Z důvodů přehlednosti se mi osvědčil postup, kdy jednotlivé komunikující dvojice instancí LocalConnection používají "telefonní čísla" jichž hodnota vyjadřuje, odkud kam se volá, tzn. např.: CN_12, CN_21, CN_21_A, CN_21_B atd. Tím mám zajištěnou unikátnost "telefonních linek" v rámci jedné HTML stránky a připojení hodnoty "cnprefix" jako předpony (proto tedy prefix) k všem "telefonním číslům" mi zas zaručuje unikátnost "linek" v jednotlivých oknech prohlížeče navzájem.

Žá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)