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

XNA'de Multiplayer Network Temelleri – 4

yazan: 9/9/2008 7:21:00 AM

Şimdiye kadar ilk yazımda host oluşturmayı öğrendik; ikinci yazımda senkron, üçüncü yazımda da asenkron olarak hostu aramayı ve hosta bağlanmayı öğrendik, şimdi hosta bağlı olduğumuza göre sıra oyunu başlatmaya, oyunu oynamaya ve oyunu sonlandırmaya geldi. Biraz önbilgi vererek bu konuya başlayalım.

Şu ana kadar yaptığımız her şeyle oyun durumunu yada orijinal adıyla “NetworkSessionState”i hazır duruma geçirdik. Multiplayer oyunlarda hostun ve oyuncuların; tüm oyuncuların giriş yapmasını ve hostun oyuna başla komutunu vermesini, bekledikleri yere “lobby” denir. Diğer bir değişle oyunumuz bu durumda NetworkSessionState.Lobby durumundadır ve bu anda oyuncular oyuna başlayabilmek için durumlarını ready yapmalıdırlar bu da oyuncuya(LocalNetworkGamer sınıfından türeyen oyuncuyu temsil eden nesneye) ait IsReady özelliğini True yapmakla olur.

Bu yazımızın konusuna gelirsek, oyunu başlattığımızda; ağın durumunun Lobby’den Playing (oynanıyor) durumuna geçmesi gerekir. Bu da oturum nesnemizin StartGame metodoyla sağlanacaktır.

Bu halledildikten sonra artık çoklu ortamda, oyundasınız. Bu durumda bilgisayarlar arası haberleşme yaptırmanız gerekmektedir. Bunu da bilgisayarlar arasında paket transferi ile yapabilriz. Bir paketi PacketWriter türünden bir nesnenin Write() metodu ile hazırlarız. Sonra bu paketi oyuncuyu temsil eden nesnenin SendData() metodu ile göndeririz. Gelen paketi ise oyuncuya ait RecieveData() metoduyla ağdan çeker alırız. Ve paketin içeriğini PacketReader türünden okuyucu nesnenin Read…..() metodu ile çözeriz (okuruz).  Buradaki …. Kısmında türe göre metot seçilmelidir, örneğin fare koordinatları için ReadVector2() gibi…

Tüm bu paket alış-verişi işinde önemli olan nokta; Verilerin gönderiliş ve alınış türlerinin aynı olması ve paket gönderme sırasının, paket alma sırasıyla uyumlu olmasıdır.

Önemli olduğunu düşündüğüm için SendData() metodunun 2. parametresi hakkında bilgi vermek istiyorum metodu birazdan kodda göreceksiniz;

2. parametre paketin gönderiliş yöntemini belirler, SenderDataOptions enumuna dahil olan seçeneklerden,

None: paketin karşı tarafa ulaşacağını garantilemez,

InOrder: paketleri belirli bir sırayla yollar ama ulaşıp ulaşamayacağını garantilemez.

Reliable: paketler karşı tarafa ulaşırlar (garantili), ama sıraları belirli değildir.

ReliableInOrder: paketler sıralı olarak karşı tarafa ulaşır.(garantili)

Durum bu; buradan seçeceğiniz özellik paketlerinizin türüne göre değişmelidir. Çok da önemli olmayan paketler için en güvenli yolun kullanılması boşuna işlemcinin doldurulmasıdır.

Şimdi koda geçelim, eğer açıklamalara göz attıysanız pek anlamakta sıkıntı çekmeyeceksiniz ama herhangi bir durumda iletişime geçmekten çekinmeyin.

1. Adım tüm oyuncuları hazır hale getirmek ve oyunu başlatmak:

AgIsleri.cs’de oyuncuları hazır hale getiriyoruz.

public void OyuncuyuHazırla()

        {

            /* foraeach'in amacı aynı makinede oynayan oyuncuların

            hepsini hazır etmektir ama PC'de daima 1 local oyuncu

            olacağı için Pc oyununda foreach'e gerek yoktur.

             */

            foreach (LocalNetworkGamer oyuncu in oturum.LocalGamers)

                oyuncu.IsReady = true;

        }

Game1.cs den de oyuncunun arayüzden hazırım demesini sağlıyoruz ben “R” (ready) tuşunu seçtim.

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

                agYardimcisi.OyuncuyuHazirla();

AgIsleri.cs ye geçelim. Eğer tüm oyuncular hazırsa host oyunu bu metod ile başlatmalı:

//eğer herkes hazır durumdaysa oyunu başlatacak

        public void HerkesHazırsaBaslat()

        {

            if (oturum.IsHost)

            {

                if (osturum.IsEveryoneReady)

                    oturum.StartGame();

            }

        }

Şimdi bize bir de oyunun(ağın) durumunu gösteren bir değişken lazım ki Game1.cs ye geçince bize durumu anlatabilsin.

        public NetworkSessionState OturumDurumu

        {

            get

            {

                if (oturum == null)// oturum yoksa

                    return NetworkSessionState.Ended;

                else

                    return oturum.SessionState;

            }

        }

Şimdi Game1.cs ye geçip, herkes hazırsa hosta oyunu başlattıracak kodu yazalım:

//loby durumundayken herkes hazırsa oyun başlar.

            if (agYardimcisi.OturumDurumu == NetworkSessionState.Lobby)

            {

                agYardimcisi.HerkesHazırsaBaslat();

            }

Burada elimde olmayan nedenlerden ötürü (birinin sahur yemeğini pişirmesi gerekiyor) yazımı kesiyorum. Veri paketlerinin işlenmesini aynen kaldığım yerden devam ederek anlatacağım, yukardaki öntanımlar bir sonraki yazı için aynen geçerlidir.

 

Currently rated 4.0 by 4 people

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

Etiketler: , , ,

XNA

Related posts

Comments

2/6/2010 3:43:18 PM

unemployed personal loans

for you it might be just a comment but for me it’s an appreciation keep blogging further

unemployed personal loans us

2/11/2010 11:08:43 AM

P90X

While surfing Yahoo I clicked on your link...very informative! I enjoy staying up-to-date about this kind of info. I'll definitely bookmark your site for additional review.

P90X us

2/20/2010 8:38:09 PM

online scheduler

Awesome! Some really helpful information in there. Bookmarked. Excellent source.

online scheduler us

2/25/2010 1:15:48 AM

driving directions

I will certainly bookmark it or even subscribe to your rss feeds just to be updated on your new posts

driving directions

3/3/2010 12:39:01 PM

ucvhost

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

ucvhost us

3/9/2010 10:14:01 AM

Netflix

Thanks for the information, it was really useful. I was looking for it and I'll be waiting for your next post.

Netflix us

3/27/2010 5:58:18 AM

Pleated Blinds

Well said and your post is very well versed, but I can't agree with you completely

Pleated Blinds us

3/30/2010 12:28:17 PM

ucvhost

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

ucvhost us

5/22/2010 5:16:17 PM

cheap hosting

Your blog is my favorite, congratulates

cheap hosting

5/22/2010 5:16:20 PM

cheap hosting

Your blog is my favorite, congratulates

cheap hosting

5/27/2010 11:55:46 PM

designer bags sale

Your blog seems interesting.Regards,Kevin.

designer bags sale US

5/28/2010 6:38:17 PM

genital herpes remedies

Great information. Bookmarked.

genital herpes remedies us

6/2/2010 12:14:36 AM

discount fendi handbags

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

discount fendi handbags US

7/9/2010 11:22:38 AM

bass fishing rods

Yeah, why not? Anyway it is as it is.

bass fishing rods gb

Add comment


(Will show your Gravatar icon)  

  Country flag

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



Live preview

9/4/2010 11:39:06 AM

 

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þ