XNA’de bildiğiniz gibi hem Game pad hem de Klavye ile
kullanıcı’dan veri alabiliyoruz. Ben işin PC tarafıyla daha çok ilgilendiğim
için bu yazımda biraz Klavye ve Fare(Mouse) girdilerinden bahsetmek istiyorum.
Öncelikle bu kodları Update metoduna yazıp deneyebilirsiniz
ama gerçek bir oyunda Update() metodunda sadece KlavyeKontrol() gibi bir metot
kullanmalıyız. Buraya kendi kaba algoritması dışında daha özel işler için kod
yazmayın, metot yazıp burda çağırın.
Öncelikle Klavyemizin o anki durumunu temsil edebilmemiz
gerekir bunun için:
// Burada klavyemizi temsilen bir değişken atadık,
// ve bu
değişken klavyenin o anki durumunu tutuyor.
KeyboardState klavye = Keyboard.GetState();
Artık hangi tuşa basıldığını
anlamak if deyimi aracılığı ile bizim kontrolümüze kalmış. Tabi bundan sonra bir olay (event) yazıp bunu
tetiğe(trigger)bağlamak buna göre otomatik sonuç sağlamak da mümkün.
//Eğer klavyede
basılan tuş yukarı(up)Tuşu ise:
if(klavye.IsKeyDown(Keys.Up))
{ //true ise yapılacak hareket}
Burda gördüğünüz gibi
IsKeyDown(Keys key) metodunu kullandık. Bize sağlanılan enum tipindeki “keys”
ile istediğimiz tuşu parametre olarak verebiliyoruz.
Temeli bu şekilde olmak üzere
gerisi size kalmış.
İşin fare kısmına gelecek
olursak, bir problem karşımıza çıkıyor; şöyle anlatayım:
Bir oyun düşünün bir tuşu var
ve bu tuşa her basışta paranızı götürüyor karşılığında size bir araba veriyor.
Doğal olarak aynı anda sadece 1 ya da 2 arabaya ihtiyacınız var. Ama Update()
metodu öylesine sık yenileniyor ki, siz farenin tuşuna basıp çekene kadar 40 –
50 kez yenileniyor. Eğer buna bir önlem almazsanız tuşa tek basışta 40 tane
arabanız olmuş oluyor! Korkunç bir sonuç. İşte fareden girdi alırken bu sorunu
göz önünde bulundurmalıyız.
Bunun için önce 2 tane
MauseState değişkeni tanımlamalıyız birisi o anki durumu, diğeri ise önceki
durumu tutmalı. Ve uyarmalıyım ki bu değişkenler kesinlikle update metodunun
dışında olmalı ki kayıt tutabilsin.
// Farenin önceki ve o anki durumunu tutacak olan
değişkenler.
MouseState fareninÖncekiHali, fareninŞimdikiHali;
Sonra öyle bir kontrol deyimi
yazmalıyız ki şimdiki durum bastığımızı gösterirken, önceki durum bırakmış
olduğumuzu göstersin.
fareninŞimdikiHali = Mouse.GetState();
if
(fareninŞimdikiHali.LeftButton = ButtonState.Pressed
&&
fareninÖncekiHali.LeftButton = ButtonState.Released)
{
// Fare
tuşuna basılınca yapılacak işlemler.
}
fareninÖncekiHali = fareninŞimdikiHali;
Bu şekilde fazladan basma sorununu da hallettik. Umarım faydalı olmuştur.