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

11/18/2009 12:23:37 AM

Vitiligo In Children

Nice article. You raise some interesting points. Thank you.

Vitiligo In Children gb

11/19/2009 1:15:13 AM

neutrogena

Interesting article. You make some good points. Thank you again.

neutrogena gb

11/30/2009 9:08:49 PM

oes tsetnoc faq

Well, I just found your blog through search engine. Actually I didn't intend to visit it before, yet after I read your article, I just can say that it's so inspiring. Thanks for making such nice article!

oes tsetnoc faq us

1/9/2010 11:04:29 AM

netflix

Nice article... i love to read your post every time.

netflix us

1/9/2010 8:19:55 PM

siwy jeans designer denim

Thanks for the article. _ find that Blogging is replacing many main stream news sources for Indian people.

siwy jeans designer denim gb

2/4/2010 2:18:14 PM

Stretch Marks

Hi people,
This really great product, do tell me about its features. I am really very curious to know about it.

Stretch Marks us

2/19/2010 1:46:13 PM

obagi nu derm

Great article I will link to it from my obagi nu derm website. Thank you.

obagi nu derm gb

2/19/2010 2:13:54 PM

Caterers Sydney

Good job dude really!!! I was really very pleased to find your post.I just wanted to give you thank for this great read!! I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post!!!

Caterers Sydney in

2/20/2010 11:19:21 AM

Forex Trading India

The beauty of these blogging engines and CMS platforms is the lack of limitations and ease of manipulation that allows developers to implement rich content and 'skin' the site in such a way that with very little effort one would never notice what it is making the site tick all without limiting content and effectiveness.

Forex Trading India in

2/26/2010 1:44:22 PM

colic calm

Well, I just found your blog through search engine. Actually I didn't intend to visit it before, yet after I read your article, I just can say that it's so inspiring. Thanks for making such nice article!

colic calm us

3/3/2010 12:41:00 PM

ucvhost

Thanks for the great post,i love to read articles that are informative and beneficial in nature.

ucvhost us

3/30/2010 12:28:59 PM

ucvhost

Your blog is my favorite, congratulates. Often I'll look here, a lot of information and nice site.

ucvhost us

4/5/2010 2:36:01 PM

suzanne wilson jewelry

Happ Easter people, have a good one.

suzanne wilson jewelry gb

4/5/2010 4:14:10 PM

missy stone skirt

Happ Easter people, have a good one.

missy stone skirt gb

4/6/2010 11:53:42 PM

sequin appliques

Great post, it still amazes me as to the ammount of info that is available on the net.

sequin appliques gb

5/11/2010 4:32:24 PM

cheap hosting

i love to read articles that are informative and beneficial in nature.

cheap hosting

5/16/2010 6:17:08 PM

Kain

I need to extend security in BE just a little. I need to make a user registration form and disable comments for non-registered users. Has anyone done this? What difficulties might arise?

Kain gb

5/27/2010 11:55:58 PM

discount designer handbags

I was very pleased to find this site.I wanted to thank you for this great read!! I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post.

discount designer handbags US

Add comment


(Will show your Gravatar icon)  

  Country flag

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



Live preview

9/4/2010 12:18:32 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ü.
Ç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þ