Gamemaker studio ile multiplayer derslerimize devam ediyoruz.Bu derste
kullanıcı verilerini depolamayı ve veri transferini işleyeceğiz.
Kodlar diğer derslerde kullandıklarımız ile aynı.O yüzden tek tek kodları anlatmayacağım.Onun yerine aşama aşama sistem mantığını anlatacağım.
1-Kullanıcı oyuna girdiğinde serverda rasgele x,y oluşturulup listeye eklenir.
2-Client verileri serverdan talep eder.Talebi stepte yaparız ki anlık veri çekimi olsun.
3-Server veri isteğini alır ver tüm verileri aynı yol ile o kullanıcıya yollar.
4-Kullanıcı veriyi alıp kayıt eder.
5-Drawda da sürekli bu verileri ekrana çizer.
Bu derste yaptığımız temel işlevler bunlar.Ders çok uzun olduğu için video da kodları daha öncede yazıp örnekte sadece açıkladım.Diğer derste klavye girdilerini alıp hareket edeceğiz.
İndir : http://ustaderslik.com/dosya/Gamemaker%20Multiplayer-4.zip
Video :
server Networking :
var baglanti_tipi=ds_map_find_value(async_load,"type");
//bu network olaylarını yakalayan bir komut.eğer işem var ise aşağıda işlemi yakalayacağız.
switch(baglanti_tipi){
case network_type_connect:
var osocket=ds_map_find_value(async_load,"socket");//oyuncunun socket nosunu al
ds_list_add(oyuncu_sayisi,osocket);//listeye ekle
break;
case network_type_disconnect:
var osocket=ds_map_find_value(async_load,"socket");//oyuncunun socket nosunu al
var arama=ds_list_find_index(oyuncu_sayisi,osocket);//listede ara
if(arama>=0){//eğer var ise
ds_list_delete(oyuncu_sayisi,arama)//listeden sil.
}
break;
case network_type_data:
var veri_al=ds_map_find_value(async_load,"buffer");//tüm verileri paket şeklinde aldık.
buffer_seek(veri_al,buffer_seek_start,0);//verileri içini araştırdık.almaya hazırız.
var islem=buffer_read(veri_al,buffer_u8);//işlem için yolladığımız veri.
if(islem=1){
var isim=buffer_read(veri_al,buffer_string);//isimi aldık.
ds_list_add(oyuncu_isimleri,isim);//isimi listeye ekledik
ds_list_add(oyuncu_verileri,random_range(75,500));//oyuna giren kişiye rasgele bir x veriyoruz.
ds_list_add(oyuncu_verileri,250);//y olarada 250 veriyoruz.
}else if(islem=2){
var isim3=buffer_read(veri_al,buffer_string);//yollanan isimi alıyoruz.
var isim_ara=ds_list_find_index(oyuncu_isimleri,isim3);//listede isimi arıyoruz.
var sil_pos=isim_ara*2;//kullanıcı çıktığında isim listesindeki konumuna göre verilerini buluyoruz.
if(isim_ara>0){//isim varsa
ds_list_delete(oyuncu_isimleri,isim_ara);//isimi listeden siliyoruz.
ds_list_delete(oyuncu_verileri,sil_pos);//x değerini siliyoruz.
ds_list_delete(oyuncu_verileri,sil_pos+1);//y değerini siliyoruz.
}else{
ds_list_delete(oyuncu_isimleri,isim_ara);
ds_list_delete(oyuncu_verileri,isim_ara);
ds_list_delete(oyuncu_verileri,isim_ara+1);
}
}else if(islem=3){
var socket = ds_map_find_value( async_load , "id" );//veri isteği yollayan kişinin idsini alıyoruz
veri_yolla(socket);//verileri yollayacağımız scripte yolluyoruz.
}
break;
}
client Networking :
var baglanti_tipi=ds_map_find_value(async_load,"type");//gelen veri varsa
switch(baglanti_tipi){
case network_type_data:
var veri_al=ds_map_find_value(async_load,"buffer");//gelen buffırı al
buffer_seek(veri_al,buffer_seek_start,0);
var islem=buffer_read(veri_al,buffer_u8);//işlem idsini alıyoruz.
if(islem=1){//işlem 1 ise
ds_list_clear(oyuncu_verileri);//listeyi temizliyoruz.
var toplam=buffer_read(veri_al,buffer_u8)*3;//3 değer yollandı isim,x,y, o yüzden kullanıcı sayısını 3 ile çarpıyoruz.
for(var i=0;i<toplam;i+=3){//tüm verileri döngüye aldık
ds_list_add(oyuncu_verileri,buffer_read(veri_al,buffer_string));
ds_list_add(oyuncu_verileri,buffer_read(veri_al,buffer_string));
ds_list_add(oyuncu_verileri,buffer_read(veri_al,buffer_string));//verileri listemize yazdırdık.
}
}
break;
}
veri_yolla() scripti :
var socket=argument[0];//kullanıcı idsini aldık.
buffer_seek(depo,buffer_seek_start,0);
buffer_write(depo,buffer_u8,1);//işlem olarak 1 değeri gönderdik
var toplam=ds_list_size(oyuncu_isimleri);//açık olan toplam kullanıcı
buffer_write(depo,buffer_s8,toplam);//kullanıcı sayısınıda yolluyoruz.
for(var i=0;i<ds_list_size(oyuncu_isimleri);i++){//açık olan kullanıcıların verilerini tek tek alıyoruz.
var pos=i*2;//isme göre veriler tablosundaki yeri.2veri olduğu içinn 2 ile çarpıyoruz.
if(i=0){
var oi=ds_list_find_value(oyuncu_isimleri,i);//isim
var vx=ds_list_find_value(oyuncu_verileri,i);//x
var vy=ds_list_find_value(oyuncu_verileri,i+1);//y
}else{
var oi=ds_list_find_value(oyuncu_isimleri,i);//isim
var vx=ds_list_find_value(oyuncu_verileri,pos);//x
var vy=ds_list_find_value(oyuncu_verileri,pos+1);//y
}
if(oi != ""){//eğer isim varsa
buffer_write(depo,buffer_string,string(oi));
buffer_write(depo,buffer_string,string(vx));
buffer_write(depo,buffer_string,string(vy));//verileri sistem belleğine yazdırdık
}
}
network_send_packet(socket,depo,buffer_tell(depo));//verileri yolladık.