#12 OH! Disculpa la tardanza en contestar, se me había pasado por alto este hilo.
Tiene muy buena pinta tu manera de realizarlo, intentaré aplicarla a Gods Will Be Watching si saco algo de tiempo entre la beta y la entrega final
Lo que más me gusta de tu forma de hacerlo es que no usa surfaces, y eso es bueno, ya que en testing con ordenadores antiguos la surface tira de gráfica y hace que vaya como el culete, así que tuve que meterle un detector de fps y en caso de que se fueran al garete, eliminar las sombras para las máquinas menos... aventajadas xD
///draw shadows
if(!slow_performance){//switch off shadows if the performance is low
//manage surface
if(surface_exists(surf_shadow)){
surface_set_target(surf_shadow);
draw_clear_alpha(0, 0);
}else{
surf_shadow = surface_create(room_width,room_height);
surface_set_target(surf_shadow);
}
//handle every shadow in the room
if(instance_exists(o_5_char_shadow)){
with(o_5_char_shadow){
if(parent>-1){
if(instance_exists(parent)){
if(parent.visible){
//transformation points
var px = parent.x;
var py = parent.y;
var w = sprite_get_width(parent.sprite_index)*global.zoom;
var h = parent.footground*global.zoom;
var wd = 50; //horizontal iclination
var hd = h/1.5; //vertical inclination
var xoff = (sprite_get_xoffset(parent.sprite_index)+1)*global.zoom;
var yoff = parent.sprite_height-(parent.footground+1)*global.zoom;
//check if there's the necessity of duplicating a new sprite
if(parent.sprite_index!=last_sprite){
//delete previous duplicated sprite
if(sp!=-1) sprite_delete(sp);
//create new duplicated sprite
if(parent.sprite_index!=-1){
sp = sprite_duplicate(parent.sprite_index);
sprite_collision_mask(sp,false, 1, 0, 0, 0, 0, 1, 0);
}else{
sp = -1;
}
last_sprite = parent.sprite_index;
}
//draw skewed sprite
if(sp!=-1){ //only if it has a valid sprite_index
draw_sprite_pos(sp,
parent.image_index,
px+wd-xoff,
py+h+hd,
px+w+wd-xoff,
py+h+hd,
px+w-xoff,
py+h-yoff,
px-xoff,
py+h-yoff,
1
);
}
}
}else{
instance_destroy();
}
}
}
}
//reset drawing target
surface_reset_target();
//draw the modified shadow sprites with black blending color and 20% alpha
draw_surface_ext(surf_shadow, 0, 0, 1, 1, 0, c_black, 0.1);
}
//calculate performance
if(fps_real<room_speed and !slow_performance){
slow_meter++;
if(slow_meter>57) slow_performance = true;
}else{
slow_meter--;
slow_meter = clamp(slow_meter,0,200);
}
Así es como se ve el código con el limitador de FPS.
Pero a cualquiera que lea este hilo, le recomiendo que use el método de itoaragon sin duda.
Pongo el resultado de mis sombras en un gif super recortado para evitar spoilers del juego xD