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

Cern Deneyi

yazan: 9/10/2008 11:01:00 PM
Büyük deney, belki de insanlık tarihinin en büyük deneyi dün itibari ile başladı. Saat yönündeki ilk protonlar tünellere bırakıldı, Bir süre sonra protonlar yeterince hıza ulaştıklarında (ki ışık hızı veya yakın bir hız düşünülüyor) ikinici grup tünellere aksi yönde salınacak, Protonların boyutu ve elektriksel kuvvetlerinden dolayı çarpışma olmama ihtimali az da olsa var. Her şeye rağmen o ya da bu şekilde kısa süre sonra deneyin sonucunu öğreneceğiz. Deneyin dünyanın sonunu getirebileceği yönünde açıklamalar var, olsun varsın getirsin; 3. dünya savaşındansa bilim uğruna yapılacak bir deneyle dünyanın yok olmasını tercih ederim.

Currently rated 5.0 by 4 people

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

Etiketler:

Genel

NetworkSession Sınıfı ve İçindeki Olaylar (Eventler)

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

Yazılarımı okurken bir arkadaşımın kafasına iki soru takılmış, birincisi 5 yazılık dizimde hiç bahsetmediğim diğer evenler nedir ne işe yarar? İkincisi ise delagate nedir; fonksiyon falan temsil ediyormuş ama nasıl yapacağız bunu? Sorulardan birincisine hazır elimi XNA’e bulamışken hemen cevaplandırayım, özel bir cevap yazmamamın nedeni bu sorunun diğer okuyucularımın da aklına takılabileceği düşüncesi. Hemen başlıyorum.

Öncelikle şunu belirteyim bu yazıyı, 5 yazılık proje boyunca hazırlamış olduğumuz proje üzerinden anlatacağım, bunun nedeni orada zaten kullanılmış olaylarımızın olması. Hemen onların altına eklemek suretiyle kodla da görebilirsiniz.

//oyun içinde gelişmesi muhtemel olaylar:

// Önceden bildiğimiz bu event oyuncu katılınca tetiklenir

session.GamerJoined +=

new EventHandler<GamerJoinedEventArgs>(session_GamerJoined);

//Oyuncu oyundan ayrıldığında bu olayı tetiklemesi gerekir.

session.GamerLeft +=

new EventHandler<GamerLeftEventArgs>(session_GamerLeft);

//Oyun başlarken, gerekli ayarları yapmamız için tetiklememiz gereklidir

session.GameStarted +=

new EventHandler<GameStartedEventArgs>(session_GameStarted);

//Oyun bittiğinde tetiklersek, verileri temizleme işi kolay olacaktır

session.GameEnded +=

new EventHandler<GameEndedEventArgs>(session_GameEnded);

//Bir oturum kapanırken tetiklenir,

session.SessionEnded +=

new EventHandler<NetworkSessionEndedEventArgs>(session_SessionEnded);

//Eğer Host çıktıysa, ve Oyunumuz host değiştirmeye izin veriyorsa

//host değiştiğinde tetikleriz ve oyun üzerindeki kritik değişiklikleri yaparız.

session.HostChanged +=

new EventHandler<HostChangedEventArgs>(session_HostChanged);

burada parantez içinde verilen değerler Delegate’dir ve bir fonksiyonu temsil ederler. Bunu değişkenin bellek adresini gösterip içine ulaşmak için referans oluşturması gibi düşünelim şimdilik, ayrıntıyı Delagate’ler ile ilgili yazımda bulabilirsiniz. Burdan sonrada olayın tetiklenmesinden sonra işleyişe konulacak metotları yazmamız gerekiyor bunlara da event handler diyoruz. (İleride Event Handlerlar ile ilgili bir yazı da yazmayı düşünüyorum.)

şimdi event handler (olay işleyici) metotlarımızın isimlerine dikkat; az önce parametreye yazmıştık. Aslında mantık olarak bu metotları önce vermek daha anlaşılır olurdu galiba, kusura bakmayın.

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ı";

}

Yukarıdak metodu yazmıştık daha önce;  şimdi diğer event handler metodlarını da yazalım, kullanmasak bile en azından ihtiyacınız olduğunda fikriniz olur.

void session_GamerLeft(object sender, GamerLeftEventArgs e)

{

    durum = "Oyuncu " + e.Gamer.Tag + " oturumdan ayrıldı!";

}

