Fareyi Takip Eden Sembol, Hareket Kodlamak, ve ActionScript 3 ‘te Açı Kullanımı

Posted on Salı, Mart 11th, 2008 at 16:38

(” Tırnak) işaretlerini yenilemeniz gerekmektedir

Oyun yazımında hedefi otomatik bulan bir tank, ya da fareye göre açısını belirleyen bir tabanca yapmanız gerekebilir. Ben TCDD için yazdığım tren smülasyonunda makinist musluğu gibi kolların; fare işaretçisi ile çevirilmesinde ihtiyaç duymuştum..

Sizin için birbirinden farklı iki animasyon kodu kullandım. Biri ENTER_FRAME diğeri Timer sınıfı.

Bu uygulamada ayrıca kullanıcının fare işaretçisinin konumunu farklı amaçlarla kullanmayı öğreneceksiniz. 

// Öncelikle kibritin farenin x ve y konumuna göre dönmesini sağlayacağız..

// Timer değişkeni tanımlıyoruz. Saniyenin “binde birinde” hızıyla çalıştırıyoruz..
var kibritTakipTimer:Timer = new Timer(1 /* Bahsi geçen binde bir bu değerdir */);
/* Bu timer değişkenine bir dinleyici iliştiriyoruz
ve çağırması gereken fonksiyonu yazıyoruz (kibritTakipFnk) */


kibritTakipTimer.addEventListener(TimerEvent.TIMER, kibritTakipFnk);
// kibritTakipTimer için bir dinleyici ekle (Zamanlayıvı olayı ekle, kibritTakipFnk fonksiyonunu çalıştırsın);

// Zamanlayıcı olayı olan bu fonksiyonun görevlerini yazıyoruz.

function kibritTakipFnk(event:TimerEvent):void {
// fonksiyon kibritTakipFnk (olay: Zamanlayıcı Olayı):boş (değer döndürme)

 /* Bu kısmı ezberlemenize gerek yok. Matematiksel bir formüldür. Burada kibritin rotasyonunu fareyle iliştireceğiz
 y2 - y1 ve x2 - x1 in arc tanjantını 180 ile çarpıp Pi sayısına bölerek,
 fare işaretçimizin kibrite yaptığı açıyı buluyoruz ve “.rotation” komutu ile dönme olayını
 bu açı değerine göre yaptırıyoruz. */

 
 kibrit_mc.rotation =  Math.atan2((mouseY - kibrit_mc.y),(mouseX - kibrit_mc.x)) * 180 / Math.PI;
/* kibrit_mc ‘nin rotasyonunu mouseY- kibrit_mc.y ve mouseX-kibrit_mc.x ‘in arc tanjantı * 180 / pi yani 3.14… şeklinde ayarla */

// uyari_text ve diğerlerine istediğimiz değerleri bu şekilde yazdırabiliriz. Math.floor(); küsüratları tam sayıya çevirir.
 
 uyari_txt.text = (”Kibritin fareye göre açısı: ” + Math.floor(kibrit_mc.rotation));
 uyari2_txt.text = (”Aralarındaki Y eksenindeki mesafe: ” + Math.floor(kibrit_mc.y - mouseY));
 uyari3_txt.text = (”Aralarındaki X eksenindeki mesafesi: ” + Math.floor(kibrit_mc.x - mouseX));
}

// Zamanlayıcıyı direkt başlatıyoruz..
kibritTakipTimer.start();
/* Timer ‘dan başka bir örnekle devam etmeyi tercih ettik. Buradaki amacımız ise kibritin fare işaretçisine doğru yol alması
ENTER_FRAME; animasyonu “saniyede fps kadar” film şeridinde ilerletir.
Yani “document properties” belirlediğiniz saniyede gösterilmesi gereken ekran sayısı; fps */

// Bir dinleyici ekliyoruz. enterFrmFnk fonksiyonunu çağırıyoruz

addEventListener(Event.ENTER_FRAME,enterFrmFnk)
// Bahsettiğimiz fonksiyonu burada yazıyoruz.
function enterFrmFnk(event:Event) {
 // kibritin y ekseni kibritin y ekseni - fare işaretçisinin y ekseninden / 15
 // şeklinde yazdığım formül gittikçe daralan bir sayıyı vereceğinden
 // kibrit fareye yaklaştıkça yavaşlıyor. / 15 sadece değeri küçültmek içindi..

  kibrit_mc.y -= (kibrit_mc.y - mouseY) / 15;
// ve aynı şekilde x eksenleri için
 kibrit_mc.x -= (kibrit_mc.x - mouseX) / 15;

}

