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.