Türkiye Online Medya Araştırması
Profili Göster

Kod ile Animasyon

Yağız Gürgül Tarih: 9/06/2008 Yorum: 9 adet

Okunma : 1843 Tutanlar: Bu yazıyı 9 kişi tuttu.

Bu dersimde size kendi yazdığım bir sınıfı tanıtıcam. Bu sınıf timeline kullanmadan animasyon yapmanıza yardımcı oluyor :)

Bu sınıfla ile hazırlanmış en başarılı örnek Kahraman Teaser çalışmasıdır.

Neden Motion Tween varken kod kullanalımki? Bence en büyük neden boyuttur. Mesela Kahraman çalışmasının boyutu 17kb. JPEG screenshotı bile 20kb :)

İkinci bir neden ise kodlar ile hazırlanan bir animasyonun dinamik olmasıdır. Mesela siz bir topu bir yere götürüyorsunuz, normalde bu hareketin yavaş olması için daha fazla frame, daha hızlı olması için daha az frame kullanırsınız. Ama kodlarla ile hazırlarsanız sadece bir sayıyı değiştirmeniz yeterlidir.

Bu kısa bilgilerden sonra dersimize geçebiliriz :)

TimeLine.as:


package {
    ////////////////////////////////////////////
    //@ Yazar: Yağız Gürgül                   //
    //@ İstediğiniz gibi kullanabilirsiniz :) //
    ////////////////////////////////////////////
    import flash.events.Event;
    import flash.display.Shape
    //
    public class TimeLine  {

        //@Public vars:
        public var loop:Boolean=false;
        public var totalFrames:int;
        public var currentFrame:int;

        //@Privates vars:
        private var keyFrames:Array;
        private var holder:Shape
        private var i:int;
        private var version:String = "1.0";
        //
        public function TimeLine(_totalFrames:int=-1,autoStart:Boolean=true){
            holder=new Shape();
            totalFrames=_totalFrames;
            currentFrame=0;
            keyFrames=new Array();
            //
            if(autoStart) {
                start();
            }
        }
        //
        public function start():void {
            holder.addEventListener(Event.ENTER_FRAME,render);
        }
        public function stop():void {
            holder.removeEventListener(Event.ENTER_FRAME,render);
        }
        public function reset():void {
            holder.removeEventListener(Event.ENTER_FRAME,render);
            currentFrame=0;
        }
        public function clear():void {
            keyFrames = new Array();
            reset();
        }
        public function addKeyFrame(k:uint,f:Function):void {
            keyFrames[k]=f;
        }
        public function render(e:Event):void {
            if(currentFrame==totalFrames) {
                if(loop) {
                    currentFrame=0;
                }else{
                    stop();
                }
            }
            if(keyFrames[currentFrame]!=null) {
                keyFrames[currentFrame]();
            }
            currentFrame++;
        }
        public function toString():String {
            return "[TimeLine v: "+version+" ]";
        }
    }
}

Dosayı bir klasör içine kaydedin.

Yeni bir AS3 dosyası açın ve şu kodları yazın:


var zaman:TimeLine = new TimeLine(100);
trace(zaman);

Bu .fla dosyasını TimeLine.as dosyasının yanına kaydedip test edin. Şöyle bir yazı göreceksiniz: [TimeLine v: 1.0 ]

Yani TimeLine sınıfını çağırdık. Herhangi bir sorun yok :)

Şimdi kodlarımız şu şekilde olsun:


var zaman:TimeLine = new TimeLine(200);
trace(zaman);

zaman.addKeyFrame(0,getir);
zaman.addKeyFrame(100,gotur);

function getir() {
    trace("getir bakalim");
}
function gotur() {
    trace("gotur bakalim");
}

zaman.addKeyFrame(); fonksiyonu TimeLine üzerine keyframe ekliyoruz. İlk parametre frame numarası ikinci parametre ise o frame üzerine gelince çağırılacak fonksiyondur.

Ben bu örnekte 0. frame üzerine getir fonksiyonunu, 50. frame üzerine gotur fonksiyonunu koydum.

Bu satırların hemen altında ise o iki fonksiyonum duruyor. Çalışmayı test ettiğinizde önce şu yazıyı:


[TimeLine v: 1.0 ]
getir bakalim

Biraz sonra ise:


[TimeLine v: 1.0 ]
getir bakalim
gotur bakalim

yazılarını görüceksiniz. 0. frame üzerine eklediğimizden ve TimeLine 0. frame'den başladığından ilk önce getir bakalim gördük.Daha sonra TimeLine 50. frame üzerine geldiğinde ise gotur bakalim gördük.

Aslında tüm bu çalışmayı TimeLine sınfı kullanmadan, Timer ile bir id atarak da yapabilirdik ama daha uzun olurdu. Gördüğünüz gibi TimeLine sınıfı işinizi kolaylaştırıyor.

Biraz da görsel bir örnek yapalım. Mesela ortama bir kare çizin. Bunu movieclip haline getirin. Bunun instance name = kare_mc olsun.Ben bu kareyi sahneye getirip götürmek istiyorum. Bu noktada imdadımıza Flash CS3 ile gelen Tween sınıfı yetişiyor.

Frame kodumuz:


import fl.transitions.Tween;
import fl.transitions.easing.*;

var zaman:TimeLine = new TimeLine(200);
trace(zaman);

zaman.addKeyFrame(0,getir);
zaman.addKeyFrame(100,gotur);

function getir() {
    trace("getir bakalim");
    new Tween(kare_mc,"x",Elastic.easeOut,-200,100,3,true);
}
function gotur() {
    trace("gotur bakalim");
    new Tween(kare_mc,"x",Elastic.easeOut,100,1000,3,true);
}

getir fonksiyonu içine bir Tween satırı ekledim.Bu Tween satırı ile karemiz x kordinatında -200'den 100 noktasına geliyor.

gotur fonksiyonundaki Tween satırı ile de karemiz x kordinatında 100'den 1000 noktasına geliyor.

Çalışmayı test edince önce karemiz sahneye geliyor daha sonra ise sahneden gidiyor. Eğer bu hareketin sürekli olmasını istiyorsanız kodlarınıza şu satırı ekleyin zaman.loop=true;

Bu dersin ekinde TimeLine sınıfı ile hazırlanmış iki örnek bulabilirsiniz.

Sınıf hakkında bilgiler:

Sınıf Adı: TimeLine

Property

  • loop: zamanın sürekli tekrarlanmasını belirler. true veya false değeri alabilir. Defult olarak false'tur.
  • totalFrames: zamanın toplam süresini belirler. Eğer -'li değer verirseniz zaman sürekli ilerler. +'lı değer verirseniz zaman o değere geldiğinde ya durur ya da başa sarar.
  • currentFrame: zamanın o anki değerini verir. Buna değer atıyarak isterseniz zamanı geri veya ileri alabilirsiniz.

Method

  • TimeLine(_totalFrames:int=-1,autoStart:Boolean=true) - Sınıfın temelidir diyebiliriz. İlk parametre zaman uzunluğunu belirler.Defult olarak -1'dir. Eğer buraya değer girmesseniz zaman sürekli ileri gider. İkinci parametre ise construct'ı yazınca zamanın başlayıp başlamicağını belirler. Defult olarak false'tur.
  • start():void - Zamanı başlatır.
  • stop():void - Zamanı durdurur.
  • reset():void - Hem zamanı durdurur hem de zamanı başa alır.
  • clear():void - Tüm eklenmiş keyFrame'leri temizler
  • addKeyFrame(k:uint,f:Function):void - zaman üzerine keyFrame eklemeye yarar. İlk parametre frame numarasıdır. İkinci parametre ise zamanın o frame üzerine gelince çağıracağı fonksiyondur.

aç-kapa İçeriğin rss beslemesi kullanımda değil Yorumlar

Profili Göster
Mehmet KARACA 10/06/2008

merhaba gazing

eline salık çok güzel olmus ama ben daha çok tweener den faydalanılmasın dan yanayım


import caurina.transitions.Tweener;
stop();
var frame:uint =0;
Tweener.addTween( this , {  frame:60,
                            time:2,
                            transition:"easeOutBounce",
                            onUpdate:function(){
                                gotoAndStop(frame)
                            }
                        }
                );

prototype haline bile getirmeden bu kod ile tüm tweener esnekligi timeline de kullanabilinir.

kolaygelsin..<<

Profili Göster
Yağız Gürgül 10/06/2008

Kesinlikle ben de Tweener taraftarıyım. Yarattığınız veya var olan tüm Objectlere uygulanabilmesi gerçekten harika bir şey :)

Ama senin uyguladığın yöntemde gene tween var.Yani manuel olarak keyframe ekliyorsun.Ama bu yöntem dediğim gibi kb cinsinden şişiyor. Benim amacım işte bu boyutu en aza indirmekti ve bir kaç denemeden sonra şunu anladımki flash üzerindeki timeline boyutu arttırıyor.

Görsel olarak keyframe yerine, herşeyi kod ile yapmak çoğu yönden avantajlı :)

Profili Göster
metin gnc 10/06/2008

güzel anlatım..tebrikler

Profili Göster
Mehmet KARACA 11/06/2008

merhaba

zaten kod ile shape tween üretemiyoruz !

benim dikkat çekmeye çalıstıgım nokta Shape Tween leri de tweener ile kontrol edebilecegimiz di

zira shape tween hariç tüm animasyonlar için tmeline gereksiz.

tüm Motion Tween leri tweener ile kullanıyorum bu kapsam da bir yenilik kolaylıkmı var diye kodlara bak tım ama bise çıkaramadım ?

kolaygelsin..<<

Profili Göster
Yağız Gürgül 11/06/2008

Kesinlikle :) Benim de demek istediğim timeline üzerinde yaptığımız frame bazlı animasyonların gereksiz olduğu.

Sınıfımı tam anlamadığınızı düşenerek tekrardan özetliyorum.

Mesela siz bir kutuyu sahneye getirmek, bir süre sonra onu tekrar göndermek ve gene bir süre sonra tekrar getirmek istiyorsunuz. Bunu yapmanın bir kaç yolu var.

