Soru - Cevap Bölümü
/ Kategori: Programlama
21/03/2010 - 11:41:09 cevap (20) Okunma : 3441 Bu yazıyı 4 kişi tuttu.
AS3 - Mc yi 360 Derece Döndürme
Öncelikle merhaba. Arkadaşlar şu kodlar sayesinde mc yi 360 derece döndürebiliyorum;
import flash.geom.*;
var distance:Number = 50;
var alfa:Number = 180
var bX:Number = daire.x;
var bY:Number = daire.y;
function Dondurme (evt:Event):void {
alfa += 2;
var angle:Number = 2 * Math.PI * (alfa / 360 );
var polarpoint:Point=Point.polar(distance,angle);
daire.x = bX + polarpoint.x;
daire.y = bY + polarpoint.y;
}
addEventListener (Event.ENTER_FRAME, Dondurme);
Benim yapmak istediğim bu dönüşü yarım olarak yapması. Yani yarım daire çizecek ve diğer noktaya geçecek. Bunun için ne yapmam gerekiyor acaba bir türlü denklemini kuramadım.
Şimdiden teşekkürler...
Cevaplar
( Faydalı Cevapları Göster )
Şeker gibi bir çözüm. Kutlarım.
cok tesekkurler ustadım.
tum muslumanların bayramı mubarek olsun. saglık ve huzurlu bayramlar dilerim.
Programcılıkta şöyle bir söz vardır:
"Bir işlemi daha az satır (kaynak, zaman) da yapıyorsan bu iyi bir koddur."
Yay çizen benzer bir sürü fonksiyon görmüştüm. Bunu iki satırla yapanına hiç şahit olmamıştım.
Bu yüzden ben de sizi kutlar ve bayramınızı tebrik ederim...
Çok teşekkür ederim. Bu arada herkesin bayramı da kutlu olsun. Hocam bir soru daha sormak istiyorum. Şimdi bu sahnenin tamamı için yapılmış bir fonksiyon. Benim istediğim şey ise daire.x i yay şeklinde kısa bir mesafe olarak döndürmek.
Bir similatör yapıyorum. Bu yüzden de herşey kafadan hesaplanıyor. Ben belirli bir y kodinatında bu işlemi yaptıracağım. Bu yüzden istedim. Birde hocam tamamen sahnede yapması da gerekmiyor. Kısa birkaç px lik açı olsa yeter. Yalnız denklemi bir türlü tutturamadım :/
merhaba
<< tesekkurler arkadaslar :)
asagıda biraz daha anlasılır bi ornek var
var cemberin_sahnedeki_x_konumu:Number = 100;
var cemberin_sahnedeki_y_konumu:Number = 100;
var cebberin_genisligi:Number = 100;
var cemberin_yuksekligi:Number = 100;
var cemberin_cevresindeki_birim_sayisi = (Math.PI*2)/360; // cemberin cevresi 360 birimden olusuyor!
var cember_cevresinde_gidilecek_birim:Number = 270;
mc.x = Math.cos( cember_cevresinde_gidilecek_birim *cemberin_cevresindeki_birim_sayisi ) * cebberin_genisligi + cemberin_sahnedeki_x_konumu
mc.y = Math.sin( cember_cevresinde_gidilecek_birim *cemberin_cevresindeki_birim_sayisi ) * cemberin_yuksekligi + cemberin_sahnedeki_y_konumu
kolaygelsin..<<
Çok oluyorum ama hocam yine olmadı;
function Dondurme (evt:Event):void {
var cemberin_sahnedeki_x_konumu:Number = daire.x;
var cemberin_sahnedeki_y_konumu:Number = daire.y;
var cebberin_genisligi:Number = 31;
var cemberin_yuksekligi:Number = 31;
var cemberin_cevresindeki_birim_sayisi = (Math.PI*2)/180; // cemberin cevresi 360 birimden olusuyor!
var cember_cevresinde_gidilecek_birim:Number = 150;
daire.x = Math.cos( cember_cevresinde_gidilecek_birim * cemberin_cevresindeki_birim_sayisi ) * cebberin_genisligi + cemberin_sahnedeki_x_konumu
daire.y = Math.sin( cember_cevresinde_gidilecek_birim * cemberin_cevresindeki_birim_sayisi ) * cemberin_yuksekligi + cemberin_sahnedeki_y_konumu
}
addEventListener (Event.ENTER_FRAME, Dondurme);
Mc kafasına göre sürekli ileri gidiyor :S Tam olarak şunu yapmak istiyorum;

Burada ilk konuma kendisi geliyor ( bir takım hesaplamalar ile ). Benim amacım onu ikinci konuma getirmek. Kodun neresinde sorun var acaba?
merhaba
çok olmuyorsun :)
istedigin hareket 180 - 360 birimleri arasında gerceklesiyo
var cemberin_sahnedeki_x_konumu:Number = daire.x;
var cemberin_sahnedeki_y_konumu:Number = daire.y;
var cebberin_genisligi:Number = 31;
var cemberin_yuksekligi:Number = 31;
var cemberin_cevresindeki_birim_sayisi = (Math.PI*2)/360;// cemberin cevresi 360 birimden olusuyor!
// cemberim birim baslangıc noktası default olarak saat 3 konumundadır herhangi bi degisiklik yapmıyorum.
var baslangic_birim:Number = 180;
var bitis_birim:Number = 360;
var cember_cevresinde_gidilecek_birim:Number = baslangic_birim;
function Dondurme(evt:Event):void {
cember_cevresinde_gidilecek_birim += 10;
if( cember_cevresinde_gidilecek_birim > bitis_birim ){
cember_cevresinde_gidilecek_birim = baslangic_birim
}
daire.x = Math.cos( cember_cevresinde_gidilecek_birim * cemberin_cevresindeki_birim_sayisi ) * cebberin_genisligi + cemberin_sahnedeki_x_konumu;
daire.y = Math.sin( cember_cevresinde_gidilecek_birim * cemberin_cevresindeki_birim_sayisi ) * cemberin_yuksekligi + cemberin_sahnedeki_y_konumu;
}
addEventListener(Event.ENTER_FRAME, Dondurme);
bukodları denediginde çalısıcaktır sonrasında ilk yazdıgım ornege bakar san ordaki ornegide anlicaksın.
kolaygelsin..<<
Çok teşekkür ederim hocam. En son verdiğiniz örnek oldu. Benim sorunum anlamakta değildi de mantığını oturtamadım bir türlü. Yoksa verilerine ne anlama geldiğini biliyorum :) Neyse iyi günler, iyi çalışmalar...
Hocam biraz salakça gelebilir ama bunu nasıl durduruyoruz? İf ile şart koydum, fonksiyonunu sildim, dışarıdan kontrol ettirdim hatta höst falan dedim ama durmuyor kerata :)
function host(){ removeEventListener( Event.ENTER_FRAME , Dondurme ) }
host();
Hocam event nasıl durdurulur bunu biliyorum zaten. Benim demek istediğim bir dönüşü gerçekleştirince durmasını sağlamak. Yalnız bir türlü yapamadım. İlk konumla son konumu karşılaştırıyorum ama malesef :S
merhaba
if( cember_cevresinde_gidilecek_birim == bitis_birim ){
trace("cember_cevresinde_gidilecek_birim 360 'a esit")
removeEventListener(Event.ENTER_FRAME,Dondurme)
}
bunu denemedim deme sakın :S
Belki ne demek istediğiniz anlayamamış olabilirim. Ama çorbada benim de tuzum olsun istedim. Fonksiyona iki tane değer ekledim:
function açıÇiz(Nesne:MovieClip,
Sx:Number, Sy:Number,
Çap:Number,
Açı:Number ):void {
Nesne.x = Math.cos(Açı*Math.PI/180)*Çap+Sx;
Nesne.y = Math.sin(Açı*Math.PI/180)*Çap+Sy;
}
Sonra sahneyi 600x800@60fps değerlerine ayarladım. Herhangi bir yere de daire isminde (instancename) MC koydum. Hani küçük yarış arabalarının pisti olur ya, sahnede öyle dolaştı..:)
İstediğiniz bu muydu?
var Sayaç:Number = 0;
var Çiz:Sprite = new Sprite();
addChild(Çiz);
Çiz.graphics.lineStyle(2,0xFF0000);
function Döndürme (olay:Event):void {
Sayaç++;
if(Sayaç<180) açıÇiz(daire, 300, 360, 300,Sayaç%180+180)
if(Sayaç==1) Çiz.graphics.moveTo(daire.x,daire.y);
Çiz.graphics.lineTo(daire.x,daire.y);
if(Sayaç<360 && Sayaç>180) daire.y++;
if(Sayaç<540 && Sayaç>360) açıÇiz(daire, 300, 540, 300, Sayaç%180)
if(Sayaç<740 && Sayaç>540) daire.y--;
if(Sayaç==740) removeEventListener (Event.ENTER_FRAME, Döndürme);
}
addEventListener (Event.ENTER_FRAME, Döndürme);
Mehmet hocam sizinkini denedim olmuyor :D Adam sürekli baştan başlıyor. Salih hocam sizinkinide şimdi deniyorum...
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 54 (50 kayıtlı, 4 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)









merhaba umarım isine yarar.
kolaygelsin..<<