Autor |
Mensaje |
guadafan
Aprendiz
Registrado: Agosto 2012
Mensajes: 81
Edad: 49 Ubicación: Alcalá de Guadaira (Sevilla)
|
Efecto Persiana
Hola, estaba intentando hacer bajar el formulario con un poco de aceleración para quitarle "robotismo" a su caída, pero aunque sale casi siempre bien, a veces solo me muestra una línea finísima arriba de la pantalla sin dejar caer el formulario.
¿Qué puede fallar en el siguiente código para que solo funcione a veces?
última edición por guadafan el Domingo, 16 Diciembre 2012, 18:07; editado 1 vez
|
#1 Domingo, 16 Diciembre 2012, 18:07 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Efecto Persiana
Hola guadafan.
Prueba esto:
El objeto temporizador puedes hacerlo local.
Saludos.
=================== Gambas Básico
"No es un bug, es una característica no documentada"
última edición por Shell el Lunes, 17 Diciembre 2012, 10:12; editado 2 veces
|
#2 Lunes, 17 Diciembre 2012, 10:10 |
|
|
guadafan
Aprendiz
Registrado: Agosto 2012
Mensajes: 81
Edad: 49 Ubicación: Alcalá de Guadaira (Sevilla)
|
Re: Efecto Persiana
No entiendo muy bien lo que has hecho. ¿El temporizador marca el ritmo de bajada? ¿Cómo podría variar su velocidad gradualmente para acelerarlo para que hiciera más una caída que una bajada a velocidad constante?
|
#3 Lunes, 17 Diciembre 2012, 22:49 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Efecto Persiana
No entiendo muy bien lo que has hecho. ¿El temporizador marca el ritmo de bajada?
Si.A menor tiempo, baja mas rápidamente. Si el valor de la propiedad delay es pequeño es demasiado brusca la bajada,
hay que encontrar un valor adecuado.
¿Cómo podría variar su velocidad gradualmente para acelerarlo para que hiciera más una caída que una bajada a velocidad constante?
Se supone que la propiedad delay es un valor fijo.Se puede cambiar esta y jugar con el procedimiento del timer.
No parece nada fácil que no sea brusca esa bajada.
Con el uso de wait he tenido mas problema que usando un timer.Objetos nulos por ejemplo
Ejemplo de desplazamiento con botones. Es parecido a uno que circula por la red.
Saludos
Descripción: |
|
Descargar |
Nombre del archivo: |
MueveObjeto.tar.gz |
Tamaño: |
5.91 KB |
Descargado: |
56 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
MueveObjeto.tar.gz |
Tamaño: |
5.91 KB |
Descargado: |
56 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
MueveObjeto.tar.gz |
Tamaño: |
5.91 KB |
Descargado: |
56 veces |
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#4 Martes, 18 Diciembre 2012, 12:15 |
|
|
guadafan
Aprendiz
Registrado: Agosto 2012
Mensajes: 81
Edad: 49 Ubicación: Alcalá de Guadaira (Sevilla)
|
Re: Efecto Persiana
oOOoh! Qué chulo!, lo estudiaré a ver qué saco en claro.
Gracias.
|
#5 Martes, 18 Diciembre 2012, 17:18 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 50 Ubicación: dos hermanas, sevilla
|
Re: Efecto Persiana
Citar: ¿Cómo podría variar su velocidad gradualmente para acelerarlo para que hiciera más una caída que una bajada a velocidad constante?
Supongo, que si quieres una "caida libre" tienes que usar para el desplazamiento en el eje Y, la ecuacion:
donde:
d: indica cuando se desplaza en la coordenada Y,
g: gravedad 9.81
t: tiempo, definido en el temporizador.delay
Enlace: http://es.wikipedia.org/wiki/Ecuaciones_para_un_cuerpo_en_caida_libre
última edición por jsbsan el Martes, 18 Diciembre 2012, 17:54; editado 1 vez
|
#6 Martes, 18 Diciembre 2012, 17:33 |
|
|
guadafan
Aprendiz
Registrado: Agosto 2012
Mensajes: 81
Edad: 49 Ubicación: Alcalá de Guadaira (Sevilla)
|
Re: Efecto Persiana
Sí, la ecuación de la caída libre es lo primero que probé, pero me hice la picha un lío porque ya que en el ordenador es distinto a la realidad, los metros serían píxeles y el tiempo es algo que va como a pequeños "trozos", creo que habría que cambiar la aceleración con otro valor para conseguir la sensación de una caída suave (ya sea acelerada o desacelerada) en un programa.
|
#7 Martes, 18 Diciembre 2012, 18:38 |
|
|
guadafan
Aprendiz
Registrado: Agosto 2012
Mensajes: 81
Edad: 49 Ubicación: Alcalá de Guadaira (Sevilla)
|
Re: Efecto Persiana
¿Cómo creéis que se conseguirán mejores resultados
a) Haciendo que en cada pixel el wait sea proporcionalmente un poco mayor.
b) Haciendo que el objeto salte proporcionalmente más pixeles en cada wait.
?
(para conseguir un movimiento sin trompicones, se entiende)
REEDITADO: Esto parece más cosa de videojuegos que de aplicaciones de escritorio, la verdad
última edición por guadafan el Martes, 18 Diciembre 2012, 18:49; editado 1 vez
|
#8 Martes, 18 Diciembre 2012, 18:47 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 50 Ubicación: dos hermanas, sevilla
|
Re: Efecto Persiana
Citar: a) Haciendo que en cada pixel el wait sea proporcionalmente un poco mayor.
No, ya que la relacion no es proporcional, sino es una potencia (tiempo elevado a 2)
Citar:
..... wait.
(para conseguir un movimiento sin trompicones, se entiende)
Yo no usaria un wait (que lo que hace es parar la ejecucion del programa el tiempo que le digas, no dejandote ejecutar mas), lo suyo es usar un control timer, que cada vez que se dispare, dibuje el formulario... y asi puedes estar ejecutando otra parte de tu programa. (asi es como lo hago en los juegos que he realizado)
Citar: Esto parece más cosa de videojuegos que de aplicaciones de escritorio, la verdad
Estas haciendo una animación... y por lo tanto... tienes que dar la sensación de movimiento al ojo humano... para ello lo que se hace en las peliculas es cada segundo emitir 24 fotogramas y asi "da la sensación" de movimiento... tu tienes que hacer el programa de forma parecida. Tienes que redibujar cada 1/24 segundos (0.041 segundos) un fotograma (en tu caso tu formulario) en tu pantalla, y asi parecerá que se produce movimiento "sin trompicones"...
Mirate esto: Fotogramas por Segundo
He hecho un pequeño código, y creo que consigo lo que quieres...
He puesto un coeficiente (que puedes alterar con un control Slider) en la ecuación del movimiento del eje Y, para ver como se puede acelerar o desacelerar el movimiento.
Descripción: |
Ejemplo de Caida libre de un formulario. |
Descargar |
Nombre del archivo: |
Caida-0.0.1.tar.gz |
Tamaño: |
19.59 KB |
Descargado: |
52 veces |
Descripción: |
Ejemplo de Caida libre de un formulario. |
Descargar |
Nombre del archivo: |
Caida-0.0.1.tar.gz |
Tamaño: |
19.59 KB |
Descargado: |
52 veces |
Descripción: |
Ejemplo de Caida libre de un formulario. |
Descargar |
Nombre del archivo: |
Caida-0.0.1.tar.gz |
Tamaño: |
19.59 KB |
Descargado: |
52 veces |
|
#9 Martes, 18 Diciembre 2012, 23:03 |
|
|
Dani26
Analista Programador
Registrado: Junio 2010
Mensajes: 365
Edad: 58 Ubicación: Montevideo
|
Re: Efecto Persiana
Julio, me he tomado el atrevimiento de hacerle una pequeña modificación a tu código que hace que baje un poco más lento de acuerdo al coeficiente por el que multiplicas al divisor, el movimiento se ve bastante fluido y no "cae" tan de golpe.
La línea modificada es Me.y = (tiempo ^ 2) / (Slider1.value * 25)
Public Sub Timer1_Timer()
tiempo += Timer1.Delay
Me.y = (tiempo ^ 2) / (Slider1.value * 25)
If Me.y > Screen.Height Then Timer1.Stop
End
Quizá ayude al compañero Guadafan a conseguir el efecto deseado,jugando con dicho factor.
Saludos
=================== Migrando desde visual basic, el Gambas de Ms
Mi blog gambero
última edición por Dani26 el Miercoles, 19 Diciembre 2012, 02:05; editado 1 vez
|
#10 Miercoles, 19 Diciembre 2012, 02:03 |
|
|
|