Application.SetRedraw de mierda!

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Hola buenas tardes :troll-1414023002:
Bueno, como podrán saber, para cambiarle la posición a varios objetos se usa Application.SetRedraw() para que no se vea 1 a 1 como cambia su ubicación, bueno, pues lo mismo quise hacer para Page.SetObjectZOrder() y Image.SetOpacity() pero la imagen desaparece hasta que se vuelve ver hasta que se active el Redraw
Pruébenlo ustedes mismos:

Image1 > On Click
Application.SetRedraw(false);
Page.SetObjectZOrder("Image1", ZORDER_FRONT, "");
Page.SetObjectZOrder("Image1", ZORDER_FRONT, "");
Page.SetObjectZOrder("Image1", ZORDER_FRONT, "");
Page.SetObjectZOrder("Image1", ZORDER_FRONT, "");
Page.SetObjectZOrder("Image1", ZORDER_FRONT, "");
Application.SetRedraw(true);
Se supone que el Application.SetRedraw esta desactivado, por lo que no debería cambiar nada hasta que se active, pero la imagen desaparece y vuelve a aparecer cuando se activa el Redraw :pokerface-1414090721:

OJO: Se viene la pregunta...
Como hago esto sin que desaparezca la imagen?
tiene sentido, cuando quitas el redraw y cambias el z-order, basicamente envias un redibujado al control, el redibujado esta desactivado asi que es normal que quede blanco hasta que lo actives nuevamente.

normalmente el uso de estas funciones es bastante marginal... no aconsejaria intentar hacer animaciones con el sistema de ventanas de windows ya que es muy pesado y los tiempos entre frames pueden ser muy altos, asi que el resultado es tirando a pobre.

si lo que estas intentando hacer es como un sprite, pronto subire un object plugin para hacer sprites que usa D3D9
Pabloko escribió:
17 Mar 2021 00:08
tiene sentido, cuando quitas el redraw y cambias el z-order, basicamente envias un redibujado al control, el redibujado esta desactivado asi que es normal que quede blanco hasta que lo actives nuevamente.

normalmente el uso de estas funciones es bastante marginal... no aconsejaria intentar hacer animaciones con el sistema de ventanas de windows ya que es muy pesado y los tiempos entre frames pueden ser muy altos, asi que el resultado es tirando a pobre.

si lo que estas intentando hacer es como un sprite, pronto subire un object plugin para hacer sprites que usa D3D9
Te dejo un video para que aprecies el efecto:


Tuve que agregar un Application.Sleep(100) para que lo apreciaras a velocidad normal. El Application.SetRedraw() lo uso para que no se aprecie como suben los objetos 1 por 1, pero como ya puedes ver, la pantalla parpadea :wat-1414024905: Sería bueno que se pueda especificar el Z-Order antes de crear el objeto, tal vez algo así:
tblImageProps.ZOrder = ZORDER_INSERT_BEHIND;
tblImageProps.ZOrderReferenceObject = "Titlebar";
De esta manera se crearía detrás de la barra de título, o también sería bueno que se pudiera establecer el Z-Order a múltiples objetos conforme se hayan escrito, algo así:
local tblObjects = {};
tblObjects[1] = "Titlebar";
tblObjects[2] = "Title";
tblObjects[3] = "Logo";
Page.SetObjectZOrder(tblObjects, ZORDER_FRONT, "");
De igual manera te dejo el APZ del ejemplo mostrado en el video:
https://www.mediafire.com/file/yy72goaj ... w.apz/file

Espero se pueda solucionar, espero tu respuesta. De antemano gracias :penguin:
Pabloko escribió:
17 Mar 2021 00:08
tiene sentido, cuando quitas el redraw y cambias el z-order, basicamente envias un redibujado al control, el redibujado esta desactivado asi que es normal que quede blanco hasta que lo actives nuevamente.

normalmente el uso de estas funciones es bastante marginal... no aconsejaria intentar hacer animaciones con el sistema de ventanas de windows ya que es muy pesado y los tiempos entre frames pueden ser muy altos, asi que el resultado es tirando a pobre.

si lo que estas intentando hacer es como un sprite, pronto subire un object plugin para hacer sprites que usa D3D9
Con respecto al plugin de sprites... Estaría genial que soportara atlas de texturas! llevo 1 semana buscando algo así
jaja buen video :awesome-1417754492:

