Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Dibujar sector circular  (Leído 1447 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Clamud

en: Abril 11, 2016, 08:13:21 pm
Autor: yo
Descripción: Dibuja un sector circular o "queso partido"
Versión: GM8 en adelante, también podría funcionar en versiones previas

Código:
///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;
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();
« última modificación: Abril 12, 2016, 04:31:36 pm por Clamud »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado correojon

  • El azote de los trollers y
  • Legendario
  • *
  • Puntos: 84
  • Mensajes: 4.111
  • Agradecido: 2 veces
  • No mercy
    • Ver Perfil
Respuesta #1 en: Abril 12, 2016, 12:06:12 am
Buen script, pero creo que es más sencillo hacerlo con un for:
Código: [Seleccionar]
//Hasta aquí igual
draw_vertex(xx, yy);
var i;
for (i=a1; i<=a2; i+= a3) draw_vertex(xx + lengthdir_x(r, i), yy + lengthdir_y(r, i));
if (argument6) draw_vertex(xx, yy);
//Desde aquí igual


Desconectado Clamud

Respuesta #2 en: Abril 12, 2016, 04:55:16 am
Sí, es una buena alternativa, hace tiempo que escribí el script, supongo que decidí usar un while para ahorrarme el var i  :P
En los dos casos se debe escribir el draw_vertex después del ciclo.
También es preferible que el barrido se haga desde a2 hasta a1, porque en ese punto a2 es mayor que a1, entonces los vértices se agregan en el sentido de las manecillas del reloj, y no hay problema si se usa d3d_set_culling(true).