You are currently viewing the GMLscripts.com static mirror. Forum access and script submissions are not available through this mirror.

Invert GMLscripts.com

sprite_replace_color

Replaces one color in a given sprite with another. It is meant to called once per color replacement. This only needs be done once, such as at the start of a game.

sprite_replace_color()

NOTE: Here is a much slower script that supports color blending: sprite_replace_color_blend()

sprite_replace_color(sprite,oldcolor,newcolor)
Replaces one color in a given sprite with another.
COPY/// sprite_replace_color(sprite,oldcolor,newcolor)
//
//  Replaces one color in a given sprite with another. No new sprite are
//  created, the given sprite is changed. Returns (-1) on error.
//
//      sprite      sprite to change, real
//      oldcolor    color that will be replaced, real
//      newcolor    color used as replacement, real
//
/// GMLscripts.com/license
{
    var sprite, oldc, newc;
    sprite = argument0;
    oldc  = argument1;
    newc  = argument2;

    var w, h, n, i, xo, yo, surf, tempsprite, newsprite, alphasprite;
    w  = sprite_get_width(sprite);
    h  = sprite_get_height(sprite);
    n  = sprite_get_number(sprite);
    xo = sprite_get_xoffset(sprite);
    yo = sprite_get_yoffset(sprite);

    surf = surface_create(w,h+1);
    surface_set_target(surf);

    for(i=0; i<n; i+=1) {
        draw_clear_alpha(oldc,1);
        draw_set_blend_mode_ext(bm_one,bm_zero);
        draw_sprite(sprite,i,xo,yo);
        tempsprite = sprite_create_from_surface(surf,0,0,w,h+1,true,false,xo,yo);
        draw_clear_alpha(newc,1);
        draw_set_blend_mode_ext(bm_src_alpha,bm_inv_src_alpha);
        draw_sprite(tempsprite,0,xo,yo);
        if (i == 0) {
            newsprite = sprite_create_from_surface(surf,0,0,w,h,false,false,xo,yo);
            if (newsprite < 0) return -1;
        }else{
            sprite_add_from_surface(newsprite,surf,0,0,w,h,false,false);
        }     
        draw_clear_alpha(c_white,1);
        draw_set_blend_mode_ext(bm_zero,bm_src_alpha);
        draw_sprite(sprite,i,xo,yo);
        if (i == 0) {
            alphasprite = sprite_create_from_surface(surf,0,0,w,h,false,false,xo,yo);
            if (alphasprite < 0) {
                sprite_delete(newsprite);
                return -1;
            }
        }else{
            sprite_add_from_surface(alphasprite,surf,0,0,w,h,false,false);
        }
        sprite_delete(tempsprite);
    }

    draw_set_blend_mode(bm_normal);
    surface_reset_target();
    sprite_assign(sprite,newsprite);
    sprite_set_alpha_from_sprite(sprite,alphasprite);
    sprite_delete(newsprite);
    sprite_delete(alphasprite);
    surface_free(surf);
}

Contributors: xot

GitHub: View · Commits · Blame · Raw