Hola Simu, he estado testeando a fondo la lib de red y me he dado cuenta de algo que no había tenido en cuenta al principio de todo..
Intenta modificar la parte de la estructura de datos desde un único punto en cada cliente o servidor.. esto es para que no se envien todos los datos mas de una vez.. si por ejemplo modificas un dato y al frame siguiente modificas otro dato estás enviando practicamente lo mismo 2 veces.. y nos comerá el ancho de banda si somos descuidados, te pego el proceso de mi personaje en el juego que estoy haciendo para que veas como lo he montado, igual te da alguna idea.
[Codebox=gemix file=Untitled.gemix]process My_Player();
private
int x_buffer; // coordenadas correctas del frame anterior..
int y_buffer; // coordenadas correctas del frame anterior..
byte last_key=0; // ultima tecla pulsada "de las teclas que se usan.."
byte anima_walk_up[11]=1,1,2,2,3,3,4,4,5,5,6,6;
byte anima_walk_side[11]=7,7,8,8,9,9,10,10,11,11,12,12;
byte anima_walk_down[11]=13,13,14,14,15,15,16,16,17,17,18,18;
byte anima_shot_up[11]=19,19,20,20,21,21,22,22,23,23,24,24;
byte anima_shot_side[11]=25,25,26,26,27,27,28,28,29,29,30,30;
byte anima_shot_down[11]=31,31,32,32,33,33,34,34,35,35,36,36;
byte anima_shot2_up[9]=37,37,38,38,39,39,40,40,41,41;
byte anima_shot2_side[9]=42,42,43,43,44,44,45,45,46,46;
byte anima_shot2_down[9]=47,47,48,48,49,49,50,50,51,51;
byte anima_steep=1;
int available_bomb = false;
byte net_graph_; // el gráfico actual de mi personaje.. para enviarlo por red..
byte net_flags_; // el valor de flags de mi personaje.. para enviarlo por red..
begin
visible = false;
ctype = c_scroll;
scroll[0].camera = id;
graph = new_map(10,10,5,5,rgb(10,10,10));
write_int(0,10,50,3,&x);
write_int(0,10,60,3,&y);
x = 460;
y = 840;
loop
x_buffer=x;
y_buffer=y;
z = 1000 - y;
if(key(_left)) // IR IZQUIERDA..
if(anima_steep==0)play_sound(sfx_pasos);end
x-=2;
anima_steep=(anima_steep+1) % 11;
draw_graphic(f_player,anima_walk_side[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
net_graph_ = anima_walk_side[anima_steep];
net_flags_ = 0;
last_key=1;
elseif(key(_right)) // IR DERECHA..
if(anima_steep==0)play_sound(sfx_pasos);end
//flags=1;
x+=2;
anima_steep=(anima_steep+1) % 11;
draw_graphic(f_player,anima_walk_side[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100,0,0,0,1,0);
net_graph_ = anima_walk_side[anima_steep];
net_flags_ = 1;
last_key=2;
elseif(key(_up)) // IR ARRIBA..
if(anima_steep==0)play_sound(sfx_pasos);end
y-=2;
anima_steep=(anima_steep+1) % 11;
draw_graphic(f_player,anima_walk_up[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
net_graph_ = anima_walk_up[anima_steep];
net_flags_ = 0;
last_key=3;
elseif(key(_down)) // IR ABAJO..
if(anima_steep==0)play_sound(sfx_pasos);end
y+=2;
anima_steep=(anima_steep+1) % 11;
draw_graphic(f_player,anima_walk_down[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
net_graph_ = anima_walk_down[anima_steep];
net_flags_ = 0;
last_key=4;
else // DEFAULT AS STAND..
anima_steep=0;
if(last_key==4)
draw_graphic(f_player,18,x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
net_graph_ = 18;
net_flags_ = 0;
elseif(last_key==3)
draw_graphic(f_player,1,x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
net_graph_ = 1;
net_flags_ = 0;
elseif(last_key==1)
draw_graphic(f_player,7,x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
net_graph_ = 7;
net_flags_ = 0;
elseif(last_key==2)
draw_graphic(f_player,7,x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100,0,0,0,1,0);
net_graph_ = 7;
net_flags_ = 1;
end
end
if(key(_alt)) // generar disparo tipo FLECHA..
if(!exists(type shot_flecha))
sound(sfx_pre_bow);
if(last_key==4)
for(anima_steep=0;anima_steep<11;anima_Steep++)
draw_text(0,"ATACK",4,x-scroll[0].x0,y-25-scroll[0].y0,-10,0,100,100,0,0,0,0,1);
draw_graphic(f_player,anima_shot_down[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
frame;
end
SHOT_FLECHA(x,y,"abajo");
end
if(last_key==3)
for(anima_steep=0;anima_steep<11;anima_Steep++)
draw_text(0,"ATACK",4,x-scroll[0].x0,y-25-scroll[0].y0,-10,0,100,100,0,0,0,0,1);
draw_graphic(f_player,anima_shot_up[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
frame;
end
SHOT_FLECHA(x,y,"arriba");
end
if(last_key==1)
for(anima_steep=0;anima_steep<11;anima_Steep++)
draw_text(0,"ATACK",4,x-scroll[0].x0,y-25-scroll[0].y0,-10,0,100,100,0,0,0,0,1);
draw_graphic(f_player,anima_shot_side[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
frame;
end
SHOT_FLECHA(x,y,"izquierda");
end
if(last_key==2)
for(anima_steep=0;anima_steep<11;anima_Steep++)
draw_text(0,"ATACK",4,x-scroll[0].x0,y-25-scroll[0].y0,-10,0,100,100,0,0,0,0,1);
draw_graphic(f_player,anima_shot_side[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100,0,0,0,1,0);
frame;
end
SHOT_FLECHA(x,y,"derecha");
end
end
end
if(key(_space)) // generar disparo tipo bomba..
if(available_bomb == true)
sound(sfx_pre_bomba);
if(last_key==4)
for(anima_steep=0;anima_steep<9;anima_Steep++)
draw_text(0,"ATACK",4,x-scroll[0].x0,y-25-scroll[0].y0,-10,0,100,100,0,0,0,0,1);
draw_graphic(f_player,anima_shot2_down[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
frame;
end
SHOT_bomba(x,y,"abajo");
end
if(last_key==3)
for(anima_steep=0;anima_steep<9;anima_Steep++)
draw_text(0,"ATACK",4,x-scroll[0].x0,y-25-scroll[0].y0,-10,0,100,100,0,0,0,0,1);
draw_graphic(f_player,anima_shot2_up[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
frame;
end
SHOT_bomba(x,y,"arriba");
end
if(last_key==1)
for(anima_steep=0;anima_steep<9;anima_Steep++)
draw_text(0,"ATACK",4,x-scroll[0].x0,y-25-scroll[0].y0,-10,0,100,100,0,0,0,0,1);
draw_graphic(f_player,anima_shot2_side[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100);
frame;
end
SHOT_bomba(x,y,"izquierda");
end
if(last_key==2)
for(anima_steep=0;anima_steep<9;anima_Steep++)
draw_text(0,"ATACK",4,x-scroll[0].x0,y-25-scroll[0].y0,-10,0,100,100,0,0,0,0,1);
draw_graphic(f_player,anima_shot2_side[anima_steep],x-scroll[0].x0,y-scroll[0].y0,z,resolution,angle,100,100,0,0,0,1,0);
frame;
end
SHOT_bomba(x,y,"derecha");
end
end
end
if(last_key==3 && map_get_pixel(f_zone,3,x,y-2) <> 0) // si bajando toco dureza..
x=x_buffer;
y=y_buffer;
end
if(last_key==4 && map_get_pixel(f_zone,3,x,y+4) <> 0) // si subiendo toco dureza..
x=x_buffer;
y=y_buffer;
end
if(last_key==1 && map_get_pixel(f_zone,3,x-2,y) <> 0) // si a la izquierda toco dureza..
x=x_buffer;
y=y_buffer;
end
if(last_key==2 && map_get_pixel(f_zone,3,x+2,y) <> 0) // si a la derecha toco dureza..
x=x_buffer;
y=y_buffer;
end
draw_text(0,"Player 1",4,x-scroll[0].x0,y-25-scroll[0].y0,-10,0,100,100,0,0,0,0,1);
//--------------------------UPDATE NET POSITION---------------------------------------
players[net.player_id].x_ = x; // mi coordenada X..
players[net.player_id].y_ = y; // mi coordenada Y..
players[net.player_id].graph_ = net_graph_; // mi gráfico..
players[net.player_id].flags_ = net_flags_; // mi flags..
if(exists(id_my_shot)) // Si existe mi disparo..
players[net.player_id].x_shot_ = id_my_shot.x; // envio su posición..
players[net.player_id].y_shot_ = id_my_shot.y; // envio su posición..
players[net.player_id].angle_shot_ = id_my_shot.angle; // envio su angle..
players[net.player_id].graph_shot_ = id_my_shot.graph; // envio su gráfico..
else // si no existe mi disparo..
players[net.player_id].x_shot_ = -100; // mando a las replicas de mi disparo en los otros clientes fuera del scroll..
players[net.player_id].y_shot_ = -100; // mando a las replicas de mi disparo en los otros clientes fuera del scroll..
end
//------------------------------------------------------------------------------------
frame;
end
end[/Codebox]
Modificando todas las variables desde el mismo punto se ahorra bastante ancho de banda.