Programación General > Visual Basic 6.0 e inferiores
Mover Un Control En Tiempo De Ejecucion
Miguel Angel Rodriguez:
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:
Utiliza el buscador del foro ya hay post referente al movimiento de controles en tiempo de ejecucion
ArKaNtOs:
ja, curioso hoy acabo de descargar un ejemplo de eso :) :P
aqui tienes el vinculo:
soloprogramacion
:kicking:
Miguel Angel Rodriguez:
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:
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 --- Option Explicit Private Function Pendiente( _Byval x1 as Double, byval y1 as Double _,byval x2 as Double,Byval y2 as Double) As Double If x2 - x1 <> 0 Then Pendiente = (y2 - y1) / (x2 - x1) Else Pendiente = 1 End IfEnd Function Private Function PuntoPendiente_Get_Y( _Byval x1 as Double, byval y1 as Double _,byval x2 as Double,Byval y2 as Double , Byval X as Double) As Double Dim d1 As Double, d2 As Double d1 = Pendiente(x1, y1, x2, y2) d2 = -d1 * x1 + y1 PuntoPendiente_Get_Y = d2 + d1 * XEnd Function Private Sub Mover(Byval Index as integer, Byval DestX as Double, Byval DestY As Double) Dim dFromX As Double, dFromY as Double dFromX = imgcarta(index).left + imgcarta(index).width /2 dFromY = imgcarta(index).top + imgcarta(index),Height / 2 Dim dX as double For dX = dFromX To DestX imgCarta(index).Move dX _ , PuntoPendiente_Get_Y(dFromX, dFromY, DestX, DestY, dX) Next dXEnd Sub
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).
Navegación
[#] Página Siguiente
Ir a la versión completa