30 Ocak 2010 Cumartesi

Asenkron işler

Birden fazla sesin aynı anda çalınması için Hasanın bulduğu dll ler işimizi baya kolaylaştırıyor .Şimdi de kontrollerin asenkron olarak kontrol edilmesi gerekiyor .Ne demek şimdi bu asenkron control diye sorarsanız .C sharp ta bir tuşa basılıp basılmadığını kendi eventlarından kontrol edebilirsiniz ama aynı anda birden fazla tuşa bastığınızda sorun çıkacaktır .Buna ek olarak bazı tuşların uygulamanız için bir önceliği olabilir.

Bir oyunu düşünelim ,yukarı ok tuşuna bastığımızda grafiğimiz ileri doğru ilerlesin sağ oka basıldığında sağa doğru ilerlesin space tuşuda ateş etsin .

Eğer bu tuşların hepsine birden basarsak normalde sadece biri çalışacaktır .


[DllImport("User32.dll")]
public static extern int GetAsyncKeyState(long vKey);

Yukarıda bulunan bloğu clasımıza eklediğimizde bu fonksiyonu kullanabileceğiz .
Aşağıda bulunan kodlar 90 tank projesinin basit olarak yön tuşlarını nasıl kontrol edildiğini gösteriyor .Bu kodla birlikte sağ ve sol yönlerin ileri ve geri tuşlarına bir öncelik sağlanması gerçekleştirilmiştir. Aynı anda say ve ileri basıldığında tankımız sağa gidecektir.Space ise ateş etmesini sağlayan bir tuş ve diğer tuşlardan bağımsız olarak her basıldığında işlemini gerçekleştirir.


private void asenkron_key()
{
bool ileri = true;

if (Form1.GetAsyncKeyState((int)System.Windows.Forms.Keys.Left) != 0)
{
tankım.key_handle("37");
ileri = false;
}
if (Form1.GetAsyncKeyState((int)System.Windows.Forms.Keys.Right) != 0)
{
tankım.key_handle("39");
ileri = false;

}
else if (Form1.GetAsyncKeyState((int)System.Windows.Forms.Keys.Up) != 0 && ileri)
{
tankım.key_handle("38");

}
else if (Form1.GetAsyncKeyState((int)System.Windows.Forms.Keys.Down) != 0 && ileri)
{
tankım.key_handle("40");

}
if (Form1.GetAsyncKeyState((int)System.Windows.Forms.Keys.Space) != 0)
{
kursun.key_handle("32", tankım);

}
}
Bu kullanılan fonksiyonun ilginç tarafı başka bir uygulamada uğraştığınızda bile tuşları konrol edebilmesi .Yani bir keylogger programı yazmak isteyen biri bu fonksiyonu kullanarak uygulamalarda kullanılan tuşları kaydedebilir .


5 yorum:

  1. tusları kullanıcının kendi belirleyeceği sekilde yapsak ? direk 37 , 40 diye atmayalım da kullanıcı istediginde değiştirebilsin ; hatta aynı pcden 2 kullanıcı oynamak istersen söyle bisey yapabiliriz

    tankım.keyhandle(user1.left)
    tankım2.keyhandle(user2.right)

    ?

    YanıtlaSil
  2. Projenin yukarıdaki gelişmelere bağlı olarak güncellenmiş hali grupta varmı?

    YanıtlaSil
  3. Aynı klayveden 2 kullanıcı için uygun bir fonksiyon olabilir ama zaten farklı kullanıcılar için farklı tuş lar kullanılacağı için user diye ayırmaya gerek olur mu?
    hasan projeyi sormuş
    hareketleri gride göre yapıyordum ,şimdi pixel seviyesine dönüştürüyorum kontroller yine grid ama hareketler pixele dönüşünce bazı taşmalar oluyor ,bunları düzenlemem gerek ama yinede ekliyim gruba ..

    YanıtlaSil
  4. burada niye facebook gibi mesaj gelmiyor cevap yazılınca . 2 kullanıcı aynı pcden kesin olmalı onu bize kaç tus lazımsa bi sekilde tutarız örnegin tek oyuncu için 6 tane gerekse biz 12 tus hazır sekilde set edecegiz gerektiginde kullanıcı onu deiştirmeli aslında benim aklım joy padleri kullanmak var onlar da güzel olur xna de örneklerini gördüm de c# da bilemiyorum var mı

    YanıtlaSil
  5. joyistik olayı kullanışlı olabilir bunu bir araştırmak lazım ,kontrolleri bi şekilde hallederiz ,network yapabilirsek buda kastırır ama iyi bir deneyim olabilir ,mesaj olayını bende bilmiyorum böyle kontrol etmek zor oluyor bencede..

    YanıtlaSil