Yeni bir fla dosyası açın, yüksekliği ve genişliği 100px olan bir kare çizip bunu kare_mc instancelı bir movieclip haline getirin. Sahnenin genişliği de 800px olsun.

Frame kodumuz:


import caurina.transitions.Tweener;
//
var zamanID:int=0;
//
var zaman:Timer = new Timer(4000);
zaman.addEventListener(TimerEvent.TIMER,goruntule);
zaman.start();
//
function goruntule(e:TimerEvent) {
    if(zamanID==0) {
        gotur();
    }
    if(zamanID==1) {
        getir();
    }
    zamanID++;
    if(zamanID==2) {
        zamanID=0;
    }

}
//
function getir() {
    kare_mc.x=-200;
    Tweener.addTween( kare_mc , {x:100 , time:2});
}
function gotur() {
    Tweener.addTween( kare_mc , {x:900 , time:2});
}
getir();

Kodu test ettiğinizde basit bir animasyon görüceksiniz. Timer ile bir id değişkeni sayesinde sürekli yapıyoruz. Ama burada sadece iki eylem var.Bunun bir sürü olduğunu düşünün? Karmaşık olacaktır. TimeLine sınıfı işte burada devreye giriyor.

TimeLine sınıfı ile yapılmış aynı örnek:


import caurina.transitions.Tweener;
import TimeLine;
//
var zaman:TimeLine = new TimeLine(200);
//
zaman.addKeyFrame(0,getir);
zaman.addKeyFrame(100,gotur);
zaman.loop=true;
//
function getir() {
    kare_mc.x=-200;
    Tweener.addTween( kare_mc , {x:100 , time:2});
}
function gotur() {
    Tweener.addTween( kare_mc , {x:900 , time:2});
}
getir();

Bu kadar basit :) Umarım demek istediğimi anlatabilmişimdir. Kolay gelsin...

Profili Göster
Mehmet KARACA 11/06/2008

:) TimeLine yi yanlıs anladım ben belli zamanlarda belli function çalıstırmak mis. class haline getirmek çok güzel olmus eline salık

ben belli zamanlar da belli function ları çalıştırmak için şöyle bir yöntem kullanıyor dum


function timeList_Control( t , l ){
    for( var i:* in l){
        l[i].time == t ? (l[i].fnc() ) : ("null");
    }
}

// time function listem
var timeList:Array = [
    { time:1 , fnc:function(){ trace("time:1")} },
    { time:5 , fnc:function(){ trace("time:5")} },
    { time:43 , fnc:function(){ trace("time:43")} }
]

timeList_Control( 1 , timeList );

tweener le bu sekilde barısık


var sayac:uint = 0;
function dongu() {
    sayac++
    timeList_Control( sayac , timeList );
};
Tweener.addCaller( this , {onUpdate:dongu, time:50, count:50 , transition:"linear"});

bunu tween , tweener , enterFrame ,timer , setInterval vs. ile enterge kullanıyorum

senin class ı gelistirmek lazım :)

Profili Göster
Yağız Gürgül 12/06/2008

Evet bir sürü işlemlerde çok kolaylık sağlıyor :)

Herkes istediği doğrultuda sınıfı geliştirebilir :)

Profili Göster
fatih bozkuş 4/07/2008

import caurina.transitions.Tweener; bu kısım neden hata veriyor. Yazdıklarını yapıyorum,olmadrı kopyalayıp yapıştır yaptım bulamadım.

Profili Göster
fatih bozkuş 31/12/2008

Teşekkür ederim.Çok faydalı oldu.Zahmet olamazsa bir bu sınıfı döndürmeye örnek verirsen,özellikle x ve y yönüne degil öne ve arkaya dogru. Kolay gelsin.

yeni üyelik | şifremi unuttum

aç-kapa 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ı

aç-kapa Yarışma 3. Uluslararası Ekslibris Yarışması: İstanbul 2010

3. Uluslararası Ekslibris Yarışması: İstanbul 2010

İstanbul Ekslibris Dernegi, Feyziye Mektepleri Vakfı ve Işık Üniversitesi, kitaplar için mülkiyet işareti olarak kabul edilen ve üzerinde estetik dege...
Kategori: Yarışma

aç-kapa Konferans Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Generally speaking, the term "New" brought about debates. We try to open up and elucidate the term "New" along with "Interact...
Kategori: Konferans

aç-kapa Konferans 3. Uluslararası Gelecek İçin Öğrenme Alanında Yenilikler Konferansı 2010: e-Öğrenme

3. Uluslararası Gelecek İçin Öğrenme Alanında Yenilikler Konferansı 2010: e-Öğrenme

Konferans ile ilgili ayrıntılı bilgiye aşağıdaki bağlantıdan ulaşabilirsiniz: http://www.futurelearning.org.tr/katilim_cagrisitr.pdf ...
Kategori: Konferans

üyeler Son Kahramanlar...

stats Kimler Burada? web stats

Son 1 dakika içinde MMIstanbul' da 58 (50 kayıtlı, 8 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:

Stacker ...

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)

coldfusion mysql ubuntu
 
sponsor adobe istanbul