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

ActionScript 3.0: Analog Saat

Muttalip TULGAR Tarih: 10/06/2009 Yorum: 6 adet

Okunma : 1634 Tutanlar: Bu yazıyı 2 kişi tuttu.

Bu dersimizde Timer sınıfını kullanarak analog bir saat yapacağız. Bunun için gerekli olanlar;

  • Üzerinde akrep, yelkovan, ve saniye kollarının olmadığı boş bir saat resmi
  • Saati gösteren instance name'yi "saatKolu" olan bir movieclip
  • Dakikayı gösteren instance name'yi "dakikaKolu" olan bir movieclip
  • Saniyeyi gösteren instance name'yi "saniyeKolu" olan bir movieclip
  • Öncelikle Timer sınıfından "zamanlayici" adlı bir nesne oluşturuyoruz. Sonra bu zamanlayiciyi tetiklemek için bunu "TimerEvent.TIMER" olayına kaydediyoruz. Zamanlayici nesnesinin çalışması için ayrıca start() metodunu kullanmamız gerekiyor yoksa zamanlayici harekete geçmez.

    
    var zamanlayici:Timer = new Timer(200);
    zamanlayici.addEventListener(TimerEvent.TIMER,saatiCalistir);
    zamanlayici.start();
    saatiCalistir();
    
    function saatiCalistir(event:TimerEvent = null):void {
        var zaman = new Date();
        var saniye:uint = zaman.getSeconds();
        var dakika:uint = zaman.getMinutes();
        var saat:uint = zaman.getHours();
        saatKolu.rotation = Math.round((360 * (saat / 12)) + (30 * (dakika / 60)));
        dakikaKolu.rotation = Math.round(360 * (dakika / 60));
        saniyeKolu.rotation = Math.round(360 * (saniye / 60));
    }

    "zaman" adlı bir zaman nesnesi oluşturarak, getSeconds(),getMinutes() ve getHours() metotları ile zaman nesnesinin saniye, dakika ve saat bilgilerini elde ediyoruz. Bu bilgileri elde ettikten sonra analog saatimizin saniye,dakika ve saat kollarını zamana uygun olarak hareket etmesini sağlamamız gerekiyor. Bunun için saatKolu, dakikaKolu ve saniyeKolu adlı moviecliplerimizin "rotation" özelliklerini "saat","dakika" ve "saniye" değişkenlerine göre ayarlamalıyız.

    Öncelikle bu üç movieclipte 360 derece tur atmak zorundadır. Burada dikkat etmemiz gereken konu; her birinin tur atma hızı farklı olmalıdır.

    Diyelim ki; o an için zaman nesnesi saat=5 dakika=20; saniye=5 değerlerini aldı.

    saatKolu.rotation = Math.round((360 * (saat / 12)) + (30 * (dakika / 60)));

    formülümüze göre (360(5/12)+(30(20)/60))=160

    saatKolu.rotation=160 derece dönecektir.

    dakikaKolu.rotation = Math.round(360 * (dakika / 60));

    formülümüze göre (360*(20/60))=120

    dakikaKolu.rotation=120 derece dönecektir.

    saniyeKolu.rotation = Math.round(360 * (saniye / 60));

    formülümüze göre (360*(5/60))=30

    dakikaKolu.rotation=30 derece dönecektir. MMİstanbul

    Bu örnekte dikkat edilmesi gereken en önemli bölüm şurasıdır:

    
    saatiCalistir();
    
    function saatiCalistir(event:TimerEvent = null):void

    İlk olarak TimerEvent'i tetiklendiğinde saatiCalistir fonksiyonunun null değerini alması sağlanarak başlangıçta zaman bilgisinin alınması engelleniyor. Sonra ise tekrar saatiCalistir() fonksiyonu çağrılarak o anda zaman bilgisi alınarak analog saat çalışmaya başlıyor. Bu işlem, analog saat ilk anda çalışırken saniye kolunun meydana getirdiği saniye farkından oluşan olumsuz hareketi engellemektedir.

    Uygulama Dosyası:analogsaat.rar

    İşte size duvarınıza asabileceğiniz bir saat. Güle güle kullanın:)

    Yazan:Muttalip TULGAR

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

    Profili Göster
    Salih Dincer 25/06/2009

    Kodlama da hata mı var bilmiyorum ama paketlenmiş dosya içinde SWF'yi çalıştırdığımda arada teklediğini gördüm. Yani bir gecikme söz konusu ve bazen de fazla beklemeden saatini akrebi atıyor.

    Profili Göster
    Muttalip TULGAR 25/06/2009

    Merhaba Salih, Öncelikle seni tekrar görmek güzel. Uygulamayı mmistanbuldan indirdim ve 10 yakın testini yaptım ama herhangi bir sorunla karşılaşmadım. Her şey normal. İşletim Sisteminden kaynaklanan sorunlar olabilir mi acaba?

    Profili Göster
    Salih Dincer 26/06/2009

    Merhaba,

    Bir de Flash IDE içinde çalıştırdım. Kodlara bakmamıştım hesaplamalar çok basit görünüyor. Sorun her dakikada bir kaç kere tekrarlayacak şekilde yine var. Trace ile hesaplamalara baktım arada saniye kolunda küsürat oluyor. Ama küsüratları yakalayabilmek için zamanlayıcıyı 200 ms. 100 ms.'ye kurmalısınız:

    66 108
    66 108
    66 108
    66 108
    66 114
    66 114
    66 114
    66 120
    66 120
    66 120
    66 125.99999999999999
    66 125.99999999999999
    66 125.99999999999999

    Dikkat ederseniz küsüratlar haricinde bir de her 100 ms.'de bir bazen 4 bazen satır var. Bazen de 2! Bu 200 ms.'de 3 veya 4 olacak şekilde görülüyor. Sanıyorum sorun küsüratlardan kaynaklanıyor. Yuvarlama işlemini rotation kendisi yapıyor olmalı. Sorun bu olmalı ve belki yuvarlama işlemini kendimiz yaparsak düzelebilir.

    Aslında zamanıda Pascal'da yazdığım analog saat kodları bu kadar basit değildi. Bir sorun oluyordu ve aşmak için bir kaç satır daha kod yazmak gerekiyordu. Bence halledilmeyecek bir şey değil. Hep vakit meselesi...:)

    Başarılar...

    Profili Göster
    Ahmed Genc 29/06/2009

    Şimdi Sorun varmı Yok mu? :D

    Kodlar gerçekten çok sade. Elinize sağlık.

    Salih kardeş. bu verdiğin hesaplamalar doğruysa nasıl kullanacağız_?

    As3 e yeni adım atıyorum. ayrıca mmistanbuldaki ile mesajım...

    Selametle...

    Profili Göster
    Muttalip TULGAR 29/06/2009

    Aslında uygulamada gözle görülür bir sorun yok. Ama saat,dakika ve saniye kollarının rotation özelliğinin aldığı değerleri Math.round() metodu ile yuvarlarsak sanırım hiç bir problem kalmayacaktır.

    Profili Göster
    Salih Dincer 1/07/2009

    Yuvarlama fonksiyonunu denemedim ama başka bir yerden baktım hesaplamayı şu şekilde yapmışlar:

    ...
        saatKolu.rotation = saat * 30 + dakika / 2;
        dakikaKolu.rotation = dakika * 6;
        saniyeKolu.rotation = saniye * 6;
    }

    Sonuçta ikisi de çalışıyor. Hatta eski kodlama ile yenisini yanyana getirirseniz arada teklemeyi daha rahat hissedeceksiniz. Buradaki espiri saniyedeki bölme işleminden uzaklaşmak. Yoksa bazı sayılar tam bölünemeyeceği için açısal fark oluşuyor.

    Başarılar...

    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

    aç-kapa Toplantı IV. ANKARA TASARIM GÜNLERİ 2010

    IV. ANKARA TASARIM GÜNLERİ 2010

    IV. Ankara Tasarım Günleri, seminerleri, sunumları, etkinlik tarihleri boyunca gezilebilecek tasarım sergileri, video art gösterimleri, çeşitli worksh...
    Kategori: Toplantı

    üyeler Son Kahramanlar...

    stats Kimler Burada? web stats

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

    ...

    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