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

XNA'de Multiplayer Network Temelleri – 3

yazan: 9/6/2008 10:00:00 AM

Bu yazımın konusu da Host edilmiş oyunu Asenkron olarak bulmak ve dahil olmak. Bu işin senkron olarak yapılışı için bu yazıma bakabilirsiniz.

Asenkron aramanın senkron aramaya göre avantajı senkron aramada olduğu gibi arama sonuçlanana kadar hostun duraksamıyor olması. Bu nedenle tercih edilen yöntemdir. Önce ön tanım yaparak yazıma başlıyorum.

IAsyncResult : Asenkron olarak iş görebilecek metotları barındıran sınıflar bu Interface’den türer. Asenkron bir işi başlatan metotların geri dönüş değeridir (NetworkSession.BeginFind() gibi). Ve Asenkron bir işi bitiren metotlarda 3. parametrenin tipidir (NetworkSession.EndFind() gibi) Ve ayrıca işleri bitince AsyncCallback delegate’lerine parametre olarak aktarılırlar. 

Yapacağımız iş özetle şu; BeginFind() metodunu çağırcağız geri dönüş değerini AsyncOturumBul değişkeninde saklarken, işini bitirdiğinde 4. parametresinde verilen delagate’in gösterdiği metoda gidecek ve giderken biz belirtmesek de IAsyncResult’un özelliği olarak sonucu da beraberinde parametre olarak götürecek. Ve burada EndFind() ile aramayı bitirirken  geri dönüş değeri olark bulduğu oturumların listesini oradaki değişkenimize aktaracak. Gerisi senkron aramanın aynısı. Şimdi karışık geliyor olsa da kodu inceledikçe anlayacaksınız.

AgIsleri.cs dosyamıza değişkenler arasına şunu ekleyelim:

        /*asenkron arama için IAsyncResult türünde bir nesne tanımlıyoruz;

          dikkat edilmesi gereken nokta, aramaya başlayan metodun

          geri dönüş tipi bu Interface türündendir.*/

        IAsyncResult AsyncSonuc = null; 

Artık asenkron aramada kullanacağımız metodu yazabiliriz,

        public void AsenkronOturumAra()

        {

            durum = "Asenkron arama başlatıldı.";

            if (AsyncSonuc == null)

            {

                AsyncSonuc = NetworkSession.BeginFind(

                    NetworkSessionType.SystemLink, maxLocalOyuncu, null,

                    new AsyncCallback(BulunanOturumlariAra), null);

            }

        }

BeginFind() metodunun ilk 3 parametresi senkron aramadaki Find metoduyla aynı, 4. parametre arama işi sonuçlandığında gideceği metodu tutan bir delegate , 5. parametre ise aramanın durumunu tutabiliyor.

İşimiz burada bitmiyor tabiki, şimdi arama bitip sonuçlar hazır olduğunda delegate aracılığı ile gidilecek metodu yazalım;

        // görüldüğü gibi buradaki parametre yukarıda kullandığımız       

  // AsyncSonuc ile aynı türden zaten buraya da ta kendisi

  // gelecek parametre olarak

  public void BulunanOturumlariAra(IAsyncResult result)

        {

            // bulunan tüm oturumları tutacak

            AvailableNetworkSessionCollection uygunOturumlar;

            // katılacağımız oturumu tutacak

            AvailableNetworkSession uygunOturum = null;

            if (AsyncSonuc.IsCompleted)

            {

                // EndFind’ın geri dönüşü koleksyon şeklinde

                uygunOturumlar = NetworkSession.EndFind(result);

                // Oyucuncu için slota sahip olan bir oturum arıyoruz

                foreach (AvailableNetworkSession aramadakiOturum in uygunOturumlar)

                {

                    int OturumSlotlariToplami =

                                      aramadakiOturum.OpenPublicGamerSlots +

                                      aramadakiOturum.OpenPrivateGamerSlots;

                    if (OturumSlotlariToplami > aramadakiOturum.CurrentGamerCount)

                    uygunOturum = aramadakiOturum;

                }

                // Uygun bir oturum bulunduysa, bağlan

                if (uygunOturum != null)

                {

                    durum = " " +

                    uygunOturum.HostGamertag + " adlı hostta

                                        uygun oturum bulundu.";

                    oturum = NetworkSession.Join(uygunOturum);

                }

                else

                    durum = "Hiç uygun oturum bulunamadı.";

            }

 

                // Arama sonucunu sıfırlayıp değişkeni temizliyoruz.

                AsyncSonuc = null;

        }

       

Böylece Asenkron aramayı da tamamladık geriye herzaman olduğu gibi Etkileşim tuşu kalıyor. Ben “A” (asenkron ara) seçiyorum.

// Asenkron olarak oturum ara

            if (Keyboard.GetState().IsKeyDown(Keys.A))

                agYardimcisi.AsenkronOturumAra();

Böylece asenkron arama konusunu da halletmiş olduk. Network temelleri konusu da artık bitmek üzere çok az kaldı. Bir dahaki yazıda görüşmek üzere

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þ