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.
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.
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.
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.