Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

Efecto Persiana

Efecto Persiana
Artículo
Responder citando    Descargar mensaje  
Mensaje 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?

Public Sub Form_Open()

Dim t As Float
Dim g As Float
Dim v As Float
Dim ancho As Float
Dim alto As Float

Me.y = 10
Me.x = 80
ancho = Screen.Width / 3
alto = Screen.Height / 3
Me.Height = 1
Me.Width = ancho

Me.Show

g = 10
t = 0

While Me.Height < alto
  t = t + 0.1
  Wait 0.01
  Me.height = Me.Height + (1 / 2) * g * t ^ 2
Wend

End
 




 
última edición por guadafan el Domingo, 16 Diciembre 2012, 18:07; editado 1 vez 
guadafan - Ver perfil del usuario Enviar mensaje privado  
guadafan [ Domingo, 16 Diciembre 2012, 18:07 ]
 


Efecto Persiana
Comentarios
Responder citando    Descargar mensaje  
Mensaje Re: Efecto Persiana 
 
Hola guadafan.

Prueba esto:

Private alto As Integer
Private temporizador As New Timer As "tiempo"

Public Sub Form_Open()

Dim ancho As Integer
'temporizador = New Timer As "tiempo"

ancho = Screen.Width / 3
alto = Screen.Height / 3

With Me  
  .y = 100
  .x = 100
  .Height = 1
  .Width = ancho      
End With
temporizador.Delay = 50
temporizador.Start

End

Public Sub tiempo_Timer()
    If Me.Height < alto Then
      Inc Me.Height
    Else
      temporizador.Stop
    Endif
End
 


El objeto temporizador puedes hacerlo local.

Saludos.



 
última edición por Shell el Lunes, 17 Diciembre 2012, 10:12; editado 2 veces 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Lunes, 17 Diciembre 2012, 10:10 ]
Responder citando    Descargar mensaje  
Mensaje 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?



 
guadafan - Ver perfil del usuario Enviar mensaje privado  
guadafan [ Lunes, 17 Diciembre 2012, 22:49 ]
Responder citando    Descargar mensaje  
Mensaje Re: Efecto Persiana 
 
guadafan escribió: [Ver mensaje]
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.

guadafan escribió: [Ver mensaje]
¿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

MueveObjeto.tar.gz
Descripción:  
Descargar
Nombre del archivo: MueveObjeto.tar.gz
Tamaño: 5.91 KB
Descargado: 56 veces
MueveObjeto.tar.gz
Descripción:  
Descargar
Nombre del archivo: MueveObjeto.tar.gz
Tamaño: 5.91 KB
Descargado: 56 veces
MueveObjeto.tar.gz
Descripción:  
Descargar
Nombre del archivo: MueveObjeto.tar.gz
Tamaño: 5.91 KB
Descargado: 56 veces




 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Martes, 18 Diciembre 2012, 12:15 ]
Responder citando    Descargar mensaje  
Mensaje Re: Efecto Persiana 
 
oOOoh! Qué chulo!, lo estudiaré a ver qué saco en claro.
Gracias.



 
guadafan - Ver perfil del usuario Enviar mensaje privado  
guadafan [ Martes, 18 Diciembre 2012, 17:18 ]
Responder citando    Descargar mensaje  
Mensaje 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:

a231c8ec54c1b0fc986fe61e7423c898

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 
jsbsan - Ver perfil del usuario Enviar mensaje privado  
jsbsan [ Martes, 18 Diciembre 2012, 17:33 ]
Responder citando    Descargar mensaje  
Mensaje 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.



 
guadafan - Ver perfil del usuario Enviar mensaje privado  
guadafan [ Martes, 18 Diciembre 2012, 18:38 ]
Responder citando    Descargar mensaje  
Mensaje 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 
guadafan - Ver perfil del usuario Enviar mensaje privado  
guadafan [ Martes, 18 Diciembre 2012, 18:47 ]
Responder citando    Descargar mensaje  
Mensaje 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.

Caida-0.0.1.tar.gz
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: 53 veces
Caida-0.0.1.tar.gz
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: 53 veces
Caida-0.0.1.tar.gz
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: 53 veces




 
jsbsan - Ver perfil del usuario Enviar mensaje privado  
jsbsan [ Martes, 18 Diciembre 2012, 23:03 ]
Responder citando    Descargar mensaje  
Mensaje 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



 
última edición por Dani26 el Miercoles, 19 Diciembre 2012, 02:05; editado 1 vez 
Dani26 - Ver perfil del usuario Enviar mensaje privado  
Dani26 [ Miercoles, 19 Diciembre 2012, 02:03 ]
Mostrar mensajes anteriores:    
 
Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 



 

cron