Profili Göster

Kod ile Animasyon

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

Okunma : 754 Tutanlar: Bu yazıyı 6 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 bey 11/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.

MMIstanbul Adobe UG MMIstanbul Adobe UG

adobe user group

ColdFusion, Flex, AIR, Flash, PDF, Dreamweaver, Fireworks, Photoshop, Illustrator, iNdesign, Premiere, Soundbooth, Lightroom, InCopy, JRun, LiveCycle, Acrobat, AfterEffects, Resmi Adobe Kullanıcı Grubu.

yeni üyelik | şifremi unuttum

aç-kapa Fuar CeBIT 2008 Bilişim Eurasia 7 - 12 Ekim 2008' de

CeBIT 2008 Bilişim Eurasia 7 - 12 Ekim 2008' de

CeBIT Bilişim Eurasia bu yıl 7 – 12 Ekim tarihlerinde düzenleniyor Adını dünyanın en büyük on fuarı arasına yazdırarak, İstanbul’u Avrasy...
Kategori: Fuar

aç-kapa Yarışma Altın SIM Kart Ödülleri

Altın SIM Kart Ödülleri

Altın SIM Kart Ödüllerinin bu yıl birincisi düzenleniyor. Üç ana kategorideki toplam 20 alt kategoride 200 adayın yarışacağı organizasyonun oylaması h...
Kategori: Yarışma

aç-kapa Fuar TBDGENC- GEEKZONE ETKİNLİGİ CeBIT DE

TBDGENC- GEEKZONE ETKİNLİGİ CeBIT DE

Türkiye Bilişim Derneği İstanbul TBDGENÇ Çalışma Grubu, bu yıl 07-12 Ekim tarihlerinde gerçekleşecek olan CeBIT Bilişim Eurasia Fuarın’da yer a...
Kategori: Fuar

aç-kapa Sempozyum Yazılım Kalitesi ve Yazılım Geliştirme Araçları Sempozyumu 2008 (YKGS 2008)

Yazılım Kalitesi ve Yazılım Geliştirme Araçları Sempozyumu 2008 (YKGS 2008)

Yazılım Kalitesi ve Yazılım Geliştirme Araçları Sempozyumu 2008 (YKGS 2008), yazılım mühendisliği alanında; kalite deneyimlerini, çözümlerini, yazılım...
Kategori: Sempozyum

aç-kapa Fuar Contemporary İstanbul Sanat Fuarı

Contemporary İstanbul Sanat Fuarı

Contemporary İstanbul Sanat Fuarı, 16-19 Ekim tarihleri arasında sanatseverlerle buluşacak. Bu yıl üçüncüsü düzenlenen fuar, İstanbul Lütfi Kırdar Ulu...
Kategori: Fuar

üyeler Son Kahramanlar...