Fonksiyon Çeşitleri ve Kullanımı


Javascript gibi bir dil bilenler için anlaması kolay olan konudur. Dil bilmeyenler içinse fazla bir sorun yoktur. Komut iskeletini ve kullanım şeklini bildikten sonra uygulanması oldukça kolay olacaktır.

Fonksiyonların 2 türü vardır.

1- Flash içindeki hazır fonksiyonlar. Bunlar konumuzun dışındadır. getTimer, isFinite vs. gibi hazır fonksiyonlara actionscript panelinde functions bölümünden ulaşabilirsiniz.

2- Kullanıcı tarafından yazılan fonksiyonlar. Temel yapı aşağıdaki gibidir.

functions fonksiyon_adı(parametre){
..............
}

Detaylara geçmeden önce önemli bir konuyu belirtelim. Kullanıcı tarafından yazılan fonksiyonlar sadece bir frame üzerine yazılır. Hazır fonksiyonlardaki gibi bir klip veya butona atanamazlar. Frame üzerinde yazılmış fonksiyonu bir buton veya klipten çağırabilirsiniz. Bu fonksiyonların 4 yazılım şekli vardır.

Altyordam olarak çalışan fonksiyonlar

Bilindiği gibi tüm fonksiyonlar genelde bir değer üretmek için kullanılırlar. Altyordam türü fonksiyonlarda bir değer üretimi sözkonusu değildir. Burada amaç bir kod deposu hazırlamak daha sonra bu kodları gerekli olan yerlerden çağırmaktır.

Altyordam fonksiyonlarını bir fla dosyasında birden fazla yerde aynı komutu kullanmak gerektiğinde çok faydalıdır. Tek bir kelime ile yüzlerce depo kod yığınını çağırma imkanı sunarlar. Özetle bizi yüzlerce aynı tür kodu birden fazla yerde yazma zahmetinden kurtarırlar.

Bunu bir örnekle görelim. Alttaki dosyada örnek adı anaklip olan ve ayrıca içinde 7 tane butonu içeren 7 ayrı klip daha (örnek adları klip_1, klip_2, klip_3.............klip_7) mevcuttur. Anaklip içinde 7 kare vardır. Burada istenilen uygulama şudur:
1 numaralı butona basıldığında bu butonu içeren klip 50 piksel sağa ilerleyecek, diğer 6 buton ilk haline dönecek ve ayrıca anaklip 1 nolu kareye ilerleyecek.
2 nolu butona basınca yine aynı işlemler olacak fakat anaklip 2 nolu kareye atlayacak. Bu işlem 7 buton için de uygulanacak.


DOWNLOAD

Dosya üzerinde deneme de yaptığınıza göre konu iyice şekillenmiş olmalıdır. Bu durumda 7 butona da şu komutu vermeliyiz.

on (release) {
anaklip.gotoAndStop(1);
for (i=1; i<8; i++) {
_root["klip_"+i]._x = 0;
}
_root["klip_"+anaklip._currentFrame]._x = 50;
}


Komut dizileri aşağıda açıklanacaktır. Önce konunun ana hatlarını anlayalım. Gördüğünüz gibi sadece kırmızı ile yazılmış alandaki frame numarasını değiştirmek ve diğer butonlara atamak sorunumuzu çözüyor.Kırmızı dizinin alt kısmı hep aynı kodları içermekte. Bu durumda bu alanı bir fonksiyon içine alıp butonlara sadece şu komutu atamak son derece pratik olacaktır:

on (release) {
anaklip.gotoAndStop(1);
kutulari_tasi();
}

Değiştirilmesi gereken tek yer kare numarası olacaktır. Şimdi ana timeline`da 1.kareyi seçip fonksiyonumuzu oluşturalım:

function kutulari_tasi() {
for (i=1; i<8; i++) {
_root["klip_"+i]._x = 0;
}
_root["klip_"+anaklip._currentFrame]._x = 50;
}

Önce fonksiyonlardaki kodları açıklayalım.

İlk dizinde kutulari_taşi adında bir fonksiyon kuruyoruz. prantez içinde bir parametre taşımıyor. 7 buton içeren film klibimiz olduğuna göre (klip_1,kli_2,..., klip_7) i değişkenini 1 değerinden başlatarak 7 değerine kadar rakam üreten bir döngü oluşturuyoruz.

Bir alt dizinde kutuları ilk hali olan x düzeyinde 0 numaraya çekiyoruz. _root["klip_"+i] Burada i değişkeni 1,2,3,4...7 şeklinde rakam üretmektedir. bunu "klip_" stringi ile birleştirdiğimizde klip_1, klip_2....klip_7 şeklinde 7 adet klibimizin örnek adı oluşturulmaktadır._root ile köşeli parantezler aracılığı ile birleştirildiğinde her döngü kurulduğunda ortaya çıkan _root.klip_1._x=0 dizini oluşmaktadır. Böylece tüm klipler x=0 düzlemine çekilmektedirler.

Bir alttaki dizinde tıklanan butonun 50 piksel açılması sağlanmaktadır. Butonlara şu komut atanacaktı

on (release) {
anaklip.gotoAndStop(1);
kutulari_tasi();
}

Gördüğünüz gibi butonlara tıklanınca 1 nolu buton anaklipte 1.kareye, 2 nolu buton 2. kareye .......7 nolu buton 7.kareye atlamakta sonra fonksiyon komutu icra edilmektedir. Bu durumda anaklipteki o anda bulunduğumuz kare numarası aynı zamanda ilerleyecek klip numarası ile aynı olacaktır.

_root["klip_"+anaklip._currentFrame]._x = 50;

Yukardaki komut ile klip1 stringine o anda anaklipte olduğumuz kare numarası eklenerek 50 piksel ilerleyecek klip adı ortaya çıkartılmaktadır. Örneğin bu 2 nolu buton için; _root["klip_"+2]._x = 50; yani _root.klip_2._x=50 olur. Ve 2 nolu klip 50 piksel sağa ilerler. Her butona basıldığında anaklipte gidilen kare numarası değiştiğinden ilerleyecek klipde değişecektir.

Artık butona atanan tek bir komutla filmimizi çalıştırmamız mümkün olacaktır.

on (release) {
anaklip.gotoAndStop(1);
kutulari_tasi();
}

Bir sonraki fonksiyonda ise aynı işlemi sadece:

on (release) {
kutulari_tasi();
}

komutuyla yapma imkanımız olacaktır.

Parametre alan fonksiyonlar

Fonksiyonlarda parametre kullanılması, bu parametreye farklı değerler vererek birden fazla yerde kullanmak amacını güder. Yukardaki örnekle devam edelim. kutulari_taşi fonksiyonuna hedef_kare parametresini ekleyelim. Bu durumda 1.karede oluşturulan fonksiyonun görünümü şöyle olacaktır:

function kutulari_tasi(hedef_kare) {
anaklip.gotoAndStop(hedef_kare);
for (i=1; i<8; i++) {
_root["klip_"+i]._x = 0;
}
_root["klip_"+anaklip._currentFrame]._x = 50;
}

Butonların herbirine şu komutu verelim:

on (release) {
kutulari_tasi(1);
}

Buradaki 1 rakamı hedef_kareye 1 değerini atar. Bu buton 2 için 2....., buton 7 için 7 olacaktır.

Bir üst kısımlaki fla dosyasını indirerek buton ve 1.kareye yukardaki komutları eklediğinizde sorunsuz çalışacağını göreceksiniz. Yine de hazır bir dosya istiyorsanız alttaki linkten indirebilirsiniz.

DOWNLOAD

Değer döndüren fonksiyonlar

Komutun yapısı şöyledir:

function fonksiyon_adi(parametre){
return.......;
}

Burada return dönen değerdir. Alttaki örneği inceleyelim. Burada bir site içinde geçirilen zamanın hesabı yapılmıştır. Bildiğiniz gibi bir swf dosyası açıldığında hemen görünmez bir kronometre çalışmaya başlar. Bu değere ulaşmak için getTimer() fonksiyonu kullanılır. Şayet bir swf dosyasında 1.kareye baslama_suresi=getTimer(); yazıp başka bir kareye trace(getTimer()-baslama zamanı) yazıp filmi oynattığınızda başlangıçtan itibaren geçen süre çıktı penceresinde gözlenecektir.
Şimdi alttaki örneğe bakalım. Butonu tıkladığızda sayfanın açıldığı zamandan butonu tıkladığınız ana kadar geçen süreyi öğrenebilirsiniz. İsterseniz peşpeşe tıklamalarda bulunun. Her defasında geçen süre artacaktır. ***Bu örnek sayın Memduh Saraç`ın kitabindan alınmıştır.

