Swfler arası iletişim
Aytekin Meral Tarih: 5/06/2009 Yorum: 1 adet
Okunma : 894 Tutanlar: Bu yazıyı 0 kişi tuttu.
-Birbiri içine yüklenen 2 swf birbirlerinin değişken, fonksiyon ve methodlarına nasıl ulaşır?
-Actionscript 2.0'da kullandığımız _global'a ne oldu?
-static public değişkenler AS 3.0 yazarken en çok nerelerde işimize yararlar.
Yukardaki soruların bazıları, swfler arasında iletişim kurarken karşılaşabileceğiniz problemler arasında yer alabilir. Gelin bu soruları tek tek cevaplayalım ve birbiri içine yüklenen swf'ler arasında veri iletişiminin en kolay nasıl yapılacağını keşfedelim.
Soru 1) Birbiri içine yüklenen 2 swf birbirlerinin değişken, fonksiyon ve methodlarına nasıl ulaşır? Cevap: Değişkenlere ulaşmak için bu 2 swf içine de import edilmiş bir class (bir nevi runtime shared class, yani anlık oynama sırasında paylaşılan class) ve methodlara ulaşmak için de EventDispatcher ya da bahsi geçen runtime shared class kullanılır. Şimdi bu iki olayı da ayrı ayrı inceleyelim.
yöntem 1) static public değişkenler içeren bir class kullanmak: Öncelikle global.as adında bir class oluşturalım.
package {
import flash.display.MovieClip;
public class global {
static public var ANA_ROOT:MovieClip;
static public var COCUK_ROOT:MovieClip;
}
}
ANA_ROOT: yükleyen swf'nin timeline'ı COCUK_ROOT: yüklenen swf'nin timeline'ı
Daha sonra ana.fla ve cocuk.fla adında iki FLA oluşturalım ve global.as ile yanı dizine ekleyelim.
ANA.FLA kodları
import global;
global.ANA_ROOT = this;
//işte sihir burada. ana.swf'nin root'unu static bir değişkene atadık.
//Artık istediğimiz her yerden ona erişebiliriz.
var anaDegisken = "Ben ana.swf içinde bir değişkenim ve cocuk.swf içinden çağrıldım"
var loader = new Loader();
loader.load(new URLRequest("cocuk.swf"));
addChild(loader);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
function onComplete(e:Event):void {
global.COCUK_ROOT = e.target.content;
//cocuk.swf'nin root'una erişmek için onun tamamının ana.swf içine yüklenmesi gerekir.
//Yükleme işlemi bittiğinde eşitlemeyi yapıyoruz.
trace(global.COCUK_ROOT.cocukDegisken)
//burda cocuk.swf içinde bulunan bir değişkene ana.swf'den ulaşıyoruz.
}
COCUK.FLA kodları
import global;
var cocukDegisken = "Ben cocuk.swf içinde bir değişkenim ve ana.swf içinden çağrıldım";
trace(global.ANA_ROOT.anaDegisken);
//dikkat ederseniz ana.swf'nin rootuna global.ANA_ROOT ile erişiyoruz.
yöntem 2) Event Dispatcher ile methodlara ulaşmak.
Öncelikle kendi olaylarımızı yazıyoruz.
//MyEvents.as içeriği
package {
import flash.events.Event;
public class MyEvents extends Event {
public var data:Object;
public static const FONKSIYON_CAGIR:String = "callAFunction";
public function MyEvents(type, bubbles, cancelable) {
super(type, bubbles, cancelable);
}
override public function clone():Event {
var evt:MyEvents = new MyEvents(type, bubbles, cancelable);
evt.data = data;
return evt;
}
}
}
//ANA.FLA içeriği:
import MyEvents;
var loader = new Loader();
loader.load(new URLRequest("cocuk.swf"));
addChild(loader);
addEventListener(MyEvents.FONKSIYON_CAGIR, birFonksiyon);
function birFonksiyon(e:Event):void {
if (e.hasOwnProperty("data")) {
var param = Object(e).data;
trace("Ben ana.swf içinde bir fonksiyonum ve cocuk.swf içinden parametre gönderilerek çağrıldım. Parametrem ise şudur: "+param);
} else {
trace("Hata oluştu.");
}
}
//COCUK.FLA içeriği
import MyEvents;
var newEvent = new MyEvents(MyEvents.FONKSIYON_CAGIR, true, true);
newEvent.data = "12345"
dispatchEvent(newEvent);
Bu şekilde cocuk.swf içinden ana.swf içindeki fonksiyonu çağırmış olduk. Bu yöntemi daha çok büyük projeler yazarken kullanmak size çok zaman kazandıracaktır. Çünkü flash içerisinde birçok yeni olay yaratacaksınız ve olay kütüphaneniz oluşmaya başlayacak.
Soru 2) Actionscript 2.0'da kullandığımız _global'a ne oldu? Cevap: _global artık yok. Onun yerine yukardaki birinci yöntemde kullandığımız static public değişkenler kullanıyoruz. Çünkü AS 3.0 class-based(sınıf tabanlı) bir yapı. Ana.swf dediğiniz şeyin kendisi aslında bir class, çocuk.swf ise ayrı bir class. Siz bu ikisi arasında iletişim kurarken, doğal olarak classlar arasında iletişim kuruyorsunuz. Bu da bize static, public, private, extends, super gibi anahtar ve methodların önemini gösteriyor tekrar.
Soru 3) static public değişkenler AS 3.0 yazarken en çok nerelerde işimize yararlar. Cevap: static public anahtarına sahip değişkenler, document class içinde olmamak koşulu ile, yani bir movieClibe ya da timeline'a adreslenmemiş iseler, import edildiği tüm classlar içinden erişilebilir ve runtime'da değiştirilebilirler. Kısacası bu türdeki değişkenleri hepsi _global değişken olabilirler. Aynı şekilde static public fonksiyonlar da tanımlayabilirsiniz.
Etkinlikler
Toplantı
Özgür Yazılım ve Linux Günleri '10
Özgür Yazılım ve Linux Günleri '10
İstanbul Bilgi Üniversitesi Bilgisayar Bilimleri Bölümü ve Linux Kullanıcıları Derneği'nin 9 yıldır düzenlemekte oldukları etkinlikler bu yıl `Özgür Y...
Kategori:
Toplantı
Kimler Burada? 
Son 1 dakika içinde MMIstanbul' da 59 (50 kayıtlı, 9 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:
MMIstanbul Blog'undan
Blog Bölümü Blogevi.com'a Taşınıyor
Selam arkadaşlar MMIstanbul'da , tasarımcı ve programcıların blog yazılarını "feedleyerek" MMIstanbul okurlarını MMIstanbul dışın ...
7.500'üncü üyemiz Cem Koç!
Neler Yapılabilir?
500 Hatası Hakkında!
Reklam, MMIstanbul ve Yeni Projeler (Durumumuz Bu Tarzında)











loaderInfo aracılığı ile statik tanımlar olmaksızın da child swf'den ana swf'nin rootuna erişmek mümkün.
Child swf şöyle bir kod çalıştırırsa:
ana swf'nin root'una loaderInfo arayüzünden erişir.
yordamı ile de ana.swf'deki değişkene child swf den erişilir.