DIV ARENA FORUMS

¿Como limpiar el fondo de un map? - new_map

daltomi - 9-2-2022 at 12:36 AM

Hola a todos.
hi

Estoy dibujando una animación desde un spritesheet:
I am drawing an animation from a spritesheet:

tiki.png - 4kB

Pasos resumidos:
Summary steps:

Creo un nuevo map que será el área de animación.
I create a new map that will be the animation area.
1)
Code:
aim[i].map = new_map(...)

2) luego lo dibujo:
I then draw it with:

Code:
function draw_anim(i) private srcx = 0; srcy = 0; begin father.graph = anim[i].map; srcx = anim[i].x + (anim[i].current % anim[i].columns) * anim[i].w; srcy = anim[i].y + (anim[i].current / anim[i].columns) * anim[i].h; map_block_copy(0, anim[i].map, 0, 0, anim[i].gid, srcx, srcy, anim[i].w, anim[i].h); end


Todo perfecto!, puedo dibujar cualquier animación :)
All perfect!, I can draw any animation

:( El problema es que al momento de dibujar no se borra lo anterior dibujado(dentro del map):
The problem is that at the time of drawing the previous drawing is not deleted(inside the map):

See Gif animate

aasasas.png - 5kB


La única solución que encontré es limpiar el área del map antes de dibujarlo otr vez:
The only solution I found is to clear the map area before drawing it again:

Code:
function clear_anim(i) private xx = 0; yy = 0; begin for (yy=0; yy < anim[i].h; yy++) for (xx=0; xx < anim[i].w; xx++) map_put_pixel(0, anim[i].map, xx, yy, 0); end end end


See Gif animate

Finalmente mi pregunta: ¿existe otra manera de limpiar el map? porque me preocupa que la función map_put_pixel se "muy costosa" y puede existir otra manera.
Finally my question: is there another way to clean the map? because I am concerned that the map_put_pixel function will be "too expensive" and there may be another way.

Gracias!!



[Edited on 9-2-2022 by daltomi]

MikeDX - 9-2-2022 at 04:46 PM

Quote: Originally posted by daltomi  

Finally my question: is there another way to clean the map? because I am concerned that the map_put_pixel function will be "too expensive" and there may be another way.

Gracias!!

[Edited on 9-2-2022 by daltomi]


The easiest way to do this is clear. you can do this two ways.

First you could create a black (not transparent) graph in the fpg and copy this.

The other way is to create a map and copy this to the frame instead.

The proper way of doing this is to "cut" the spritesheet out and insert them as frames into the fpg, then you can just change the graph id and no copy / clear is needed :)

daltomi - 9-2-2022 at 10:04 PM

Hi Mike!
Yes, I am going to do it as you say, with the graph ids because cleaning with the map would not be a viable option with the overlay (yes, I just added one more complexity to my original question, sorry :) )

Instead by clearing with 'map_put_pixel' it can be overlaid.
Thanks for answering, regards.

Edit:I can't upload the images to display, but it doesn't matter.







[Edited on 9-2-2022 by daltomi]

mapclean.jpg - 59kBmap_put_pixel.jpg - 50kB

Vortigano - 16-2-2022 at 01:27 PM

Hola, linda animación. :)

Vortigano - 22-2-2022 at 11:59 AM

Hola, estuve analizando el código, y te puedo sugerir algunas cosas que tal vez te puedan servir.
Code:
anim[i].map

Es basicamente un buffer para usar en el frame, y borrarlo usando for anidados es lento. En lugar de eso crear un buffer nuevo podría ser un poco más rápido que acceder pixel a pixel para borrarlo.

Tal vez probaría escribir algo así:
Code:
function draw_anim(i) private srcx = 0; srcy = 0; begin //****realmente esto no es una operación de animacion o de dibujado //****es preparar el lienzo o buffer antes de dibujarlo, //****por lo tanto deberia estar ubicado fuera de draw_anim //father.graph = anim[i].map; //****verifica si ya existe algun identificador numérico asociado a anim[i].map //****si así es, lo descarga de la memoria if(anim[i].map!=0) unload_map(anim[i].map); end //****crea un nuevo mapa o región o buffer para dibujar que ya es transparente father.graph = anim[i].map = new_map(...); srcx = anim[i].x + (anim[i].current % anim[i].columns) * anim[i].w; srcy = anim[i].y + (anim[i].current / anim[i].columns) * anim[i].h; map_block_copy(0, anim[i].map, 0, 0, anim[i].gid, srcx, srcy, anim[i].w, anim[i].h); end


Code:
function clear_anim(i) private xx = 0; yy = 0; begin //**** tal vez podria poner la operacion de generar un nuevo map para anim[].map aquí //for (yy=0; yy < anim[i].h; yy++) // for (xx=0; xx < anim[i].w; xx++) // map_put_pixel(0, anim[i].map, xx, yy, 0); // end //end //****verifica si ya existe algun identificador numérico asociado a anim[i].map //****si así es, lo descarga de la memoria if(anim[i].map!=0) unload_map(anim[i].map); end //****crea un nuevo mapa o región o buffer para dibujar que ya es transparente anim[i].map = new_map(...); end



Yo no me preocuparía si el numero asociado a anim.map cambia frame a frame como "número mágico", ya que uso el nombre de la variable y ya está.

Saludos.

Vortigano - 22-2-2022 at 12:11 PM

Bueno, en realidad sí me preocuparía si algun proceso o bloque de código tiene el valor desactualizado de anim[].map e intenta acceder, lo cual causaría algún un crash.
Pero yo creo que si actualizas todas las referencias a anim[].map que ha cambiado a cada llamada, antes (ver variable local PRIORITY), no debería existir problemas y creo que sería más rápido en ejecución que la solución con for anidados.

Saludos.

daltomi - 23-2-2022 at 03:37 AM

Hola @Vortigano :)
Gracias por tus consejos, los voy a tener muy en cuenta.
Me detuve con este tema porque encontré documentación de DIV en formato pdf y me los estoy leyendo todos :lol:
Primero el manual, pero también una revista DIV-manía que encontré en un grupo de Telegram: https://t.me/Divlikes

Otro tema, no activé la casilla de recibir un e-mail cuando me responden, ahora la activo ;)

Saludos y gracias!.

Vortigano - 23-2-2022 at 11:30 AM

No hay problema, lo importante es que puedas lograr tu objetivo.

Añado a lo anterior, un paso más avanzado sería usar referencias con punteros div, pero por ahora tal vez te conviene probar con lo que te mostré.

La ventaja de usar referencias (punteros) es que no necesitas andar actualizando en cada lugar donde necesitas acceder a los datos.
Podés encontrar información al respecto en la misma ayuda de div2 la del formato pdf y lo que haya en las revistas de telegram.

También hay una versión de la ayuda de div2 en formato web para uso local. Creo que fue hecha por los del proyecto cdiv, un proyecto antiguo que ya murió de usar lenguaje div en lenguaje C + allegro4.
La usamos mucho las personas que usamos Gemix que es una evolución/modernización del lenguaje div2 con muchas caracteristicas más modernas y compatibilidad con div2 clásico. Podés encontrarla en el foro de Gemix.

Saludos.