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

Related posts

Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



Live preview

7/4/2009 8:07:00 PM

 

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ü.
Şu an Çanakkale 18 Mart Üniversitesi'nde Bilgisayar Mühendisliği bölümü öğrencisi.
Yazılım ile çok ilgili; Visual Studiosu daima açık :) bunun sayesinde Imagine Cup 2008 Türkiye 3.sü
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ş