te pasa lo mismo que la primera explicación que te di, cuando desactivas el redraw, es global, cuando haces cambios en el z order de un objeto, generalmente se va a mandar un redibujado general y por eso desaparecen cosas hasta que reactivas el redibujado.

el problema aqui, es que mezclamos 2 cosas, objetos windowed y objetos windowless, supongo que Image es windowless, todos los objeos windowless reciben periodicamente eventos de repaint por lo que desactivar el redibujado y hacer un cambio en un objeto windowed (label es un static) se manda un evento que se llama invalidación, es en ese momento cuando te hace el flick del color blanco.


veo el problema dificil de localizar porque interviene el core del sistema de ordenacion de ams, lo que haria yo en tu situacion es calcular los elementos necesarios para llenar la pantalla y multiplicarlo por 2, crear esos elementos y luego solo hay que actualizarlos durante el scroll y reubicarlos, asi consigues un efecto de scroll infinito con un numero pequeño y manejable de objetos.

en cuanto al plugin sprites, si es parecido a un atlas pero lineal en horizontal o vertical, esto es un ejemplo



lo bueno es que no consume nada en cpu y refresca muy rapido, ahi hay 4 sprites, aparte tengo un renderizador de fuentes en modo atlas, que podria servir para hacer un plugin de sprites con atlas

estos sprites son faciles de hacer con software como jknobman https://www.g200kg.com/jp/software/knobman.html
y aparte hay muchos ya hechos para experimentar https://www.g200kg.com/en/webknobman/gallery.php

Imagen
Pabloko escribió:
18 Mar 2021 05:49
jaja buen video :awesome-1417754492:

te pasa lo mismo que la primera explicación que te di, cuando desactivas el redraw, es global, cuando haces cambios en el z order de un objeto, generalmente se va a mandar un redibujado general y por eso desaparecen cosas hasta que reactivas el redibujado.

el problema aqui, es que mezclamos 2 cosas, objetos windowed y objetos windowless, supongo que Image es windowless, todos los objeos windowless reciben periodicamente eventos de repaint por lo que desactivar el redibujado y hacer un cambio en un objeto windowed (label es un static) se manda un evento que se llama invalidación, es en ese momento cuando te hace el flick del color blanco.


veo el problema dificil de localizar porque interviene el core del sistema de ordenacion de ams, lo que haria yo en tu situacion es calcular los elementos necesarios para llenar la pantalla y multiplicarlo por 2, crear esos elementos y luego solo hay que actualizarlos durante el scroll y reubicarlos, asi consigues un efecto de scroll infinito con un numero pequeño y manejable de objetos.

en cuanto al plugin sprites, si es parecido a un atlas pero lineal en horizontal o vertical, esto es un ejemplo



lo bueno es que no consume nada en cpu y refresca muy rapido, ahi hay 4 sprites, aparte tengo un renderizador de fuentes en modo atlas, que podria servir para hacer un plugin de sprites con atlas

estos sprites son faciles de hacer con software como jknobman https://www.g200kg.com/jp/software/knobman.html
y aparte hay muchos ya hechos para experimentar https://www.g200kg.com/en/webknobman/gallery.php
Gracias :rofl: lo solucione agregando esto al final del código (del botón que crea los objetos):
Application.SetRedraw(false);
local TitlebarProps = Image.GetProperties("Titlebar");
local TitleProps = Label.GetProperties("Title");
local LogoProps = Image.GetProperties("Logo");

Page.DeleteObject("Titlebar");
Page.DeleteObject("Title");
Page.DeleteObject("Logo");
Page.CreateObject(OBJECT_IMAGE, "Titlebar", TitlebarProps);
Page.CreateObject(OBJECT_LABEL, "Title", TitleProps);
Page.CreateObject(OBJECT_IMAGE, "Logo", LogoProps);
Application.SetRedraw(true);
De manera que se congela la pantalla, elimina y vuelve a crear los objetos con las mismas propiedades y luego la refresca, así ya no se nota como sube 1 por 1:


También te dejo el APZ:
https://www.mediafire.com/file/1iy3v3oz ... x.apz/file
:handshake: