Yazılarımı Daha Kolay Takip Etmek İçin Tıklayın!

XNA'de Multiplayer Network Temelleri - 1

yazan: 9/6/2008 5:12:00 AM

Merhabalar ne zamandır XNA hakkında yazmadığımı farketim ve bu günün Cuma olmasından faydalanıp “Yapılacaklar” listeme baktım. Sırada “XNA’de basit bir network altyapısı nasıl kurulur” konusu vardı.

Bildiğiniz gibi bize kolaylıklar unmakta üstüne olmayan XNA GS, network konusunda da başımızı hiç ağrıtmayacak nasıl bu kadar eminim? C++’la yapmaya da çalışmıştım oradan biliyorum siz de farkedeceksiniz ki XNA sizden sadece oyunu yapmanızı istiyor altyapı işlerini kendi hallediyor.  Yazımı bu sefer 4 kısma ayırmak istiyorum. Bu yazımın alt konusu Host’u hazırlamak. İşte başlıyorum;

Öncelikle Tarzım olduğu üzere bazı ön tanımlamalar ve açıklamalar yapacağım

LIVE Guide: Bilgisayarınızdan Games for Windows ağına bağlanmanızı sağlayan, kendi oyunlarınızda profil yönetimi sağlayan bir bileşendir.

Components.Add(new GamerServicesComponent(this));

Komutunu oyunumuzun yapıcı metodunda belirtmemizle aktifleşir. 

Metotlar:

NetworkSession.Create(): 4 parametre alan, oturumumuzu yaratan metottur.

1.      parametresi (NetworkSessionType) ne tür bir oturum açacağımızı ,

2.      parametresi (int)aynı makinedeki oyuncu sayısını ki PC için 1’dir,

3.      parametresi (int)oturumda en fazla kaç oyuncu olacağını,

4.      parametresi (int)davet üzerine gelecek oyuncular için kaç tane rezerve slot olduğunu (opsiyoneldir)

5.      parametresi NetworkSessionProperties türünden oturuma parametre olarak geçirilecek değerleri (opsiyoneldir)

gösterir.  

NetworkSessionType: (enum) Ne tür bir oturum açacağımızı gösterir demiştik, bunlar:

1.      Local : Tek bir makinanın üzerinden gerçekleştiği XBox oyunlarında kullanılır (split screen – aynı ekranda)

2.      SystemLink : Aynı alt ağda bulunan makinalar arasında bağlantı kurmak içindir (yerel ağ)

3.      PlayerMatch : XBox Live servislerini kullanılarak internet üzerinden bağlantı kurmak içindir.

4.      Ranked : Xbox Live sertifikası almış oyunlar için geçerlidir.

Bir Host yapabilmek ve oyunu başlatabilmek için: sırayla 4 ana adımı izlememiz gerekiyor.

1-     Öncelikle bir  oyuncu oyuna girmeli (sign in)

2-     Bu oyuncu bir oturum açmalı, kendi oturumuna bağlananlar için kurallar belirlemeli (host)

3-     Diğer oyuncular bu oyuna bağlanmalı

4-     Oyun başlatılmalı.

 

Bu önbilgiden sonra şimdi konu anlatımına geçiyorum; Öncelikle ağ işlerini yapmak için yeni bir yardımcı sınıf yazalım ki ana sınıf karmakarışık olmasın. Ben bu yardımcıya “AgIsleri.cs” adını verdim. İsimuzaylarını (namespace) ana sınıftan aynen alabilirsiniz, fakat bize şu anlık bu 3 tanesi  yetecek;

using System;

using Microsoft.Xna.Framework.GamerServices;

using Microsoft.Xna.Framework.Net;

Yukarıda verdiğim 4 maddeye göre şimdi sırayla Host’umuzu oluşturalım.

1. oyuncu oyuna giriyor;

 AgIsleri.cs’de

public void SignInGamer()

        {

            if (!Guide.IsVisible)

            {

                // burada 1. parametre gösterilecek giriş ekranı sayısını

    // gösteriyor PC için hep 1

                // 2. parametre true ise sadece online profiller gözükür

                Guide.ShowSignIn(1, false);

            }

        }

Böylece giriş yöneticisini ekrana getireiliyoruz.

Şimdi Game1.cs’de bu sign in işinde kullanıcıdan tepki alacak olan nesneyi(buton vb…) yapmamız gerekiyor. Ama burda kısaca herhangi bir tuşa atayacağım bunu, kısa olsun özü dağılmasın.

Sınıf değişkenleri arasına son durumu aktarabilmek veya haberdar olabilmek için AgIsleri cinsinden bir nesne tanımlıyoruz.

AgIsleri agYardimcisi;

Ve Initialize metodunda değer atıyoruz.

// session ile ilgili olarak yapmayı düşündüğümüz işleri

// yapacak olan olan sınıf nesnesi

            agYardimcisi = new AgIsleri();

Update metodunda ;

            // Guide menusunu ekrana getiriyor.

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

                agYardimcisi.SignInGamer();

şeklinde kod parçasını yazarak, G (giriş) tuşuna basınca giriş yöneticisini açmayı sağladık. 

2)Oturum açıp kurallar belirliyoruz

AgIsleri.cs’de

Şimdi değişkenlerimizi tanımlayalım

      private NetworkSession oturum = null; // oturum

            private int maxOyuncu = 2; // oyun 2 kişlik olacak

            private int maxLocalOyuncu = 1; // Bir makinada bir kişi olacak

Şimdi de yeni bir oturum yaratmak için kod yazalım;

public void OturumYarat()

            {

               if (oturum == null)

               {

            oturum = NetworkSession.Create(NetworkSessionType.SystemLink,

                                                 maxOyuncu,

                                                 maxLocalOyuncu);

               }

            }

 NetworkSessionType ile ilgili bilgi yukarıdadır. Artık bir oturum yaratabildiğimize göre ağın durumunu yenilemesi gelişmeleri haber vermesi gerekiyor. Bunu da;

      public void Update()

            {

                if (oturum != null)

                    oturum.Update();

            }

Metodu aracılığı ile yapacağız. Şimdi bu metodu Game1.cs’den çağıralım,

Game1.cs ‘de

update metodunun en üst kısmında agYardimcisi nesnemizin yeni yazdığımız update metodunu çağırıyoruz

//session'un update olmasını sağlıyor

            agYardimcisi.Update(); 

işimiz bitti sonucu görmek için ufak bir iki ekleme yapabiliriz,

content dosyamıza solution explorer menüsünden bir spritefont ekleyip adına Arial diyelim (değiştirmek size kalmış) ekrana yazı yazdıran spritebatch.drawstring hakkında bilgiyi bu yazımda bulabilirsiniz.

Şimdi bu eklediğimiz fontu oyunda tanıtalım;

Game1.cs’de

SpriteFont ArialYazi;

Şeklinde bir değişken tanımlayalım, ve LoadContent metodunda kaynağını ekleyelim.

ArialYazi = Content.Load<SpriteFont>("Arial");

Bu SpriteFontumuzun ekrana basacağı yazıya kaynaklık etmesi için AgIsleri.cs sınıfımızda bir string tanımlayalım;

AgIsleri.cs

public String durum = "Kulanıcı hareketi bekleniyor.";

ve bu stringimizi ayarlayacak olayı yazalım;

Eğer oturum nesnemizin sonuna (.) işareti koyup intellisense aracılığı ile bakacak olursak 6 tane event (olay) göreceğiz. Bu olayların hepsine göz atmak için bu yazıma bakınız. Şimdilik bize 1 olay yeter.

oturum.GamerJoined +=

              new EventHandler<GamerJoinedEventArgs>(session_GamerJoined);

Bu olay ile oyuncu katılımı durumunda bir metodu tetikleyeceğiz. Bu metot da;

        void session_GamerJoined(object sender, GamerJoinedEventArgs e)

        {

            if (e.Gamer.IsHost)

                durum = "Host oturum açtı";

            else

                durum = "Oyuncu: " + e.Gamer.Tag + ", oyuna katıldı";

        }

Bu şekilde event handler’ımızı da hallettik. İsterseniz siz de oturum.GamerLeft olayını ve ele alınışını kodunuza ekleyin (o kadarı da ödev olsun )  hazır durumda olan stringimizi ekrana bastıralım; Game1.cs dosyasına geçelim Draw metodunda

Game1.cs

            spriteBatch.Begin();

spriteBatch.DrawString(Arial, "Oyun durumu: " +

agYardimcisi.durum,

                                    new Vector2(20, 20),

Color.Yellow);

            spriteBatch.End();

Hala  farkettiğiniz gibi bir eksiğimiz var update metodunda yeni oturumu açma tuşunu belirleyelim ben “Y” (yeni oturum) tuşunu seçtim.

// yeni session oluşturuyor

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

                agYardimcisi.OturumYarat();

Böylece kullanıcı olarak giriş yapabildiğimiz (sign up) ve yeni oturum başlatabildiğimiz bir Hostumuz oldu, Diğer 2 yazımda host edilmiş oyunu bulup oyuncu olarak katılmayı anlatacağım.

Currently rated 5.0 by 1 people

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

Etiketler: , , ,

XNA

Related posts

Comments

2/12/2009 3:26:42 PM

İbrahim Ersoy

Muhteşem XNA de Network yazıların için seni tebrik etmek istiyorum.İnanıyorum ki ileride çok iyi bir XNA Developer olacaksın.

Çalışmalarında Başarılar Dilerim.

İbrahim Ersoy
Msakademik.Net Bilgisayar Grafikleri Editörü
Developermania.NET Oyun Programlama Editörü

İbrahim Ersoy tr

3/12/2009 7:05:24 AM

ercyon

Çok teşekkür ederim İbrahim Bey, ben elimden geldiği kadar bildiklerimi aktarmaya çalışıyorum. Sizin gibi insanların böyle cesaretlendirici yorumlarla destek olması inanın daha çok güç katıyor bana.

ercyon

Add comment


(Will show your Gravatar icon)  

  Country flag

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



Live preview

7/4/2009 8:07:40 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ş