void session_GameStarted(object sender, GameStartedEventArgs e)

{

    durum = "Oyun Başladı";

}

void session_HostChanged(object sender, HostChangedEventArgs e)

{

    durum = "Önemli: " + e.OldHost.Tag + " Hostluğu bıraktı yeni host:" +

               e.NewHost.Tag;

}

Bu event ve Handler’ı için çok önemli bir nokta var atlamayalım derim, bu eventi gerçekleştirebilmek için;

    oturum.AllowHostMigration = true;

olması gerekmektedir.

void session_SessionEnded(object sender, NetworkSessionEndedEventArgs e)

{

    durum = "Oturum sonlandı.";

}

void session_GameEnded(object sender, GameEndedEventArgs e)

{

    durum = "Oyun sonlandı.";

}

Özetle budur; bu metotların içini oyununuza göre doldurmalısınız. Eğer bir gün gaza gelirsem tüm yazılarımı içeren bir örnek oyun yapabilirim göstermek için; fakat İspanya muhabbetlerinden dolayı şu an müsait değilim.

Currently rated 5.0 by 2 people

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

Etiketler: , , , ,

XNA

XNA'de Multiplayer Network Temelleri – 5

yazan: 9/9/2008 8:36:00 AM

4 yazı planlamıştım ama 5. yazımla karşınızdayım. Bir önceki yazımda bu yazıda gerekli olacak tüm açıklamayı yapmıştım bunları tekrarlamak istemiyorum. Bu nedenle XNA’de Multiplayer Network Temelleri – 4 adlı yazımı mutlaka okuyun. Hemen konuya kaldığım yerden dalıyorum

AgIsleri.cs’de; ağda paketlerimizi SendData() ile gönderip RecieveData() ile almadan önce paketlerimizi (ağ mesajlarımızı) yazmamızı ve okumamızı sağlayacak nesnelerimizi üretiyoruz.

        PacketWriter paketYazici = new PacketWriter();

        PacketReader paketOkuyucu = new PacketReader();

Şimdi mesajlarımızı yollamaya geldi sıra;

        public void MesajAt(string mesaj)

        {

            // aynı makinadaki tüm oyunclar – PC için gereksiz.

            foreach (LocalNetworkGamer oyuncu in oturum.LocalGamers)

            {

                // göndermeden evvel mesajı pakete yazıyoruz

                paketYazici.Write(mesaj);

    // paketi güvenlik tedbiri olmadan yolluyoruz “none”                   

    // diyerek. İlk parametre gördüğünüz gibi; yazılan

    // paketi barındıran, PacketWriter tipinde nesne

                oyuncu.SendData(paketYazici, SendDataOptions.None);

                durum = "Mesaj yollandı: " + mesaj;

            }

        }

Bu arada ilk çnceki yazımda bahsetmedim sanırım, SendData() metodunun bir overload’u sayesinde paketi istediğimiz herhangi bir oyuncuya yolayabiliyoruz, bunu yapmak için 3. parametreye NetworkPlayer tipinde oyuncu belirtmemiz gerekiyor. 3. parametre yoksa mesaj tüm oyunculara gider.

Sıra mesajları alacak fonksiyonun yapısına geldi. Ama önce RecieveData() metodunun gelen paketten, veriyi (byte[] veya PacketReader tipinde) ve gönderen kullanıcıyı (NetworkGamer tipinde) bize sunduğunu söylemek istiyorum.

        public void MesajAl ()

        {

            NetworkGamer uzakOyuncu; // Paketi yollayan oyuncu

            foreach (LocalNetworkGamer yerelOyuncu in oturum.LocalGamers)

            {

                // Ağda alınmamış veri olduğu sürece, almaya devam ediyoruz

                while (yerelOyuncu.IsDataAvailable)

                {

                    yerelOyuncu.ReceiveData(paketOkuyucu, out uzakOyuncu);

                    // farklı makinadaki oyunculardan mesaj alıyoruz

                    if (!uzakOyuncu.IsLocal)

                        durum = "Alınan mesaj: " +

                        paketOkuyucu.ReadString();

// burada gönderilen veriye göre ReadString() //metodunu seçtik verinin türü başka olsaydı uygun //metodu seçecektik.

                }

            }

        }

Mantık basit, veri olduğu sürece ağı taradık ve bilgileri aldık, alırken mesaj içeriğini PacketReader nesnesine oyuncu bilgisini de NetworkGamer den ürettiğimiz nesneye aktardık. Out anahtar sözcüğüne dikkat.

Son olarak da mesajın içeriğini çözdürdük.

Şimdi sıra Game1.cs den bu metotları çağırmaya geldi. Sadece oyun “Playing” durumunda iken mesajlarımızı iletmek istiyoruz bu nedenle update metodunda;

            // sadece playing durumunda mesajlaşmaya izin ver

            if (agYardimcisi.OyunDurumu == NetworkSessionState.Playing)

            {

                // basılmış tuşun bilgisini string olarak karşıya yolla

                foreach (Keys tus in Keyboard.GetState().GetPressedKeys())

                    agYardimcisi.MesajAt(tus.ToString());

                // aynı şekilde karşıdan al

                agYardimcisi.MesajAl();

            }

Böylece paket alışverişini sağlamış olduk. Böylece bu uzun XNA’de multiplayer network temelleri adlı serimizi bitirmiş olduk. Yazılanları geliştirin, bazı yerleri kurcalayın, bazı eklemeler yapın, tuşlar ekleyin menu oluşturun hem böylece kodun nerede ne tepki vereceğini daha iyi anlamış olursunuz.

Currently rated 5.0 by 2 people

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

Etiketler: , , , , ,

XNA

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

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

XNA'de Multiplayer Network Temelleri – 2

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

Bu yazımın konusu host edilmiş oyunu senkron şekilde bulmak olacak;Hostu nasıl oluşturacağımız hakkındaki yazımı buradan bulabilirsiniz.

Senkron bulmada yapmamız gereken uygun oturumları (session) bulmak, bulduğumuz oturumda oyuncu için boş slot aramak eğer uygunsa o slota yerleşmek. Yalnız bu kodu yazıp bitirdikten sonra 2 bilgisayara ihtiyacınız olacak, birinden host kurup diğerinden buraya bağlanacaksınız ben sanal makine kullanırım diyenlere eyvallah diyorum. Neyse ben başlayayım fazla uzatmadan;

Aşağıdaki metot bize oturum bulmayı ve içinden slot edinmeyi gösteriyor; bu metodu AgIsleri.cs dosyamıza ekleyelim.

  public void OturumBul()

        {

            // Tüm uygun sessionların listesi

            AvailableNetworkSessionCollection uygunOturumlar;

            // Katılacağımız session

            AvailableNetworkSession uygunOturum = null;

            // Bu komut ile tüm uygun oturumları listemize almiş oluyoruz

            uygunOturumlar =NetworkSession.Find(NetworkSessionType.SystemLink,

                                                 maxLocalOyuncu, null);

                        /* Yukrıda 3. parametredeki null Arama filtrelemek için bir opsiyondur

                               Buraya istenirse SearchProperties tipinde değer girilebilir */

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

            foreach (AvailableNetworkSession aramadakiOturum in uygunOturumlar)

            {

                // mantık basit bir oturuma ait açık ve rezerve

                //tüm slotların toplamı alınır

                int OturumSlotlariToplami = aramadakiOturum.OpenPublicGamerSlots +

                                             aramadakiOturum.OpenPrivateGamerSlots;

                // ve bu toplam dolu slotlardan fazlaysa hemen o oturum

                //uygun kabul edilir.

                if (OturumSlotlariToplami > aramadakiOturum.CurrentGamerCount)

                    uygunOturum = aramadakiOturum;

            }

            // eğer uygun oturum bulabildiysek katılıyoruz

            if (uygunOturum != null)

            {

                durum = " " + uygunOturum.HostGamertag + " adlı hostta uygun oturum

                                                            bulundu.";

                oturum = NetworkSession.Join(uygunOturum);

            }

            else

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

        }

