To wcale nie jest takie trudne. Jak już exigo wspomniał najlepszym sposobem będzie rysowanie tego na surface.
1.
Tworzysz 2 obiekty > oShadow i pShadowCaster. Pierwszy to będzie obiekt rysujący cień na ekranie. Drugi będzie parentem dla każdego obiektu który ma rzucać cień.
oShadow ustaw depth na tyle mały duży by inne obiekty go mogły przykryć oprócz podłogi. pShadowCaster zostaw jak jest.
2.
W obiekcie oShadow
GML (create)
globalvar gShadowSurface, gVx, gVy; // zmienne globalne
// tworzenie surface o rozmiarze viewa
gShadowSurface = surface_create( view_wview, view_hview );
// czyszczenie go
surface_set_target( gShadowSurface );
draw_clear_alpha( 0, 0 );
surface_reset_target();
// pozycja viewa
gVx = view_xview;
gVy = view_yview;
GML (BeginStep)
surface_set_target( gShadowSurface );
draw_clear_alpha( 0, 0 );
surface_reset_target();
gVx = view_xview;
gVy = view_yview;
GML (draw)
// zabezpieczenie na wypadek gdyby coś się stało z surfacem
if ( !surface_exists(gShadowSurface) ) gShadowSurface = surface_create( view_wview, view_hview );
// rysowanie surface na ekranie
draw_surface_ext( gShadowSurface, gVx, gVy, 1, 1, 0, 0, 0.5 );
3.
W obiekcie pShadowCaster
GML (Step)
// rysowanie cieni na surface
surface_set_target( gShadowSurface );
draw_sprite_ext( sprite_index, image_index, x-gVx-3, y-gVy-3, 1.3, 1.3, image_angle, 0, 1 );
surface_reset_target();
4.
Wszystkim obiektom które mają rzucać cienie daj parenta pShadowCaster i dodaj do step.
GML
event_inherited();
I postaw w roomie obiekt oShadow