https://foro.gambas-es.org/viewtopic.php?f=1&t=2775
-----------------------------------
guadafan
Domingo, 16 Diciembre 2012, 18:07

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?

[code linenumbers=false syntax=gambas]
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
[/code]


-----------------------------------
Shell
Lunes, 17 Diciembre 2012, 10:10

Re: Efecto Persiana
-----------------------------------
Hola guadafan.

Prueba esto:

[code linenumbers=false syntax=gambas]
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
[/code]

El objeto temporizador puedes hacerlo local.

Saludos.


-----------------------------------
guadafan
Lunes, 17 Diciembre 2012, 22:49

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?


-----------------------------------
Shell
Martes, 18 Diciembre 2012, 12:15

Re: Efecto Persiana
-----------------------------------
[quote user="guadafan" post="15744"]No entiendo muy bien lo que has hecho. ¿El temporizador marca el ritmo de bajada?  [/quote]

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.

[quote user="guadafan" post="15744"] ¿Cómo podría variar su velocidad gradualmente para acelerarlo para que hiciera más una caída que una bajada a velocidad constante?[/quote]

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


-----------------------------------
guadafan
Martes, 18 Diciembre 2012, 17:18

Re: Efecto Persiana
-----------------------------------
oOOoh! Qué chulo!, lo estudiaré a ver qué saco en claro.
Gracias.


-----------------------------------
jsbsan
Martes, 18 Diciembre 2012, 17:33

Re: Efecto Persiana
-----------------------------------
[quote]¿Cómo podría variar su velocidad gradualmente para acelerarlo para que hiciera más una caída que una bajada a velocidad constante?[/quote]

Supongo, que si quieres una "caida libre" tienes que usar para el desplazamiento en el eje Y, la ecuacion:

[img]http://upload.wikimedia.org/math/a/2/3/a231c8ec54c1b0fc986fe61e7423c898.png[/img]

donde:
    d: indica cuando se desplaza en la coordenada Y, 
    g: gravedad 9.81
   t: tiempo, definido en el temporizador.delay


Enlace: [url=http://es.wikipedia.org/wiki/Ecuaciones_para_un_cuerpo_en_ca%C3%ADda_libre]http://es.wikipedia.org/wiki/Ecuaciones_para_un_cuerpo_en_caida_libre


-----------------------------------
guadafan
Martes, 18 Diciembre 2012, 18:38

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
Martes, 18 Diciembre 2012, 18:47

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  :roll:


-----------------------------------
jsbsan
Martes, 18 Diciembre 2012, 23:03

Re: Efecto Persiana
-----------------------------------
[quote]a) Haciendo que en cada pixel el wait sea proporcionalmente un poco mayor.[/quote]
No, ya que la relacion no es proporcional, sino es una potencia (tiempo elevado a 2)

[quote]
..... wait.
(para conseguir un movimiento sin trompicones, se entiende)
[/quote]

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)

[quote]Esto parece más cosa de videojuegos que de aplicaciones de escritorio, la verdad [/quote]
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: [url=http://es.wikipedia.org/wiki/Fotograma]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.


-----------------------------------
Dani26
Miercoles, 19 Diciembre 2012, 02:03

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 [b]* 25[/b])
[code linenumbers=false syntax=gambas]
Public Sub Timer1_Timer()
  
  tiempo += Timer1.Delay
  
  Me.y = (tiempo ^ 2) / (Slider1.value * 25)
  If Me.y > Screen.Height Then Timer1.Stop
  
End
[/code]

Quizá ayude al compañero Guadafan a conseguir el efecto deseado,jugando con dicho factor.
Saludos ;-)


-----------------------------------
guadafan
Miercoles, 19 Diciembre 2012, 11:42

Re: Efecto Persiana
-----------------------------------
Estoy jugando con los valores para ver qué se amolda mejor a lo que tenía en mente, pero lo que está claro es que así sí que se consigue un movimiento acelerado.
Muchas gracias.


-----------------------------------
Shell
Miercoles, 19 Diciembre 2012, 13:53

Re: Efecto Persiana
-----------------------------------
Hola!.

Este ejemplo es para verlo,entenderlo y mejorarlo.  :roll: 

Es casi como el de los botones pero aplicados a formularios y usa un timer por cada objeto.

Fijaros que a veces acelera. Es extraño el efecto que hace.

Saludos.


-----------------------------------
jsbsan
Miercoles, 19 Diciembre 2012, 16:18

Re: Efecto Persiana
-----------------------------------
Dani26:
[quote]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.[/quote]
Sin problemas, lo has mejorado.... ahora parece más real  :mryellow:  :mryellow:  

 Esto es el softwarelibre, compartir, añadir y mejorar lo que han hecho otros para beneficios de todos.... :!:  :!: 

Shell:
Es interesante el ejemplo, sobre todo el tema de crear la clase ClassParacaida que hereda de formulario... pero no me gusta lo que usa para calcular la bajada..
[quote]    Me.Y = Me.Y + 1[/quote]
lo suyo es aplicar alguna ecuación que haga la simulación.... he encontrado esto:
[url=http://www.sc.ehu.es/sbweb/fisica/dinamica/paracaidista/paracaidista.html]http://www.sc.ehu.es/sbweb/fisica/dinamica/paracaidista/paracaidista.html

el tema tiene mucha miga  :lol:  :lol:  :lol:  !!!


-----------------------------------
Shell
Miercoles, 19 Diciembre 2012, 23:58

Re: Efecto Persiana
-----------------------------------
Julio:
[quote user="jsbsan" post="15757"]
Shell:
Es interesante el ejemplo, sobre todo el tema de crear la clase ClassParacaida que hereda de formulario... pero no me gusta lo que usa para calcular la bajada..
[/quote]   

[quote] Me.Y = Me.Y + 1[/quote]

Es sencillo. ;-)
Es cambiable, podemos añadirle mas valores.Imagina que añades en vez de 1,pues un valor entre un rango aleatorio, entre cada llamada al timer.

Lo extraño era el atraso o el adelanto que tenían "las paracaidistas".
Que parece que aceleraban en determinados momentos. En casa con un equipo mas rápido se aprecia mas.

[quote user="jsbsan" post="15757"]
lo suyo es aplicar alguna ecuación que haga la simulación.... he encontrado esto:
[url=http://www.sc.ehu.es/sbweb/fisica/dinamica/paracaidista/paracaidista.html]http://www.sc.ehu.es/sbweb/fisica/dinamica/paracaidista/paracaidista.html

el tema tiene mucha miga  :lol:  :lol:  :lol:  !!![/quote]

 :mryellow: 

Pues si que tiene formulas.Las simulaciones no son a veces tan parecidas a la realidad.Sobre todo con las formulas,
cuando queremos representarlas. Depende mucho de los medios que tengamos. No es lo mismo hacerlo  con un formulario
que dentro de un DrawingArea.

La idea de  hacerlo con un componente u otro decidirá un resultado mejor o peor, dentro de las posibilidades que nos da
el lenguaje , nuestros conocimientos y el resultado que queramos obtener.

La simulación por ordenador tiene que ser un estudio bien grande.


Saludos.


