• Lunes 29 de Abril de 2024, 01:46

Autor Tema:  Mover Un Control En Tiempo De Ejecucion  (Leído 4899 veces)

Miguel Angel Rodriguez

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Mover Un Control En Tiempo De Ejecucion
« en: Miércoles 9 de Marzo de 2005, 19:08 »
0
Hola amigos, estoy con un juego de cartas, concretamente el mus,(Ya se que está hecho, pero a mi me entretiene), las cartas las tengo en un array de controles image. De momento cuando se reparten las cartas utilizo las propiedades top y left del control, con lo que las cartas me aparecen en las posiciones prefijadas de cada jugador. Pero esta forma de resolverlo hace que el control vaya primero al punto top indicado y luego al left. es decir primero se mueve en vertical y luego en horizontal. A mi me gustaria conseguir el efecto similar al de las cartas en el juego Spider, que de una posición determinada(del mazo de cartas), el control vaya a la posición del jugador en diagonal, dando esa sensacion de desplazamiento.
Gracias de entemano por vuestra ayuda.
Como anecdota deciros que no he encontrado a ningun jugador de mus que gane al programa. :smartass:

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re: Mover Un Control En Tiempo De Ejecucion
« Respuesta #1 en: Miércoles 9 de Marzo de 2005, 19:46 »
0
Utiliza el buscador del foro ya hay post referente al movimiento de controles en tiempo de ejecucion
El pasado son solo recuerdos, el futuro son solo sueños

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: Mover Un Control En Tiempo De Ejecucion
« Respuesta #2 en: Miércoles 9 de Marzo de 2005, 23:19 »
0
ja, curioso hoy acabo de descargar un ejemplo de eso :) :P

aqui tienes el vinculo:
soloprogramacion

 :kicking:

Miguel Angel Rodriguez

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Mover Un Control En Tiempo De Ejecucion
« Respuesta #3 en: Viernes 11 de Marzo de 2005, 18:29 »
0
gracis por el enlace. He descargado el ejemplo que dices, pero no es eso lo que necesito. En ese ejemplo los controles los mueves con el ratón a tu voluntad.
Imaginad que en un punto del codigo aparece:
imgcarta(i).top=3000
imgcarta(i).left=3500
.
.
.
.
Y varias lineas más abajo vuelve a aparecer:
imgcarta(i).top=5000
imgcarta(i).left=300,,,, y que este cambio de posición lo haga en diagonal, y a ser posible despacio, como hace el solitario spider cuando reparte cartas.
Algo asi como                move imgcarta(i) (300,5000)
Espero heberme explicado mejor ahora.
Saludos y gracias

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Mover Un Control En Tiempo De Ejecucion
« Respuesta #4 en: Sábado 12 de Marzo de 2005, 08:33 »
0
Hola Miguel Angel Rodríguez.

Lo primero que debes hacer es obtener la ecuación de la recta coreespondiente entre los dos puntos. Una vez que la tienes haz un bucle que recorra los valores para x (o y, claro) en el intervalo entre los dos puntos. Obten el valor de y para cada x mediante la ecuación punto pendiente de la recta y mueve la carta a la posición.

Algo así:
Código: Text
  1.  
  2. Option Explicit
  3.  
  4. Private Function Pendiente( _
  5. Byval x1 as Double, byval y1 as Double _
  6. ,byval x2 as Double,Byval y2 as Double) As Double
  7.     If x2 - x1 <> 0 Then
  8.         Pendiente = (y2 - y1) / (x2 - x1)
  9.     Else
  10.         Pendiente = 1
  11.     End If
  12. End Function
  13.  
  14. Private Function PuntoPendiente_Get_Y( _
  15. Byval x1 as Double, byval y1 as Double _
  16. ,byval x2 as Double,Byval y2 as Double , Byval X as Double) As Double
  17.     Dim d1 As Double, d2 As Double
  18.     d1 = Pendiente(x1, y1, x2, y2)
  19.     d2 = -d1 * x1 + y1
  20.     PuntoPendiente_Get_Y = d2 + d1 * X
  21. End Function
  22.  
  23. Private Sub Mover(Byval Index as integer, Byval DestX as Double, Byval DestY As Double)
  24.    Dim dFromX As Double, dFromY as Double
  25.    dFromX = imgcarta(index).left + imgcarta(index).width /2
  26.    dFromY = imgcarta(index).top + imgcarta(index),Height / 2
  27.    Dim dX as double
  28.    For dX = dFromX To DestX
  29.        imgCarta(index).Move dX _
  30.       , PuntoPendiente_Get_Y(dFromX, dFromY, DestX, DestY, dX)
  31.    Next dX
  32. End Sub
  33.  
  34.  

La esencia del tema sería algo así, ahora bien, puedes optimizar este código muchísimo más (creando estructuras para no pasar tantas variables, hallando el valor de la pendiente de la recta al principio para hacerlo una sola vez, etc.), pero eso ya es cosa tuya.

Temas a estudiar:
- Ecuación de la recta que pasa por dos puntos.
- Pendiente de una recta.
- Ecuación punto pendiente de la recta.

Suerte.

Se me esquecía:
- También tendrás que buscarte la vida para suavizar el movimiento de la carta y evitar un efecto de flickeo. Debes incluir en el bucle un DoEvents o un Refresh para que se pueda actualizar la imagen que visualices o en tu caso para que se redibuje el control (yo me buscaría la vida para hacerlo con imágenes).

Miguel Angel Rodriguez

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Mover Un Control En Tiempo De Ejecucion
« Respuesta #5 en: Lunes 14 de Marzo de 2005, 13:50 »
0
Recibido Brroz.  Muchas gracias y me pongo al tajo.
Cuando lo tenga hablaremos.
 :hola: