Anixias
Member
So, I tried using buffer_get_surface and buffer_set_surface to send a surface of a dynamically created spaceship from the server to each client whenever a player changes their active ship. However, my cousin is unable to see any ships (except pirates, who use sprites defined in the actual project).
Here is the sending code:
The important code is this part:
This is the receiving code:
The client always generates an empty or invisible graphic.
Shouldn't this code work perfectly? I've been having so many issues with buffer_get/set_surface that I had to stop using those functions elsewhere in the game but this time it would be much faster than sending individual pixel data, maybe. I could just make the server send each individual pixel but I want this to work.
Here is the sending code:
Code:
///Sync player ships' graphics
if started and tick % round((60)/1) == 0 //1 update per second
{
if ds_list_size(client_id) > 0
{
for(var i = 0; i < ds_list_size(client_id); i++)
{
//i is receiving
var keep_going = true;
with(obj_client) if client_id == other.client_id[| i] keep_going = false;
if keep_going
{
for(var j = 0; j < ds_list_size(client_id); j++)
{
var o = client_object[| j];
if instance_exists(o)
{
buffer_seek(buff,buffer_seek_start,0);
buffer_write(buff,buffer_string,server_id);
buffer_write(buff,buffer_u16,command.changeship);
buffer_write(buff,buffer_u32,o.id);
buffer_write(buff,buffer_u32,sprite_get_width(o.sprite_index));
buffer_write(buff,buffer_u32,sprite_get_height(o.sprite_index));
buffer_write(buff,buffer_u32,sprite_get_xoffset(o.sprite_index));
buffer_write(buff,buffer_u32,sprite_get_yoffset(o.sprite_index));
var psurf = surface_create(sprite_get_width(o.sprite_index),sprite_get_height(o.sprite_index));
surface_set_target(psurf);
draw_sprite(o.sprite_index,0,-sprite_get_xoffset(o.sprite_index),-sprite_get_yoffset(o.sprite_index));
surface_reset_target();
buffer_get_surface(buff,psurf,0,buffer_tell(buff),0);
surface_free(psurf);
psurf = undefined;
network_send_udp(server,client_ip[| i],client_port[| i],buff,buffer_tell(buff));
}
}
}
else continue;
}
}
}
Code:
buffer_seek(buff,buffer_seek_start,0);
buffer_write(buff,buffer_string,server_id); //This is received earlier than the posted receive code.
buffer_write(buff,buffer_u16,command.changeship);//This is received earlier than the posted receive code.
buffer_write(buff,buffer_u32,o.id);
buffer_write(buff,buffer_u32,sprite_get_width(o.sprite_index));
buffer_write(buff,buffer_u32,sprite_get_height(o.sprite_index));
buffer_write(buff,buffer_u32,sprite_get_xoffset(o.sprite_index));
buffer_write(buff,buffer_u32,sprite_get_yoffset(o.sprite_index));
var psurf = surface_create(sprite_get_width(o.sprite_index),sprite_get_height(o.sprite_index));
surface_set_target(psurf);
draw_sprite(o.sprite_index,0,-sprite_get_xoffset(o.sprite_index),-sprite_get_yoffset(o.sprite_index));
surface_reset_target();
buffer_get_surface(buff,psurf,0,buffer_tell(buff),0);
surface_free(psurf);
psurf = undefined;
network_send_udp(server,client_ip[| i],client_port[| i],buff,buffer_tell(buff));
Code:
case command.changeship:
if connected and r_id == server_id
{
var o = noone;
var oid = buffer_read(bf,buffer_u32);
with(obj_ship) if object_id == oid o = id;
if instance_exists(o)
{
var sw = buffer_read(bf,buffer_u32);
var sh = buffer_read(bf,buffer_u32);
var sx = buffer_read(bf,buffer_u32);
var sy = buffer_read(bf,buffer_u32);
var psurf = surface_create(sw,sh);
buffer_set_surface(bf,psurf,0,buffer_tell(bf),0);
if asset_get_index(sprite_get_name(o.sprite_index)) == -1 sprite_delete(o.sprite_index);
o.sprite_index = sprite_create_from_surface(psurf,0,0,sw,sh,false,false,sx,sy);
surface_free(psurf);
psurf = undefined;
}
}
break;
Shouldn't this code work perfectly? I've been having so many issues with buffer_get/set_surface that I had to stop using those functions elsewhere in the game but this time it would be much faster than sending individual pixel data, maybe. I could just make the server send each individual pixel but I want this to work.
Last edited: