ID:2708919
 
/* DEMO */
world/mob = /mob/player

mob/player
var obj/screen/screen = new

mob/player/Login()
client.screen += screen
..()
src.screen.Add("Button",new/obj/button/red)
src.screen.Add("Buttons",new/obj/button/blue,new/obj/button/green)
src.screen.Show("Button",32,32)
/* END OF DEMO */

obj/screen
screen_loc = "1,1"
var list/hud = new

obj/screen/proc/Add(id)
if(!(id in hud))
hud[id] = list()
hud[id] |= args.Copy(2)

obj/screen/proc/Show(id,x_offset,y_offset)
var object
if(id in hud)
for(object in hud[id])
animate(object,pixel_x=x_offset,pixel_y=y_offset)
vis_contents |= object

obj/screen/proc/Hide(id)
var object
if(id in hud)
for(object in hud[id])
vis_contents -= object
Barebones, could use the initial offset of objects in the calculation but I chose to keep it simple. Can be modified to suit your needs very easily.