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;
Ö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.
![]()
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
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?
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...
Ş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...
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.
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...
Makale
Haber
Ders
Etkinlikler
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ı
Kimler Burada? 
Son 1 dakika içinde MMIstanbul' da 52 (50 kayıtlı, 2 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:
MMIstanbul Blog'undan
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)










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.