Agosto 06, 2012, 07:24:22 PM Ultima modificación: Agosto 06, 2012, 10:47:51 PM por Mgbu
Primero pongo la imagen:


Lo verde es justo lo que quiero hacer, es para un juego en donde quiero mostrar el rango de ataque de un enemigo (punto rojo). ¿Alguien vio esto alguna vez?
O sea que es un circulo relleno pero sin pintar las partes tapadas por paredes, se entiende

Se me ocurrio hacerlo con muchas lineas que salgan del centro hacia todas direcciones y que cada linea haga un chequeo con un for de hasta donde llega sin chocar una pared, no me parece vieble por los recursos que consume, no?

Como en mi juego el punto rojo en mi caso es estático podría dibujarlo y cargarlo como imagen, pero no me parece viable dibujar eso como 30 veces

EDIT: Ahi le puse icono, siempre me olvido :S
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


#1 Agosto 06, 2012, 11:12:46 PM Ultima modificación: Agosto 06, 2012, 11:15:09 PM por Texic
Te hice un ejemplo como pude, tiene un rendimiento bastante aceptable, me costó un poco de trabajo, pero creo que quedó optimizado como para incluirlo en un juego




Muy bueno, se ve mejor que hacer muchas lineas XD
Me parece que va a ir bien, si va mal en la opcion de graficos bajos lo desactivo jaja

Voy a estar viendo como funciona, cualquier cosa pregunto
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


Tengo el problema que se me dibuja todo 100 pixeles corrido hacia abajo o algo así, seguramente tiene relacion con lo de las surfaces, es como si se siguiera dibujando en surfaces. Nuna usé surfaces y parece que esa es la causa
¿Es un error comun ?¿Como lo corrijo?

Acá va el codigo, esta casi igual que el que me diste:
[gml]
surface_set_target(sur)
draw_clear_alpha(c_white,0)
draw_circle(100,100,100,0)
draw_set_blend_mode(bm_subtract)
col=collision_circle(x,y,100,obj_pared,1,1)
while col<>-4
{
dir1=point_direction(x,y,col.c1[1,1],col.c1[1,2])
dir2=point_direction(x,y,col.c1[2,1],col.c1[2,2])
dir3=point_direction(x,y,col.c1[3,1],col.c1[3,2])
dir4=point_direction(x,y,col.c1[4,1],col.c1[4,2])
mxdir=max(dir1,dir2,dir3,dir4)
mndir=min(dir1,dir2,dir3,dir4)
if mxdir=dir1 {cx=col.c1[1,1] cy=col.c1[1,2]}
if mxdir=dir2 {cx=col.c1[2,1] cy=col.c1[2,2]}
if mxdir=dir3 {cx=col.c1[3,1] cy=col.c1[3,2]}
if mxdir=dir4 {cx=col.c1[4,1] cy=col.c1[4,2]}
if mndir=dir1 {mx=col.c1[1,1] my=col.c1[1,2]}
if mndir=dir2 {mx=col.c1[2,1] my=col.c1[2,2]}
if mndir=dir3 {mx=col.c1[3,1] my=col.c1[3,2]}
if mndir=dir4 {mx=col.c1[4,1] my=col.c1[4,2]}
cx=cx-x+100
cy=cy-y+100
mx=mx-x+100
my=my-y+100
lnx=100+lengthdir_x(200,mxdir)
lny=100+lengthdir_y(200,mxdir)
draw_triangle(cx,cy,mx,my,lnx,lny,0)
draw_triangle(lnx,lny,mx,my,100+lengthdir_x(200,mndir),100+lengthdir_y(200,mndir),0)
ds_list_add(colisions,col)
ds_list_add(masks,col.mask_index)
col.mask_index=spr_mouse_null //Un sprite que ya tenía que no tiene máscara
col=collision_circle(x,y,100,obj_pared,1,1)
}
for (i=0;i<=ds_list_size(colisions)-1;i+=1) {(ds_list_find_value(colisions,i)).mask_index=ds_list_find_value(masks,i)}
ds_list_clear(colisions)
ds_list_clear(masks)
draw_set_blend_mode(bm_normal)
surface_reset_target()
draw_surface_ext(sur,x-100,y-100,1,1,0,c_white,0.5)
[/gml]
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


La sprite está centrada? Sino hay q agregar un par de cálculos con el orígen del sprite
De última pasame un ejemplo y lo veo a ver q onda




Acá te adjunté el juego
Es raro, porque pruebo sin la funcion "surface_reset_target()" y obtengo un resultado distinto, tambien es distinto si no pongo "surface_set_target(sur)"

El objeto que dibuja el efecto es una torreta: "obj_ai_2", lo puse en la raiz del arbol de recursos
Pero todo lo que me diste lo puse en el Script "scr_dibujar_rango_ai_2" que es llamado por la torreta, tambien lo puse en la raiz del arbol de recursos para que te sea facil encontrarlo

Para probar el juego apreta enter nada mas, vas a ver que casi todo se dibuja 64 pixeles más abajo, Si prestas atencion vas a ver que el error está en todo lo que se dibuja arriba, es decir lo que tiene un depth menor a la torreta. Lo raro tambien es que no se mueve con la view :-\
También te adjunté una foto, viendo lo corrido que se dibujan los tiles tiene pinta de error de GM, no le encuentro explicación
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


Ahh, ya está, era porque había puesto todos los cálculos de las surfaces en el evento draw (nunca se dibuja sobre una surface en el evento draw, NUNCA)

PD: Feliz cumpleaños  :)




Que buen regalo de compleaños XD, de verdad gracias :D
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy