GMLscripts.com

Discuss and collaborate on GML scripts
Invert

You are not logged in.

#1 2009-03-23 20:00:38

paul23
Member
Registered: 2007-10-17
Posts: 110

sprite_resize()

The other function I've created for my newest game that might be nice for others:

Expand/*
**  Usage:
**      sprite_resize(sprite,xscale,yscale,scaleoffset)
**
**  Arguments:
**      sprite      sprite to change
**      xscale      new xscale
**      yscale      new yscale
**      scaleoffset wether to scale the offset (so the relative offset stays the same
**
**  Returns:
**      (-1) on error
**
**  Notes:
**      For smoother sprites make sure to set interpolation on!
**  GMLscripts.com
*/
{
    var sprite,xscale,yscale,dx,dy,offscale,w,h,n,p,s,l,xo,yo,surf,i,newsprite,alphasprite;
    sprite   = argument0;
    xscale   = argument1;
    yscale   = argument2;
    offscale = argument3;   
    w  = sprite_get_width(sprite)*abs(xscale);
    h  = sprite_get_height(sprite)*abs(yscale);
    n  = sprite_get_number(sprite);
    p  = sprite_get_precise(sprite);
    s  = sprite_get_smooth(sprite);
    l  = sprite_get_preload(sprite);
    xo = sprite_get_xoffset(sprite);
    yo = sprite_get_yoffset(sprite);
    
    dx = (xo*xscale + w) mod w;
    dy = (yo*yscale + h) mod h;
    
    if (offscale) {
        xo=dx;
        yo=dy;
    }        
    
    surf = surface_create(w,h);
    if (surf < 0) return -1;
    surface_set_target(surf);
    for (i=0; i<n; i+=1) {
        draw_clear_alpha(c_white,1);
        draw_set_blend_mode_ext(bm_zero,bm_src_color);
        draw_sprite_ext(sprite,i,dx,dy,xscale,yscale,0,c_white,1);
        if (i == 0) {
            newsprite = sprite_create_from_surface(surf,0,0,w,h,p,false,s,l,xo,yo);
            if (newsprite < 0) {
                surface_free(surf);
                return -1;
            }
        }else{
            sprite_add_from_surface(newsprite,surf,0,0,w,h);
        }
        draw_set_blend_mode(bm_normal);
    }
    
    surface_reset_target();
    sprite_assign(sprite,newsprite);
    sprite_delete(newsprite);
    surface_free(surf);
    return true;
}

It does what it says: it resizes a sprite

Offline

Board footer

Powered by FluxBB