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
  1. /// sprite_replace_color(sprite,oldcolor,newcolor)
  2. //
  3. // Replaces one color in a given sprite with another. No new sprite are
  4. // created, the given sprite is changed. Returns (-1) on error.
  5. //
  6. // sprite sprite to change, real
  7. // oldcolor color that will be replaced, real
  8. // newcolor color used as replacement, real
  9. //
  10. /// GMLscripts.com/license
  11. {
  12. var sprite, oldc, newc;
  13. sprite = argument0;
  14. oldc = argument1;
  15. newc = argument2;
  16.  
  17. var w, h, n, i, xo, yo, surf, tempsprite, newsprite, alphasprite;
  18. w = sprite_get_width(sprite);
  19. h = sprite_get_height(sprite);
  20. n = sprite_get_number(sprite);
  21. xo = sprite_get_xoffset(sprite);
  22. yo = sprite_get_yoffset(sprite);
  23.  
  24. surf = surface_create(w,h+1);
  25. surface_set_target(surf);
  26.  
  27. for(i=0; i<n; i+=1) {
  28. draw_clear_alpha(oldc,1);
  29. draw_set_blend_mode_ext(bm_one,bm_zero);
  30. draw_sprite(sprite,i,xo,yo);
  31. tempsprite = sprite_create_from_surface(surf,0,0,w,h+1,true,false,xo,yo);
  32. draw_clear_alpha(newc,1);
  33. draw_set_blend_mode_ext(bm_src_alpha,bm_inv_src_alpha);
  34. draw_sprite(tempsprite,0,xo,yo);
  35. if (i == 0) {
  36. newsprite = sprite_create_from_surface(surf,0,0,w,h,false,false,xo,yo);
  37. if (newsprite < 0) return -1;
  38. }else{
  39. sprite_add_from_surface(newsprite,surf,0,0,w,h,false,false);
  40. }
  41. draw_clear_alpha(c_white,1);
  42. draw_set_blend_mode_ext(bm_zero,bm_src_alpha);
  43. draw_sprite(sprite,i,xo,yo);
  44. if (i == 0) {
  45. alphasprite = sprite_create_from_surface(surf,0,0,w,h,false,false,xo,yo);
  46. if (alphasprite < 0) {
  47. sprite_delete(newsprite);
  48. return -1;
  49. }
  50. }else{
  51. sprite_add_from_surface(alphasprite,surf,0,0,w,h,false,false);
  52. }
  53. sprite_delete(tempsprite);
  54. }
  55.  
  56. draw_set_blend_mode(bm_normal);
  57. surface_reset_target();
  58. sprite_assign(sprite,newsprite);
  59. sprite_set_alpha_from_sprite(sprite,alphasprite);
  60. sprite_delete(newsprite);
  61. sprite_delete(alphasprite);
  62. surface_free(surf);
  63. }

Contributors: xot

GitHub: View · Commits · Blame · Raw