Daha Az Kod Kullanarak Yüksek Sayıdaki Film Klibi(MovieClip) ve Düğmeleri(Button) Görevlendirmek

Posted on Pazartesi, Şubat 15th, 2010 at 18:35

Daha basit ve hızlı olmasını öngörerek nesne tabanlı olmayan, bolca MovieClip(film klibi) kullandığınız çalışmalar hazırlamışsınızdır. Özellikle e-learning uygulamalarında 10 ila 20 sayfalık film kliplerinde gezinmeyi sağlayan bir program yazmak istediğnizde, anlatacağım teknikler işinizi çok kolaylaştıracak. 5-6 ‘dan daha az sayfa için her butona ya da movieClip’e dinleyici ekleyebilirsiniz. Çok fazla sayfanız ve düğmeniz varsa, butonların kendiliğinden kütüphaneden gelip dizildiği nesne tabanlı uygulamalar hazırlamanızı öneriyorum. Biz de hız kazanmak açısından hangi teknikleri kullanabileceğimize bakalım.

Bu uygulamada tüm butonlara tek tek görev eklemek ve fonksiyon atamak yerine, tüm butonları tek bir film klibine hapsetmek suretiyle film klibine görev ekleyecek ve tek bir fonksiyon ile hangi tuşa basıldığının tesbitini yaparak framelerde gezinmeyi sağlayacağız.

butonlar_mc.addEventListener(“click”,git);

Temel mantığımızı bu satır üzerine kuracağız

Öncelikle çalışmamızda kullancağımız split metodundan bahsedelim

String bir değişken sınıfının alt fonksiyonu olarak kullanılıyor. Kullanıldığı değişkeni ikiye ayırıp yeni bir diziye atayan fonksiyona split diyoruz. Yani ayırma fonksiyonu.

İçerisine string bir değer kabul ediyor. Bu değerden öncesini ve sonrasını parçalıyor. Değeri geri dönürdüğümüzde array nesnesi elde ediyoruz. Bunun da elemanlarına ulaşabiliyoruz.

String bir değişken oluşturalım.

var testStr:String= “as3coder.com”;

Şimdi bu değişkeni görüntüleyelim

trace(testStr); // as3coder.com

Değişkenimizi nokta ile parçalayalım ve yeni dizi elemanlarımızı görüntüleyelim

trace(testStr.split(”.”)[0]); //as3coder

trace(testStr.split(”.”)[1]); //com

Tabi burada bunu diziye tek seferde atıp elemanlarınıda çekebiliriz.

var testDizi:Array = testStr.split(”.”);

trace(testDizi[0], testDizi[1]);

gibi.

Sayfamızda 10 tane buton olsun. Bu butonlara tıklandığında frame değişsin. Mesela 8. butona tıklandığında frame 8′e atlayalım.

Butonların olduğu frameyi ayrı, içeriği ayrı bir layer(katman)’da tutunuz. Böylece butonları 10 framede uzatmak için insert frame, içerikleri ise her frame için insert keyframe komutuyla ayırabilelim. Şekilde ki düzenleme uygun olacaktır.

Şekil 2

Bu uygulamada frameler’e göndermek üzere 10 butonumuz var. Bunları “buton1_btn”, “buton2_btn” şeklinde isimlendirmemiz gerekiyor. Ya da başka şekilde ama o zaman yazımıda değiştirmemiz gerekir.

gotoAndStop() , git ve dur anlamına gelen, değer olarak integer yani tamsayı kabul eden bir fonksiyon.

Yazımı şu şekilde: gotoAndStop(2);

Bakalım bu uygulamada kodlardan kaç satır tasarruf edeceğiz. Her butona tek tek görev eklemek istersek yazılım şu hali alıyor.

buton1_btn.addEventListener(”click”,git1);

buton2_btn.addEventListener(”click”,git2);

buton3_btn.addEventListener(”click”,git3);

buton4_btn.addEventListener(”click”,git4);

buton5_btn.addEventListener(”click”,git5);

buton6_btn.addEventListener(”click”,git6);

buton7_btn.addEventListener(”click”,git7);

buton8_btn.addEventListener(”click”,git8);

buton9_btn.addEventListener(”click”,git9);

buton10_btn.addEventListener(”click”,git10);

function git1(e:MouseEvent) {

gotoAndStop(1);

}

function git2(e:MouseEvent) {

gotoAndStop(1);

}

function git3(e:MouseEvent) {

gotoAndStop(1);

}

function git4(e:MouseEvent) {

gotoAndStop(1);

}

function git5(e:MouseEvent) {

gotoAndStop(1);

}

function git6(e:MouseEvent) {

gotoAndStop(1);

}

function git7(e:MouseEvent) {

gotoAndStop(1);

}

function git8(e:MouseEvent) {

gotoAndStop(1);

}

function git9(e:MouseEvent) {

gotoAndStop(1);

}

function git10(e:MouseEvent) {

gotoAndStop(1);

}

Şu an okuması bile zor olan 42 satırımız var…

Bundan daha kısa bir yol olarak tek bir fonksiyon girebilirdik.

function git(e:Event) {

if (e.target.name==”buton1_btn”) {

gotoAndStop(1);

}

if (e.target.name==”buton2_btn”) {

gotoAndStop(2);

}

…….

}

Ancak bu da hayli uzun bir yazım olurdu.. case swich ile yapabilirdik. Yazımı biraz daha kısaltırdık. Bütün bu uzun seçenekler yerine yine de biz, split metoduyla gotoAndStop fonksiyonuna değer gönderebiliriz. Hatta her butona tek tek görev eklemek yerine, onları bir film klibi içine alıp sadece film klibine’de görev ekleyebiliriz.

Hatırlayacağınız gibi target, hedef nesneyi, currentTarget en dışarıdaki hedefi döndürüyordu. Yani bir film klibi oluşturup içine 10 tane buton eklesek, butonlar_mc ‘nin addEventListener fonksiyonunu çalıştırsak, if e.target==”buton1_btn” desek yine aynı şeyi elde etmiş olacağız. Ancak bundan önce split metoduyla birdaha deneyelim.

buton1_btn.addEventListener(”click”,git);

buton2_btn.addEventListener(”click”,git);

buton3_btn.addEventListener(”click”,git);

buton4_btn.addEventListener(”click”,git);

buton5_btn.addEventListener(”click”,git);

buton6_btn.addEventListener(”click”,git);

buton7_btn.addEventListener(”click”,git);

buton8_btn.addEventListener(”click”,git);

buton9_btn.addEventListener(”click”,git);

buton10_btn.addEventListener(”click”,git);

function git(e:Event) {

gotoAndStop(int(e.target.name.split(”_”)[0].split(”buton”)[1]));

}

Kısaca ne yaptığımızı anlatayım.

Eğer git fonksiyonunun içinde:

trace(e.target.name); yazsaydık “buton1_btn” gibi çıktılar alırdık.

Eğer trace( e.target.name.split(”_”) [0]); yazsaydık, “buton1″ çıktısını alırdık.

Dolayısıyla split metodu ile bir dizi oluşturmuş oluyoruz. Bu dizinin sıfırıncı elemanı, “buton1_btn” nin “_” ‘den parçalanmış halinin ilk elemanı olur.

İki eleman sırasıyla şöyledir: “buton1″ ve “btn”

İlk elemanı(buton1) yeniden parçalamak istersek

e.target.name.split(”_”)[1] kısmından sonra tekrar split ekleriz böylece şuna benzer: String(”buton1″).split(”buton”)[1]

Ekleyelim: e.target.name.split(”_”)[0].split(”buton”)[1];

“buton1 ‘in”, “buton’dan” ayrılmış kısmının birinci elemanı “1″ olacaktır. Sıfırıncı elemanı boş olacaktır. Bunun çıktısını alalım.

trace(e.target.name.split(”_”)[0].split(”buton”)[1]); // 1

Burada “buton1″ şeklindeki terimi “buton” ifadesinden parçalamış oluyorum. Böylece yeni dizimin sıfırıncı elemanı “buton”, birinci elemanı, “1″ olmuş oluyor.

Artık yapılması gereken tek şey elde edilen değeri integer yani tam sayı haline çevirilmesi.

int(”1″); in asıl değeri 1 olarak döner yani tamsayıdır. Eğer int(e.target.name.split(”_”)[0].split(”buton”)[1]) yazarsak yine gerçek bir integer olarak 1 sayısı dönecektir.

o zaman gotoAndStop(int(e.target.name.split(”_”)[0].split(”buton”)[1]));

yazarsam program beni 1. frameye gönderecektir. Şu halde yazılımımız oldukça kısaldı. Ancak ilerleyen aşamalarda daha da kısaltmamız gerekecek.

buton1_btn.addEventListener(”click”,git);

buton2_btn.addEventListener(”click”,git);

……

function git(e:Event) {

gotoAndStop(int( e.target.name.split(”_”)[0].split(”buton”)[1] ));

}

Böylece 42 satırı 13 satıra indirmeyi başarmış olduk.

Şimdi yapacağımız uygulama ile 42 satırı sadece 3 satıra indireceğiz.

Tüm butonları tek bir film klibinin içine alın ve yeni film klibinin durum adını(instance name) butonlar_mc olarak değiştirin

Şu durumda butonlar_mc.addEventListener(”click”,git);

Şeklinde tek bir dinleyici ekleyebiliyoruz. Bu dinleyici kendi içerisindeki butonlarıda kaydederek fonksiyona gönderiyor. Bunu da target değişkenine kaydediyor.

Eğer böyle değilde sadece butonlar_mc nin bilgilerini çalıştırmak isterseniz git fonksiyonu içinde trace(e.currentTarget.name) .. vesaire şekillerde kullanabilirsiniz.

Ancak butonlar_mc’nin içindeki butonlardan hangisine tıklandığını anlamak istiyorsanız target değişkenine gelen değeri çağırabilirsiniz.

Programımızın son hali 3 satır olarak şu şekilde:

// KODLAR

