none
AYUDA CON UN PEQUEÑO JUEGO (pregunta sencilla, soy principiante) RRS feed

  • Pregunta

  • hola
    estoy haciendo un juego que con las flechas del teclado mueve un label y cuando llega a las coordenadas (location) de un picture box sale un msgbox, pero eso pasa cuando la esquina del label toca la esquina del picture box mi pregunta es como hago para que salga el msgbox cuando cualquier parte del area que ocupa el  label toca cualquier parte del area que ocupa el picture box
    GRACIAS 
    este es el codigo:

    Public Class Form1

        Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

            Select Case (e.KeyCode)
                Case Keys.Right
                    Label1.Location = New System.Drawing.Point(Me.Label1.Location.X + 2, Me.Label1.Location.Y)
                Case Keys.Left
                    Label1.Location = New System.Drawing.Point(Me.Label1.Location.X - 2, Me.Label1.Location.Y)
                Case Keys.Up
                    Label1.Location = New System.Drawing.Point(Me.Label1.Location.X, Me.Label1.Location.Y - 2)
                Case Keys.Down
                    Label1.Location = New System.Drawing.Point(Me.Label1.Location.X, Me.Label1.Location.Y + 2)
            End Select
           
            If Me.Label1.Location = PictureBox1.Location Then
                MsgBox("bien")

                Label1.Location = New System.Drawing.Point(212, 224)
            End If
        End Sub

        Private Sub Form1_load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        End Sub
        
    End Class

    martes, 23 de junio de 2009 19:54

Respuestas

  • Un momento, que lo explicado no es del todo correcto, porque he supuesto que el control Label está por debajo del control PictureBox, pero si está por encima, no va a funcionar.

    Mejor será averiguar si el rectángulo del control PictureBox tiene una intersección con el rectángulo que forma el control Label.

    Haz una prueba insertando el siguiente código a continuación de las líneas donde mueves el control Label:

            ' Rectángulo que forma el control PictureBox
            '
            Dim recPictureBox As New Rectangle( _
                PictureBox1.Location.X, _
                PictureBox1.Location.Y, _
                PictureBox1.Width, _
                PictureBox1.Height)

            ' Rectángulo que forma el control Label
            '
            Dim recLabel As New Rectangle( _
                Label1.Location.X, _
                Label1.Location.Y, _
                Label1.Width, _
                Label1.Height)

            ' Comprobar si el rectángulo del control PictureBox tiene
            ' una intersección con el rectángulo del control Label.
            '
            If (recPictureBox.IntersectsWith(recLabel)) Then
                MessageBox.Show("Bien")
                Label1.Location = New System.Drawing.Point(212, 224)
            End If

    Ahora, sí creo que debería de funcionar bien. ;-)


    Como se supone que el valor del rectángulo del control PictureBox es siempre el mismo, en lugar de declarar la variable «recPictureBox» en el evento KeyDown, la puedes declarar a nivel del propio formulario, y establecer su valor, por ejemplo, en el evento Load del formulario, de ésta manera te ahorras tener que estar creando un nuevo objeto Rectangle cada vez que pulses una tecla de dirección.
    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta emilios1995 jueves, 25 de junio de 2009 22:24
    miércoles, 24 de junio de 2009 15:40
    Moderador

Todas las respuestas

  • hola,

    viendo algunas paginas puede encontrar este fragmento de codigo:

    private bool PictureBoxHitTest(PictureBox pb1)
    {
      foreach (Control ctl in panel2.Controls)
      {
        if (ctl.GetType() == typeof(PictureBox ))
         {
            pb2 = (PictureBox )ctl;
            if (pb.ClientRectangle.Inters
    ectsWith(p b2.ClientR ectangle))
              return true;
         }
      }
      return false;
    }



    no digo que lo apliques tal como esta pero si puede sacar una idea.
    O sea hacer uso del ClientRectangle

    en el ejemplo verifica la interseccion de dos picturebox, habria que ver si se puede hacer con un picture y un label, calculo que si.


    nota: se quee sta en c#, pero el ejemplo lo encontre en este lengueje espero no se dificil de entender, si lo es avisa y veo de traducirlo.

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 23 de junio de 2009 21:23
  • no entendi.
    no se usar para nada c
    porfavor en basic.net
    martes, 23 de junio de 2009 22:21
  • en vb.net seria algo asi:

        Private Function PictureBoxHitTest(ByVal pb1 As PictureBox) As Boolean
            For Each ctl As Control In panel2.Controls
                If ctl.[GetType]() Is GetType(PictureBox) Then
                    pb2 = DirectCast(ctl, PictureBox)
                    If pb.ClientRectangle.Inters Then
                        ectsWith(p)
                    End If
                End If
            Next
            Return False
        End Function


    igualmente como te decia deberias investigar el uso del "ClientRectangle.Inters" de los controles este es el que te dara la info para saber si hay interseccion en la superficie de dos controles.

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 24 de junio de 2009 13:57
  • Hola:

    Lo que tienes que averiguar es si algún punto del control Label ESTÁ DENTRO del rectángulo que forma el control PictureBox.

    Haz una prueba insertando el siguiente código a continuación de las líneas donde mueves el control Label:

            ' Rectángulo que forma el control PictureBox
            '
            Dim recPictureBox As New Rectangle( _
                PictureBox1.Location.X, _
                PictureBox1.Location.Y, _
                PictureBox1.Width, _
                PictureBox1.Height)

            ' Comprobar si algún punto del control Label está dentro
            ' del rectángulo del control PictureBox.
            '
            If recPictureBox.Contains(Label1.Location.X, Label1.Location.Y) Then
                MessageBox.Show("Bien")
                Label1.Location = New System.Drawing.Point(212, 224)
            End If

    Un saludo


    Enrique Martínez [MS MVP - VB]
    miércoles, 24 de junio de 2009 15:03
    Moderador
  • Un momento, que lo explicado no es del todo correcto, porque he supuesto que el control Label está por debajo del control PictureBox, pero si está por encima, no va a funcionar.

    Mejor será averiguar si el rectángulo del control PictureBox tiene una intersección con el rectángulo que forma el control Label.

    Haz una prueba insertando el siguiente código a continuación de las líneas donde mueves el control Label:

            ' Rectángulo que forma el control PictureBox
            '
            Dim recPictureBox As New Rectangle( _
                PictureBox1.Location.X, _
                PictureBox1.Location.Y, _
                PictureBox1.Width, _
                PictureBox1.Height)

            ' Rectángulo que forma el control Label
            '
            Dim recLabel As New Rectangle( _
                Label1.Location.X, _
                Label1.Location.Y, _
                Label1.Width, _
                Label1.Height)

            ' Comprobar si el rectángulo del control PictureBox tiene
            ' una intersección con el rectángulo del control Label.
            '
            If (recPictureBox.IntersectsWith(recLabel)) Then
                MessageBox.Show("Bien")
                Label1.Location = New System.Drawing.Point(212, 224)
            End If

    Ahora, sí creo que debería de funcionar bien. ;-)


    Como se supone que el valor del rectángulo del control PictureBox es siempre el mismo, en lugar de declarar la variable «recPictureBox» en el evento KeyDown, la puedes declarar a nivel del propio formulario, y establecer su valor, por ejemplo, en el evento Load del formulario, de ésta manera te ahorras tener que estar creando un nuevo objeto Rectangle cada vez que pulses una tecla de dirección.
    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta emilios1995 jueves, 25 de junio de 2009 22:24
    miércoles, 24 de junio de 2009 15:40
    Moderador