Я только что прочитал хелп, попытаюсь набрасать алгоритм не тестируя
img=surface_create(w,h)
surface_set_target(img)
//по идее, всё последующее рисуется на сёрфасе
//x и у должны быть числами скорее всего
draw_sprite(x,y,subimg,sprite1)
draw_sprite(x,y,subimg,sprite2)
draw_sprite(x,y,subimg,sprite3)
surface_reset_target()
//это уже рисует сам сёрфейс, все draw десйствия уже рисуются на экране
draw_surface(img,x,y)
//или draw_surface_general(id,left,top,width,height,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha)
//чтобы сохранить изображение можно использовать
//surface_save(id,fname), а потом грузить как картинку и рисовать
Возможно всё до draw_surface(img,x,y) можно сделать в креэйте или другом эвенте, чтобы был фиксированный эффект. Думаю сначала можно потестировать код в драве, а потом пытаться в креэйте. Сохранять скриншот сёрфэйса и обновлять копию на ходу тоже может быть хорошей альтернативой: типа хранить спрайт как скриншот последнего сёрфейса и на нажатие кнопки добавлять этот спрайт в драв сёрфейса + новый спрайт поверх - таким образом не надо будет держать позиции спрайтов, потому что x и y дожны от куда-то браться. Если так не понятно, можешь глянуть surface_copy(destination,x,y,source) так даже лучше будет ибо не надо сохранять файл и загружать его.