stop();

// İçeride bulunan tüm butonlarımıza aynı görevi ekliyoruz
butonlar_mc.addEventListener(“click”,git);

// Git fonksiyonunu tanımlıyoruz

function git(e:Event) {

// git fonksiyonuna gelen target değerlerini kullanarak
// işlem yapıyoruz. currentTarget değil.
gotoAndStop(int(e.target.name.split(“_”)[0].split(“buton”)[1]));

}

// Burak AYDIN | www.as3coder.com

Burak AYDIN | www.as3coder.com

Önizleme: http://as3coder.com/2010/02/13/daha-az-kod-kullanarak-yuksek-sayidaki-film-klibimovieclip-ve-dugmeleributton-gorevlendirmek/

Dosya: http://as3coder.com/dosyalar/daha_az_kod/daha_az_kod.fla

PDF: http://as3coder.com/dosyalar/daha_az_kod/Daha_Az_Kod.pdf

KODLAR(HTML): http://as3coder.com/dosyalar/daha_az_kod/daha_az_kod.html

İstersen yorum yazabilirsin, ya da kendi sitenden "geridönüş" (trackback) ekleyebilirsin.

12 Yorum yazılmış

 1 

artık tween kullanarak gerçekten çalışma çıkmıyor ve boyut şişiyor. yüzlerce satır kasıp,proto yazıp,…ortalığı şenlendirmek lazım. şu anki projemde çokça kullandığım yöntemler,zira tüm butonlarımız dinamik.

ama biz as3′e geçmedik,ayıp ettik ayrı mesele :) çok güzel düşünmüşsünüz kardeşim, ayrıca uzun ve kısa halinden bahsetmeniz de hayli yerinde…

Mart 20th, 2010 at 21:13
 2 

Teşekkürler abi (: asıl senin eline sağlık yorumun için.

En kısa zamanda as3′e geçmeni isterim. Aynı şekilde tweenmax’a de tabi. Dilediğinizce kısa kod ve fonksiyonel programlar yazabilirsiniz tweenmax ile. algoritma sizi zorlamaz.

Mart 21st, 2010 at 07:11
 3 
Galip Şenol:

arkadaşım çok teşekkür ederim böyle bir problemim vardı sayende çözmüş oldum. Allah Dokunduğun klavye tuşlarını altın etsin inşallah

Nisan 7th, 2010 at 10:09
 4 

Aminnnnn (:

Nisan 7th, 2010 at 10:12
 5 
Galip Şenol:

ben senin bu örneğini foto galeri hazırlamak için kullandım fakat şimdi buresimlere kaç kez tıklandığını bulmam gerek her bir resmin kaç kez tıklandığını bulmalıyım bana yardım edermisin?

Nisan 13th, 2010 at 13:47

Merhaba

Her resim bir film klibinin içindedir. her film klibinin içine bir değişken ekleyebilirsiniz. Böylece her tıklaamada artırırsınız.

Saygılarımla

Nisan 13th, 2010 at 15:32
 7 
Galip Şenol:

teşekkür ederim ama bi soru daha sorarak seni rahatsız edicem şimdi sayfayı okul için yapıyorum aldığımız host veri tabanı ile çalışmamızı desteklemiyormuş (öle dediler) şimdi ben galerimi sayfa içine koyduğumda herkes için sayaç sıfırdan başlar hatta sayfayı yenilediğinde bile tekrar sıfırdan başlar veri tabanı kullanmadan bu işi yaptırabilirmiyim

Nisan 14th, 2010 at 09:48

merhaba

hostunuz php destekliyorsa txt belgesine de yazabilirsiniz. ancak bu konuda hiç bir fikrim yok.

saygılarımla

Nisan 14th, 2010 at 11:52
 9 
Galip Şenol:

ben hala sana sorduğum bu sayaç sorununu çözemediğim için seni rahatsız etmek zorunda kaldım kusura bakma text dosyaya bilgi yazdırmak ya ada text dosyadan bilgi çağırmakla ilgili bir çok arama yapmama rağmen henüz hiç bir şey bulamadım. hangi komutları kullanmam gerektiği konusunda bana yardım edebilir misiniz? bildiğiniz bir kaynak veya önerebileceğiniz bir adres va mı acaba? :(((

Nisan 19th, 2010 at 09:12
 10 

Mehaba

Bu işlemleri php ile yapıyorsunuz bu çok önemli. sadece yapılan işlemleri php den flasha gösterebilirsiniz bu durumda. ancak dosya açma dosyaya yazma kısm php nin kendisiyle ilgili.

php de ki open ve write gibi komutları inceleyebilirsiniz.

saygılarımla. umarım sonuca ulaşırsınız

Nisan 19th, 2010 at 10:44
 11 
erkan çimen:

güzel bir uygulama

Mayıs 20th, 2010 at 09:23

Teşekkürler erkan (:

Mayıs 22nd, 2010 at 23:26

Yazmayan ölsün..

Adın
e-Postan (Yayımlarsam ne olim)
Siten
Gençliğini neyle değerlendirdin?
Yorumun: