Con la fonción image_blend se puede cambiar el color del objeto. ¿Pero como se tendría que hacer si lo quiero colorear parcialmente?
Lo que busco es una función o script que me permita cambiar el color del objeto desde el radio y con el ángulo. No se si me explico. Como los quesitos de las gráficas:
Ahora si.

Asumo que si comparas el coloreo de un sprite mediante image_blend con lo que tú quieres hacer, entonces lo que tienes es un sprite fijo de un gráfico circular con separaciones dadas y quieres hacer un image_blend de parte del sprite en vez de todo. No se me ocurre una forma de colorear parte de un sprite, pero si lo que necesitas hacer es dibujar un gráfico circular, en vez de eso puedes dibujar cada sector circular del color que quieras, con una primitiva tipo pr_trianglefan. Por ejemplo (esto sacado del ejemplo de draw_primitive_begin del manual de GMS):

var i, steps, xx, yy, radius;
steps=20;
xx=50;
yy=50;
radius=30;
draw_set_color(c_red);
draw_primitive_begin(pr_trianglefan);
draw_vertex(xx, yy);
for(i = 0; i <= steps; i += 1)
    {
    draw_vertex(xx + lengthdir_x(radius, 120 * i / steps), yy + lengthdir_y(radius, 120 * i / steps));
    }
draw_primitive_end();


Eso dibuja un sector circular rojo entre los ángulos 0º y 120º, centrado en 50,50 con radio 30 y un arco circular compuesto de 21 puntos.


Hice un script para dibujar ese tipo de figuras, llamadas sectores circulares, usando pr_trianglefan como mencionó Guacusio.
[spoiler=dibujar_sector]
[gml]
///dibujar_sector( x,y,r, a1,a2,a3, contorno );
/*                 0 1 2  3  4  5   6
DIBUJAR UN SECTOR CIRULAR
Dibuja un sector circular con vertice en (x,y), el vertice
es el centro del circulo, con radio r. El area dibujada va
desde el angulo 1 (a1) hasta el angulo 2 (a2), en el sentido
contrario a las manecillas del reloj, en incrementos iguales
al angulo 3 (a3). Si se intercambian los valores de a1 y a2
el sector resultante es el conjugado del primero.

Argumentos
    x,y: vertice del sector
    r: radio
    a1: angulo inicial
    a2: angulo final
    a3: angulo incremento (precision)
    contorno: dibujar solo contorno o llenar poligono
   
Devuelve: nada
*/
var xx, yy, r, a1, a2, a3, i;
xx = argument0; //vertice
yy = argument1;
r  = argument2; //radio

a1 = argument3; //angulo inicial
a2 = argument4; //angulo final
while( a1 >= a2 ) a2 += 360; //evitar sectores mayores
while( a2-a1 > 360 ) a1 += 360; // a 360 grados

if( argument5 == 0 ) a3 = 10; //la precision debe
else a3 = abs(argument5); // ser mayor a cero

//iniciar primitivas (contorno o lleno)
if( argument6 ) draw_primitive_begin( pr_linestrip );
else draw_primitive_begin( pr_trianglefan );

draw_vertex( xx, yy ); //primer vertice
while( a2 > a1 ) //hacer un barrido desde a2 hasta a1
{
    draw_vertex(
    xx + lengthdir_x(r,a2),
    yy + lengthdir_y(r,a2) );
    a2 -= a3;
}
draw_vertex( //vertice en a1
xx + lengthdir_x(r,a1),
yy + lengthdir_y(r,a1) );

if( argument6 ) draw_vertex( xx, yy ); //vertice final
draw_primitive_end();
[/gml]
[/spoiler]

El sprite y el sector circular se pueden combinar de muchas formas, pero si quieres obtener el mismo color que se obtiene con image_blend se puede usar el siguiente método. Antes se debe crear una superficie.
[gml]
surface_set_target( sf ); //dibujar en superficie
draw_clear( c_white ); //blanco solido

//dibujar sector
draw_set_color( c_red );
dibujar_sector( w2,h2,r, a1,a2,10, false );

//los colores del sprite se multiplican
// por el color de fondo (bm_dest_color)
// y el fondo se elimina (bm_zero)
draw_set_blend_mode_ext( bm_dest_color, bm_zero );
draw_sprite( sprite_index, image_index, 0,0 );

//volver a la normalidad
draw_set_blend_mode( bm_normal );
surface_reset_target();
[/gml]

Hay un ejemplo adjunto.

Al probar en GMS noté un comportamiento extraño: algunas veces se muestra parte del fondo, y parece que ese resultado cambia dependiendo de la versión de GMS. Para solucionarlo he invertido el orden de dibujo y el "modo de mezcla"
[gml]
///Metodo 2

if( not surface_exists(sf) ) //si superficie borrada
sf = surface_create(w,h); //crear otra vez

surface_set_target( sf ); //dibujar en superficie
draw_clear_alpha(0,0); //superficie transparente
draw_sprite( sprite_index, image_index, 0,0 ); //sprite

//Los sectores no aportan color (bm_zero), pero
// multiplican los colores del sprite (bm_src_colour)
draw_set_blend_mode_ext( bm_zero, bm_src_color );
a += 2; //incrementar angulo principal

//dibujar primer sector
draw_set_color( c_red );
dibujar_sector( w2,h2,r, a,a+45,10, false );

//dibujar segundo sector
draw_set_color( c_blue );
dibujar_sector( w2,h2,r, a+90,a-45,10, false );

//volver a la normalidad
draw_set_blend_mode( bm_normal );
surface_reset_target();
[/gml]

Mejor así, gracias. Porque yo uso GMS.
¿Pero no consume esto mucha capacidad? Dicen que el evento draw es muy pesado. Y tengo que colocar el objeto como 20 o 30 veces en el mapa.
Ahora si.

Cita de: venus en Agosto 19, 2015, 07:55:15 PM
Mejor así, gracias. Porque yo uso GMS.
¿Pero no consume esto mucha capacidad? Dicen que el evento draw es muy pesado. Y tengo que colocar el objeto como 20 o 30 veces en el mapa.

El método de Clamud crea, en el evento que tu quieras y por una sola vez, una surface con el gráfico circular para luego de ahí en adelante en el evento draw dibujar esa superficie. No veo por qué debiera ser más costoso dibujar esa superficie en vez de un sprite.