daltomi
DIV Newbie
Posts: 4
Registered: 8-2-2022
Member Is Offline
|
|
¿Como limpiar el fondo de un map? - new_map
Hola a todos.
hi
Estoy dibujando una animación desde un spritesheet:
I am drawing an animation from a spritesheet:
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
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
|
|
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
DIV Newbie
Posts: 4
Registered: 8-2-2022
Member Is Offline
|
|
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]
|
|
Vortigano
DIV Regular
Posts: 237
Registered: 12-1-2017
Location: Ciudad de Buenos Aires, Argentina
Member Is Offline
|
|
Hola, linda animación.
|
|
Vortigano
DIV Regular
Posts: 237
Registered: 12-1-2017
Location: Ciudad de Buenos Aires, Argentina
Member Is Offline
|
|
Hola, estuve analizando el código, y te puedo sugerir algunas cosas que tal vez te puedan servir.
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
DIV Regular
Posts: 237
Registered: 12-1-2017
Location: Ciudad de Buenos Aires, Argentina
Member Is Offline
|
|
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
DIV Newbie
Posts: 4
Registered: 8-2-2022
Member Is Offline
|
|
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
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
DIV Regular
Posts: 237
Registered: 12-1-2017
Location: Ciudad de Buenos Aires, Argentina
Member Is Offline
|
|
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.
|
|