Bu şekilde host arama ve dahil olma işini hallettikten sonra bu aramayı çalıştıracak kullanıcı etkileşimine geldi sıra, Game1.cs dosyasını açıyoruz, Update metoduna alttaki kodu ekliyoruz. Ben etkileşim tuşu olarak “S” (Senkron ara) tuşunu seçtim, siz aslında uğraşıp görsel tuşlar da ekleyebilirsiniz herşey dikdörtgenden ibaret, dikdörtgen çizmeyi (hatta içini doldurmayı) bu yazımda fare etkileşimini de bu yazımda anlatmıştım. Size de fare tıklamasının dikdörtgenin sınırları içinde olup olmadığını kontrol etmek içindeyse gerekli işi yaptırmak kalıyor.  Ya da dikdörtgene onMouseclick tarzı bir event handler da yazabilirsiniz gördüğünüz gibi bir sonuca ulaşmanın birden çok yolu var. Takılırsanız iletişime geçin. Neyse bu moladan sonra işe devam; Game1.cs sınıfımızın Update metoduna aşağıdaki kodu ekleyelim;

            // Oturum ara

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

                agYardimcisi.OturumBul();

İşte bu kadar basit XNA’de herşey çok basit zaten. Yazıyı kısa bulanlar Allah’larından bulsunlar. Bu saatte yazıyorum. Bir sonraki yazımda da Asenkron şekilde slot aramayı anlatacağım.

Currently rated 5.0 by 1 people

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

Etiketler: , , ,

XNA

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

C# 'a Giriş

yazan: 9/3/2008 3:22:00 AM

Mikail ORAL arkadaşımın yeni açtığı ve yazılım işini öğrenmek isteyenlere hizmet etmek amacı taşıyan www.programlamaogren.com sitesine, Mikail'in ricası üzerine, katkıda bulunmak amacıyla sıfırdan C# hakkında yazılar yazmaya karar verdim. Tabii ki bu yazılar hep burada blogumda da olacaklar. Şimdi yavaştan tanımaya başlayalım c#'ı.

Her şeyden önce C# bir nesne odaklı (object oriented - niye buna nesneye dayalı derler anlamam) programlama dilidir. C programlama ailesinin yapı (grammar) özelliklerini taşır. Her ne kadar Java'ya benzese de - ki zaten C ailesine mensup bir dilin bambaşka olması beklenemez - ciddi farklılıkları vardır. C#'ta her şey nesnedir, ilkel (primitive - int, float,char...) tipler bile "Object" sınıfından türetilmişlerdir. Gözlemlemek isteyenler için bunun en kolay yolu tanımlanan bir değişkenin sonuna "." işareti koyarak tiplerin sahip olduğu metotları gözlemlemektir (Visual Studio'da).

C# rakiplerine göre genç bir dildir, bu onu programcının dil üzerindeki ihtiyaçları bakımından güçlü kılarken, Visual Studiodan ayrı değerlendirmek güç olduğu için (ben de biliyorum Mono'yu) Programcıların alışık olduğu araçların bir kısmını henüz barındıramaması nedeniyle güç kaybeder. Fakat son zamanlarda gerek Microsoft gerekse diğer firmalar tarafından geliştirilen yazılımlarla bu eksiklik hızla giderilmiştir.

Her ne kadar .Net'in ana dili olsa da C# diğer işletim sistemlerine de açıktır. (ECMA standartlarındadır)

C#'ın sağladığı temel özellikler arasında;

    Platform bağımsızlığı - sanal makinaya sahip her işletim sistemi C# kodlarını kendi işletim sistemine göre çalıştıracaktır.

    Garbage Collector - artık kullanımayan nesneleri bellekten otomatik olarak siler. C++'da bu işlem kullanıcı tarafından yapılmaktaydı.

    Tip Güvenliği - bu özellik sayesinde içeriği atanmamış nesneler okunmaz, dizi sınırları aşılmaz, kontrolsüz tip dönüşümleri yapılmaz.

    Unsafe kodlar - Java'da olmayan pointer kullanımı C#'da unsafe kodlar yazmak suretiyle geri dönmüştür.

sayılabilir.

C#'ın C ailesinden gelen kullanım kolaylığı Visual Studio denen uzaydan gelme IDE ile birleşince gerçekten bir başlayanın bir daha kolay kolay başka dile geçemeyeceği bir dil ortaya çıkıyor.

C#'a hemen bir göz atmak için burayı ziyaret edin. Kurulumu tamamladıktan sonra, yeni bir konsol projesi açarak, "file - new - project" yolunu izleyin. Buradan ConsoleApplication seçeneğini seçip aynı pencerenin alt kısmında proje adını belirtelim, orneğin "IlkProgram"; sonra bilgisayarınıza şu emri verin:

Console.WriteLine("C#'a başladım !!!");

bu Console sınıfının WriteLine metodunu "C#'a başladım !!!" parametresi ile çağıracaktır. Böyle gözüküyor olması lazım:

namespace IlkProgram

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("C#'a başladım !!!");

        }

    }

}

 

İşte bu kadar ilk program bitti. Hemen F5'e basıp derleyelim, bazılarınızın, "hemen kapanıyor bu bir sorun olmalı" dediğini duyar gibi oldum, merak etmeyin bir sorun yok. Consol gitmeye istekli bir arayüzdür işi bitince gitmek ister. Bunu durdurmanın birkaç yolu vardır. Bir tanesi için 

 Console.ReadLine();

yazalım, nereye eklenmesi gerektiğini biliyorsunuz. Artık sizin bir tuşa basmanızı isteyecektir ve siz basana kadar orada duracaktır.

Yazarken farketmişsinizdir siz yazdıkça bir menu açılıp yazabileceğiniz şeyleri listeliyor, bu IntelliSense'dir, çok faydalıdır. Şimdi "System" yazıp "." işareti koyun ve IntelliSense yardımı ile bi gezinin ne sınıflar varmış ne isim uzayları varmış hatta bunların içine de girip metotları görün. Böylece C# ilk başlangıcımızı yapmış olduk. Bunun yanında Intellisense yardımı ile orada olduğunu düşündüğünüz ama ismini bilmediğimiz metotları bulmayı da öğrenmiş olduk zaten fare imlecini üstüne getirdiğiniz zaman Intellisenste bulunan liste elemanları hakkında gerekli açıklamayı alıyorsunuz.

Currently rated 3.0 by 2 people

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

Etiketler: ,

c#

MSP OLDUM!

yazan: 9/3/2008 2:56:00 AM

Uzun bir aradan sonra merhabalar...

Microsoft'un seçkin öğrencilereWink(megaloman yine karşınızda!!) sunduğu bir program olan MSP(Microsoft Student Partners) programında artık ben de varım. 15 - 16 eylül tarihlerinde İstanbul'da Microsoft ofisinde yapılacak olan toplantıdan sonra resmen göreve başlıyoruz. Üzüldüğüm tek nokta bu toplantılarda bizzat yer alamayacak, diğer MSP arkadaşlarla tanışamayacak olmam maalesef Türkiye'ye 24 eylül'de döneceğim.

Ben MSP oldum bundan size ne mi? öyle demeyin hemen msakademik.net 'te verilen görev tanımını buraya yapıştırıyorum;

"Microsoft'un akademik dünyaya yönelik yürüttüğü çalışmaların öğrencilere akatarılabilmesine katkıda bulunmak; MSP olarak kendisine yöneltilen yazılı ve sözlü soruları, gerekiyorsa araştırma yaparak, doğru ve etkin şekilde yanıtlamak; Microsoft teknolojilerinin ve akademik programların bilinirliğinin artmasına yönelik seminer, eğitim, çalıştay vb. etkinlikler düzenleyerek öğrencilerin aktif katılımının sağlanması için gerekli alt çalışmaları planlamak, organize etmek ve gerçekleştirmek; bölüm derslerinde Microsoft ve akademisyenlerle ilgili olası işbirliği çalışmalarına yardımcı/yönlendirici olmak; öğrenci kulüpleriyle iletişim halinde olarak çift taraflı koordinasyona katkıda bulunmak; www.msakademik.net Akademik Yazılım Geliştiriciler topluluk sitesine makale, içerik sağlamak ve/veya sağlayabilecek kişileri belirleyerek gerekli yönlendirmeyi yapmak; katıldığı etkinliklerde video röportajlar vs hazırlayıp, işleyebilmek ve paylaşabilmek; kişisel websitesi/blog tutarak bilgi paylaşımına aktif katkı sağlamak; bu ve benzeri çalışmalar için belirli bir zamanını gönüllü olarak ayırmak.

MSPlerin çalışmaları yukardakilerle sınırlı olmayıp, programın içerik ve gereklerine yönelik kişisel ve takım olarak yaratıcı çalışmalara da yer verilebilmesine olanak verilmektedir."

İşte gördüğünüz gibi; yukarda belirtilen her isteğiniz ve hatta daha fazlası için ben her zaman buradayım. Yeter ki öğrenmek isteyin... 

Currently rated 5.0 by 1 people

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

Etiketler:

Genel

 

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þ