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.