Mover un objeto en el plano

Iniciado por nolasco281, 26 Julio 2015, 07:05 AM

0 Miembros y 1 Visitante están viendo este tema.

nolasco281

Hola como estan.

Tengo la siquente duda quisiera mover un objeto en el plano como el titulo lo indica es decir mover un pictureBox por cierto recorrido ya definido.

Aca un ejemplo.


Se me han ocurrido varias soluciones pero no las veo nada practicas.

como mover el picturebox por posciciones es decir ir asignadole cordenadas para dibujar la curva y moverlo con un timer.

Estoy leyendo la libreria Graphics talvez encuentro algo por ahi.

Mi duda mas concreta es como dibujo una curva (o un recorrido) y que el piturebox se mueva sobre ese recorrido, no se si me doy a entender.

No se que librerias puedo usar para hacer este tipo de practica les agradeceria cualquier ayuda

Saludos.

PD: Estoy trabajando en vb.net
Lo que se puede imaginar... se puede programar.

Eleкtro

#1
Cita de: nolasco281 en 26 Julio 2015, 07:05 AMSe me han ocurrido varias soluciones pero no las veo nada practicas.

como mover el picturebox por posciciones es decir ir asignadole cordenadas para dibujar la curva y moverlo con un timer.

¿De que otra forma piensas que se podría mover un control si no utilizas "algo" (como un Timer, o el método Threading.Sleep) para asignarle unas coordenadas distintas a las actuales y así moverlo?.

No soy experto en gráficos, pero vaya creo que no puede haber otra forma en esencia es eso...




Cita de: nolasco281 en 26 Julio 2015, 07:05 AMMi duda mas concreta es como dibujo una curva (o un recorrido) y que el piturebox se mueva sobre ese recorrido, no se si me doy a entender.

Simplemente utiliza el evento Paint para dibujar:

Código (vbnet) [Seleccionar]
   ' Create points that define curve.
   Dim point1 As New Point(50, 50)
   Dim point2 As New Point(100, 25)
   Dim point3 As New Point(200, 5)
   Dim point4 As New Point(250, 50)
   Dim point5 As New Point(300, 100)
   Dim point6 As New Point(350, 200)
   Dim point7 As New Point(250, 250)

   Dim curvePoints As Point() =
       {
           point1, point2,
           point3, point4,
           point5, point6,
           point7
       }

   ''' <summary>
   ''' Handles the <see cref="E:Paint" /> event.
   ''' </summary>
   ''' <param name="e">A <see cref="T:System.Windows.Forms.PaintEventArgs" /> that contains the event data.</param>
   Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

       MyBase.OnPaint(e)

       Using graphPath As New GraphicsPath

           graphPath.AddCurve(curvePoints)

           Using pathPen As New Pen(Color.Red)
               e.Graphics.DrawPath(pathPen, graphPath)
           End Using

       End Using

   End Sub


Para mover un elemento por el trazo, necesitas averiguar algunos factores, yo no soy muy bueno en la aritmética así que he sacado (y refactorizado) un ejemplo que encontré aquí:
http://www.dreamincode.net/forums/topic/293148-getting-an-object-to-follow-a-bezier-curve/

Código (vbnet) [Seleccionar]
MoveControl(ctrl:=Me.PictureBox1, speed:=200, path:=curvePoints)

Código (vbnet) [Seleccionar]
''' <summary>
''' Moves a control through a path.
''' </summary>
''' <param name="ctrl">The control to move.</param>
''' <param name="speed">The animation speed.</param>
''' <param name="path">The path to follow.</param>
Public Shared Sub MoveControl(ByVal ctrl As Control,
                             ByVal speed As Integer,
                             ByVal path As IEnumerable(Of Point))

   For index As Integer = 1 To (path.Count - 1)

       Dim m As Double = (path(index).Y - path(index - 1).Y) / (path(index).X - path(index - 1).X)
       Dim c As Double = (path(index).Y) - (m * path(index).X)
       Dim sign As Integer = Math.Sign(path(index).X - path(index - 1).X)

       While (ctrl.Left <> path(index).X)

           Application.DoEvents()
           ctrl.Left += (sign * 5)
           ctrl.Top = CInt(m * CDbl(ctrl.Left) + c)
           Thread.Sleep(speed)

       End While

   End Sub





Cita de: nolasco281 en 26 Julio 2015, 07:05 AMNo se que librerias puedo usar para hacer este tipo de practica les agradeceria cualquier ayuda

¿A qué tipo de prácticas te refieres exactamente?, ¿a mover un elemento por la UI, o desarrollar un juego?.

Para lo primero ...simplemente es mover el control y ya está, cualquiera puede hacerlo sin una librería que nos haga de "ayudante" xD, sin embargo, existe una librería dedicada a efectos/transiciones para la UI, la cual proporciona un método para mover un elemento de un punto a otro, la utilización sería algo así:

(el control se mueve mal, pero es solo un ejemplo on-the-fly, como ya dije los cálculos de los ángulos en fin la trayectoria se me da mal)

Código (vbnet) [Seleccionar]
Imports Transitions

Public NotInheritable Class Form1 : Inherits Form

   ' Create points that define curve.
   Dim point1 As New Point(50, 50)
   Dim point2 As New Point(100, 25)
   Dim point3 As New Point(200, 5)
   Dim point4 As New Point(250, 50)
   Dim point5 As New Point(300, 100)
   Dim point6 As New Point(350, 200)
   Dim point7 As New Point(250, 250)

   Dim curvePoints As Point() =
       {
           point1, point2,
           point3, point4,
           point5, point6,
           point7
       }

   Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Shown

       Dim speed As Integer = 200
       Dim transitions As New List(Of Transition)

       For index As Integer = 0 To (curvePoints.Count - 2) Step 2

           Dim transition As New Transition(New TransitionType_Linear(iTransitionTime:=speed))
           With transition
               .add(PictureBox1, "Left", curvePoints(index).X)
               .add(PictureBox1, "Top", curvePoints(index + 1).Y)
           End With

           transitions.Add(transition)

       Next

       Transition.runChain()

   End Sub

End Class


Para lo segundo, suponiendo que estés desarrollando un juego (por las imágenes de los coches, y ahora las curvas), entonces estás empezando mal, deberías utilizar librerías especializadas en esa temática, cualquier librería basada en DirectX u OpenGL, o el framework XNA de Microsoft (aunque está deprecado ya), etc.

SharpDX

Sin embargo, es una temática muy compleja de manejar, crear una forma y dibujarla lo puede hacer cualquier (aunque solo eso ya necesita unas cuantas lecturas de manual xD), yo intenté hacer algo simple hace un tiempo y me agobié por completo al final xD.

Saludos








nolasco281

Hola gracias por responder.

Si realizando algo como un juego, he leido que como tal VB.net es malo para ese fin y hay que usar  frameworks como XNA o los otros que indicas.

Con lo que he leido y men compartes creo que es suficiente para poder sequir avanzando
https://www.daniweb.com/software-development/vbnet/code/486368/vb-net-gamessim-projectile-motion

Gracias por contestar disculpas por contestar tan tarde he estado un poco ocupado, cuando resuelva la curva del carro comparto el codigo

Saludos Gracias.  ;D
Lo que se puede imaginar... se puede programar.