Gamemaker studio da multiplayer serimize devam ediyoruz.Bu derste
ateş etmeyi işleyeceğiz.Geçen derste oyuna giren hersi hareket ettirdik.Bu derste de oluşturacağımız merminin herkeste görünmesini sağlayacağız.
Ateş sisteminin mantığı ise şu:
1-Kullanıcı ateş eder.mouse koordinatları ve isimi servera yollarız.
2-Serverda verileri alıp,isime göre x,y verilerini listeden buluruz.Buduğumuz x,y ile mouse verilerini tüm kullanıcılara yollarız.
3-Kullanıcılar veriyi alıp mermiyi çizdirir.
Temel mantık bu şekilde.
İndir : http://ustaderslik.com/dosya/Gamemaker%20Multiplayer-6.zip
Video :
Client GlobalMouseLeft :
buffer_seek(depo,buffer_seek_start,0);
buffer_write(depo,buffer_u8,5);//işlem olarak 5 yolluyoruz.
buffer_write(depo,buffer_string,string(isim));//isimi yolluyoruz.
buffer_write(depo,buffer_u16,mouse_x);//mouse x yolluyoruz.
buffer_write(depo,buffer_u16,mouse_y);//mouse y yolluyoruz.
network_send_packet(socket,depo,buffer_tell(depo));//verileri yolluyoruz.
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.
}
}else if(islem=2){
var xx=buffer_read(veri_al,buffer_u16);
var yy=buffer_read(veri_al,buffer_u16);//x ve y yi aldık
mx=buffer_read(veri_al,buffer_u16);
my=buffer_read(veri_al,buffer_u16);//mouse x ve mouse y yi aldık
instance_create(xx,yy,obj_mermi)
}
break;
}
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.
}else if(islem=4){
var tus_isim=buffer_read(veri_al,buffer_string);//isimi aldık
var tus=buffer_read(veri_al,buffer_string);//tuşu aldık
var isim_ara=ds_list_find_index(oyuncu_isimleri,tus_isim);//ismi listede aradık.
var pozisyon=isim_ara*2;//kullanıcı ismine göre verinin listedeki yerini bulmak için.
if(isim_ara>0){
if(tus="W"){//Eğer tuş w ise
var y_pos=ds_list_find_value(oyuncu_verileri,pozisyon+1)-hiz;//verilerde y nün yerini bulduk aldık.daha sonra hızdan çıkardık.
ds_list_replace(oyuncu_verileri,pozisyon+1,y_pos);//veriyi yeni değeri ile değiştirdik
}else if(tus="S"){//Eğer tuş s ise
var y_pos=ds_list_find_value(oyuncu_verileri,pozisyon+1)+hiz;//verilerde y nün yerini bulduk aldık.daha sonra hıza ekledik.
ds_list_replace(oyuncu_verileri,pozisyon+1,y_pos);//veriyi yeni değeri ile değiştirdik
}else if(tus="A"){//Eğer tuş a ise
var x_pos=ds_list_find_value(oyuncu_verileri,pozisyon)-hiz;//verilerde x nün yerini bulduk aldık.daha sonra hızdan çıkardık.
ds_list_replace(oyuncu_verileri,pozisyon,x_pos);//veriyi yeni değeri ile değiştirdik
}else if(tus="D"){//Eğer tuş d ise
var x_pos=ds_list_find_value(oyuncu_verileri,pozisyon)+hiz;//verilerde x nün yerini bulduk aldık.daha sonra hıza ekledik.
ds_list_replace(oyuncu_verileri,pozisyon,x_pos);//veriyi yeni değeri ile değiştirdik
}
}else{
if(tus="W"){//Eğer tuş w ise
var y_pos=ds_list_find_value(oyuncu_verileri,isim_ara+1)-hiz;//verilerde y nün yerini bulduk aldık.daha sonra hızdan çıkardık.
ds_list_replace(oyuncu_verileri,isim_ara+1,y_pos);//veriyi yeni değeri ile değiştirdik
}else if(tus="S"){//Eğer tuş s ise
var y_pos=ds_list_find_value(oyuncu_verileri,isim_ara+1)+hiz;//verilerde y nün yerini bulduk aldık.daha sonra hıza ekledik.
ds_list_replace(oyuncu_verileri,isim_ara+1,y_pos);//veriyi yeni değeri ile değiştirdik
}else if(tus="A"){//Eğer tuş a ise
var x_pos=ds_list_find_value(oyuncu_verileri,isim_ara)-hiz;//verilerde x nün yerini bulduk aldık.daha sonra hızdan çıkardık.
ds_list_replace(oyuncu_verileri,isim_ara,x_pos);//veriyi yeni değeri ile değiştirdik
}else if(tus="D"){//Eğer tuş d ise
var x_pos=ds_list_find_value(oyuncu_verileri,isim_ara)+hiz;//verilerde x nün yerini bulduk aldık.daha sonra hıza ekledik.
ds_list_replace(oyuncu_verileri,isim_ara,x_pos);//veriyi yeni değeri ile değiştirdik
}
}
}else if(islem=5){
var gisim=buffer_read(veri_al,buffer_string);//isimi aldık
var gmx=buffer_read(veri_al,buffer_u16);//mouse x aldık
var gmy=buffer_read(veri_al,buffer_u16);//mouse y aldık
var isim_ara2=ds_list_find_index(oyuncu_isimleri,gisim);//listeden isimi aradık
var pozisyon2=isim_ara2*2;
if(isim_ara2>0){
var gx=ds_list_find_value(oyuncu_verileri,pozisyon2);
var gy=ds_list_find_value(oyuncu_verileri,pozisyon2+1);//x ve y yi aldık
}else{
var gx=ds_list_find_value(oyuncu_verileri,isim_ara2);
var gy=ds_list_find_value(oyuncu_verileri,isim_ara2+1);//x ve y yi aldık
}
for(var i=0;i<ds_list_size(oyuncu_sayisi);i++){//tüm oyuncuları teker teker aldık
var socket=ds_list_find_value(oyuncu_sayisi,i);//socketlerini aldık.
buffer_seek(depo,buffer_seek_start,0);
buffer_write(depo,buffer_u8,2);//işlemi bosu yolladık
buffer_write(depo,buffer_u16,gx);
buffer_write(depo,buffer_u16,gy);//x ve y yolladık
buffer_write(depo,buffer_u16,gmx);
buffer_write(depo,buffer_u16,gmy);//mouse x ve mouse y yolladık
network_send_packet(socket,depo,buffer_tell(depo));//verileri herkese yolladık.
}
}
break;
}