Sahneye metinkutusu değişken adını taşıyan bir dinamik metin kutusu çizilmiştir. Timeline`da 1.kareye şu komutları atayın:

giris_zamani=getTimer();
function hesapla(sure){
sure=(simdi-giris_zamani)/1000;
if(sure<=60){
mesaj=int(sure)+" saniye";
}else if(sure<=3600){
mesaj=int(sure/60)+" dakika "+int(sure%60)+" saniye";
}else{
mesaj=int(sure/3600)+" saat "+int((sure%3600)/60)+" dakika "+int(sure%60)+" saniye";
}
return mesaj;
}

Butona şu komutları verin:

on (press) {
simdi=getTimer();
metinkutusu=hesapla(simdi);
}

Fonksiyon içinde bilinmeyen tek değer olan simdi değerinin butona tıklandığında fonksiyona gönderildiğine dikkat edin.

İlk dizinde sayfanın açıldığı andaki zaman tesbit ediliyor. Sonra hesapla adı verilen fonsiyon oluşturuluyor. Buna ait sure parametresinin değeri sure=(simdi-giris_zamani)/1000; komutu ile atanıyor. Buradaki simdi değişkeninin değeri butona basıldığı andaki değer olacaktır. Bu değerden giriş değeri çıkartılarak kullanıcının sayfanızda kaldığı süre milisaniye olarak tesbit ediliyor. Bu değerde 1000 e bölünerek saniye cinsinden süre elde ediliyor.

if(sure<=60){
mesaj=int(sure)+" saniye"; bu komutlarla şayet geçirilen süre 60 saniyenin altında ise (int değeri yuvarlamaya yarıyor) mesaj değişkeni sonucu saniye cinsinden veriyor.

}else if(sure<=3600){
mesaj=int(sure/60)+" dakika "+int(sure%60)+" saniye"; geçen süre 60sn-3600 sn araında ise geçen süre önce 60 a bölünüp dakika değeri bulunuyor. sonra kalan değer saniye cinsini gösteriyor. Burada sık yapılan bir hata vardır.sure%60 ifadesi değerin yüzde altmış`ını vermez. sure değerini 60 a böldüğünüzde arta kalan değeri verir. 3600 değerinin 1 saate karşılık geldiğine dikkat ediniz.

else{
mesaj=int(sure/3600)+" saat "+int((sure%3600)/60)+" dakika "+int(sure%60)+" saniye"; Üstekilerin hiçbirisi değilse o zaman geçen süre 1 saatten fazladır. Süre 3600 e bölünüp saat değeri, %3600 ile kalan değeri 60 a bölüp dakika değeri, kalanıda saniye değeri olarak mesaj değişkenine atanır.

Ve sonuç mesaj olarak döner.

Şimdi butona ait komutlara bakalım:

on (press) {
simdi=getTimer();
metinkutusu=hesapla(simdi);
}

Butona basıldığı andaki zaman değeri alınarak simdi değişkenine atanıyor. Sonra hesapla fonksiyonuna değer gönderiliyor ve mesaj sonucu metinkutusuna atanıyor.

Metod olarak kullanılan fonksiyonlar

_root.klip.gotoAndPlay(2); komutunda klip 2 numaralı kareye atlayarak oynamaya devam eder. Bu bir metoddur. Aynı işlemi bazı durumlarda fonksiyonlarla da oluşturmak mümkündür. Şimdi alttaki örneği inceleyin. Her 3 butona peşpeşe basmaya devam edin. 1 nolu butona her basıldığında mavi klip klip 10 piksel büyüyecektir. 2 nolu butona her basışta yeşil klibin saydamlığı %20 artacaktır.3 nolu butonda ise heriki işlemde oluşacaktır.


DOWNLOAD

Burada örnek adı mavi,yesil ve kirmizi olan 3 klip örneği ve 3 adet buton mevcut.
Mavi film klibinin ilk karesine:

function buyult() {
_xscale += 10;
_yscale += 10;
}

Yesil film klibinin ilk karesine:

function saydamlastir() {
_alpha -= 20;
}


Kirmizi klibinin ilk karesine:

function buyult() {
_xscale += 10;
_yscale += 10;
}
function saydamlastir() {
_alpha -= 20;
}


komutlarını atıyoruz. Daha sonra aynı gotoAndPlay() dizinindeki gibi bir metod yazılımı ile bu fonksiyonları butonlara veriyoruz.

1 nolu buton:
on (press) {
_root.mavi.buyult();
}

2 nolu buton:
on (press) {
_root.yesil.saydamlastir();
}


3 nolu buton:
on (press) {
_root.kirmizi.buyult();
_root.kirmizi.saydamlastir();
}


Burada _root eklentisini fonksiyonlar film klipleri içinde olduğundan mutlaka kullanmak gereklidir.