Yazýlarýmý Daha Kolay Takip Etmek Ýçin Týklayýn!

XNA’de İKİ BOYUTLU NESNE ÇİZİMİ – 3

yazan: 8/2/2008 4:40:00 AM

Önceki yazımda sabit duran nesneleri çizdirmeyi göstermiştim. Bu yazımda da aynı sınıfları kullanarak hareketli bir nesne çizdirmeyi göreceğiz.

 

Öncelikle nesnemiz hareket edeceği için bir hareket hızı olması lazım; bunu CizilecekNesne sınıfımıza değişken olarak ekliyoruz.

            public Vector2 velocity;

daha sonra; Game1.cs sınıfımıza dönelim;

nesne.velocity = new Vector2(0.0f, 0.5f);

nesne.position = new Vector2(350, 250);

bu şekilde sadece yukarı yönlü bir hız vektörü belirleyelim, ve nesnemiz için bir pozisyon değeri atayalım.

Daha sonra klavyeden girdi alarak nesnemize hareket verelim.

if (keyboardState.IsKeyDown(Keys.Up))

            obje.position -= obje.velocity;

      if (keyboardState.IsKeyDown(Keys.Down))

            obje.position += obje.velocity;

şeklinde daha önce de anlattığım gibi, kullanıcı girdisi alarak nesneyi gideceği yöne doğru hareket ettirelim. Birinci deyimde -= işareti yukarı yönlü bir harekete neden olcaktır çünkü unutmayalım ekranımızda y ekseni aşağı gittikçe artar. Sonra;

 

obje.position.Y = MathHelper.Clamp(obje.position.Y,

 0, ekranAlanı.Height-obje.sprite.Height);

 

Diyelim, bu metoda dikkat Clamp metodu birinci parametresinde verilen değeri alır; ikinci ve üçüncü parametreler arasında tutar. Eğer değer son iki parametrenin arasında ise değişmez, eğer birini geçiyorsa geçtiği max veya minimum değere eşitlenir.

Burada nesnemizin Y bileşeni ancak “0” ve  “Ekran alanı – Nesnenin boyu” arasında bir değer alabilir. Eğer birini geçerse geçtiği değere eşitlenir. Böylece nesnemiz sürekli ekranda kalacaktır.

 

Olay kısaca bu zaten diğer kısmını önceki yazıda halletmiştik şimdi araya bunları ekleyerek nesnemizi harekete geçirdik.

Önceki yazıya buradan; çevre birimlerinden girdi almaya buradan ulaşabilirsiniz.  

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: , , ,

XNA

XNA’de KULLANICI ETKİLEŞİMİ

yazan: 7/28/2008 8:20:00 PM

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.

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: , ,

XNA

 

Yazar Hakkýnda

Erçin YONTAR
Erçin Yontar
1986 yýlýnda Çorlu'da doðdu.Ýlk öðrenimini Ankara'da, ortaöðrenimini Eskiþehir'de gördü.
Çanakkale 18 Mart Üniversitesi Bilgisayar Mühendisliði Bölümü mezunu.
Yazýlým ile çok ilgili; Visual Studiosu daima açýk :) bunun sayesinde Imagine Cup 2008 Türkiye 3.sü ve bir çok proje geliþtiriyor.
Yazýlým dýþýnda : Frp hastasý, rock/metal dinliyor, organizasyon iþlerine merak sardý. Bunlarýn yanýnda o bir; 
MCTS (Microsoft Certified Technology Specialist)



MSP (Microsoft Student Partner)

Bana posta atýn Send mail

Favorilerine Ekle


Add to Technorati Favorites

 

Twitter - Ne Yapýyorum?

    Pages

      Recent comments

      Feragatname

      Burada yazan yazýlar ve içerdikleri fikirler yazarýna aittir. Baþkasýný ilgilendirmez. Yazýlarý kaynaðýný kopyaladýðýnýz yazýnýn içinde týklanabilir link halinde belirtmek þartý ile olduðu gibi kullanabilirsiniz. Bu kurallarý deðiþtirme hakkým saklýdýr. Yarýn bir gün benim yazým benim blogumdan baþka bir yerde olamaz dersem Kopyaladýðýnýz yazýyý da silmek zorundasýnýz. Bu iþe girþen kiþi bu koþullarý ve doðan yasal yükümlülükleri kabul etmiþ sayýlýr. Eyvallah diyen devam etsin.

      © Tüm haklarý saklýdýr.

      Giriþ