// www.mehmetoglu.org | Kaynak gösterilmeden yayınlanması ayıp ve yasaktır..
// Çalışan flash animasyon:
http://mehmetoglu.org/as3_dersler/fare_takip_ve_aci.swf
// Çalışan proje dosyası(fla): http://mehmetoglu.org/as3_dersler/fare_takip_ve_aci.fla

İstersen yorum yazabilirsin, ya da kendi sitenden "geridönüş" (trackback) ekleyebilirsin.

4 Yorum yazılmış

 1 
mehmet soylu:

Abi benim çok işime yaradı. Çok teşekkür ederim

Mayıs 8th, 2008 at 23:26
 2 

Estağfirullah. Güle güle kullan ve kendini geliştirmeyi unutma :)

Mayıs 9th, 2008 at 10:37
 3 

Merhaba ;

Çok aciliyetli bir sorum var .Hemen sormak istedim …

Flash CS3′e import ettiğim videonun üzerine mause ile gelince play/pause/stop ve kapat tuşları gelecek tabi tıklayınca gereği neyse onu yapacak.Bunu nasil yapacagim ?

play/pause/stop/kapat görüntülerini nereden bulacagim ? ve nasil aktif edeceğim ?

Teşekkür Ederim

Haziran 28th, 2008 at 00:51
 4 

Merhaba. Sizin için basit bir uygulama hazırlamaya çalıştım. Anlatımı uzun süreceğinden ayrıntılarını yazmadım. Eğer anlamadığınız yerler varsa sorabilirsiniz. Play - Stop gibi fonksiyonlara ihtiyacınız olup olmadığını anlayamadım. Eğer varsa talep ediniz.

Sevgiler..

// player_mc ekranda iken hemen konum bilgilerini birer değişkene çevirelim

var playerX:Number = player_mc.x;
var playerY:Number = player_mc.y;

//player_mc ilk etapta gözükmeyecek
player_mc.alpha = 0;

//sahneye bir ENTER_FRAME dinleyici ekleyelim. Yani framelerde ilerleyen animasyon
stage.addEventListener(Event.ENTER_FRAME , enterFrameFnk);

// o öylece kalsın. fonksinu yani dinleyiciyi en sonda yazabiliriz

//player_mc nin içerisindeki butonlar gözükmüyor ama aktif
//durumunda ve bu bir sorun. player_mc ile ilgili herşeyi saklayalım.
// bir çeşit removeChild();

player_mc.visible = false;

// buradan itibaren herşey, her framede tekrarlanır. Çünkü enter frame fonksiyonu içine girdik
// eğer şu esnada mouseX playerX ten büyükse ve mouseY de playerY den büyükse
function enterFrameFnk(event:Event):void {

if (mouseX > playerX && mouseY > playerY) {

player_mc.visible = true;

// yeni bir dinleyici ekle. içerideki buton için görev eklemeliyiz.
// Bu görevleri yazılımın en sonunda fonksiyon içine yazacağız.

player_mc.oynat_btn.addEventListener(MouseEvent.CLICK, oynatFonk);

//player_mc nin alpha değerini yüzde 5 + 5 + 5… şeklinde artır
player_mc.alpha += 0.05;

// eğer bu artırma sonucunda toplam alpha değeri 1 i bulursa şu işi durdur.
//yani sürekli 100% olarak yenile;

if (player_mc.alpha >= 1) {
player_mc.alpha = 1;
}
// bu olaylar pekte böye gelişmiyorsa yani mouseX küçükse playerX ten falan..
} else {

player_mc.alpha -= 0.05;

if (player_mc.alpha < = 0) {

player_mc.alpha = 0;
player_mc.visible = false;

}
}
}

// Oynatma fonksiyonunu herşeyin dışında burada tanıtabiliriz
function oynatFonk(event:MouseEvent): void {
trace("oynatıldı");
}

dosya: http://mehmetoglu.org/as3_dersler/playerDeneme1.fla

kolay gelsin

Haziran 28th, 2008 at 21:26

Yazmayan ölsün..

Adın
e-Postan (Yayımlarsam ne olim)
Siten
Gençliğini neyle değerlendirdin?
Yorumun: