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.