Picturebox kollisionen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Picturebox kollisionen

    Hallo,

    da bin ich mal wieder... peinlich peinlich peinlich, aber egal, ihr kennt mich sowieso nicht ;)

    Also,

    ich habe hier eine Funktion in einer Klasse:

    VB.NET-Quellcode

    1. Public Function generateStone(ByVal anzahl As Integer)
    2. Dim rnd As New Random
    3. For i = 0 To anzahl
    4. Dim BlockType As PictureBox = New PictureBox
    5. locationX = rnd.Next(1, 42) * 25
    6. locationY = rnd.Next(1, 31) * 25
    7. BlockType.Location = New Point(locationX, locationY)
    8. BlockType.Image = My.Resources.Stein
    9. BlockType.Width = BlockType.Image.Width
    10. BlockType.Height = BlockType.Image.Height
    11. Form1.Controls.Add(BlockType)
    12. Next i
    13. Return 0
    14. End Function

    Damit wird, je nach gewünschter Eingabe Blöcke als Picturebox generiert. Das klappt, soweit so gut. Ich kann auch umherlaufen mit den Folgenden Code:

    VB.NET-Quellcode

    1. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    2. If e.KeyCode = Keys.Up Then
    3. PicturePlayer.Location = New Point(PicturePlayer.Location.X + 0, PicturePlayer.Location.Y - 25)
    4. End If
    5. 'Runter
    6. If e.KeyCode = Keys.Down Then
    7. PicturePlayer.Location = New Point(PicturePlayer.Location.X + 0, PicturePlayer.Location.Y + 25)
    8. End If
    9. 'Rechts
    10. If e.KeyCode = Keys.Right Then
    11. PicturePlayer.Location = New Point(PicturePlayer.Location.X + 25, PicturePlayer.Location.Y + 0)
    12. End If
    13. 'Links
    14. If e.KeyCode = Keys.Left Then
    15. PicturePlayer.Location = New Point(PicturePlayer.Location.X - 25, PicturePlayer.Location.Y + 0)
    16. End If
    17. ''Beenden''
    18. If e.KeyCode = Keys.Escape Then
    19. Me.Close()
    20. End If
    21. End Sub

    Das klappt auch, soweit so gut.
    Die Blöcke werden so abgerufen:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim Generate As New Generate
    3. Generate.generateStone(100)
    4. End Sub

    Das klappt auch, soweit so gut. Ich sehe die Blöcke auch auf der Form, soweit so gut.
    Doch wie mache ich nun eine Kollisionsabfrage? Ich habe schon folgendes versucht:

    VB.NET-Quellcode

    1. If PicturePlayer.Bounds.IntersectsWith(dirt.bounds) then
    2. blablabla
    3. end if

    das klappt aber nicht, weil er Dirt nicht findet.
    Weiß jemand ne Lösung?
    Dateien
    • 2D.7z

      (371,51 kB, 131 mal heruntergeladen, zuletzt: )
    Wenn ich meine Kollisionsabfrage schreibe, schreibe ich diese in "Form1.vb" in den Sub Form1_KeyDown. Aber egal wo ich das eintippe, er findet Dirt nicht. Kannst das ja selber mal versuchen mit meinem Code. Dirt wird blau unterstrichen.

    VB.NET-Quellcode

    1. Public Function generateDirt(ByVal anzahl As Integer)
    2. Dim rnd As New Random
    3. For i = 0 To anzahl
    4. Dim BlockType As PictureBox = New PictureBox
    5. locationX = rnd.Next(1, 42) * 25
    6. locationY = rnd.Next(1, 31) * 25
    7. BlockType.Location = New Point(locationX, locationY)
    8. BlockType.Image = My.Resources.Dirt
    9. BlockType.Width = BlockType.Image.Width
    10. BlockType.Height = BlockType.Image.Height
    11. Form1.Controls.Add(BlockType)
    12. Next i
    13. Return 0
    14. End Function
    Das ist die Funktion generateDirt:

    VB.NET-Quellcode

    1. Dim locationX As Integer
    2. Dim locationY As Integer
    3. Public Function generateDirt(ByVal anzahl As Integer)
    4. Dim rnd As New Random
    5. For i = 0 To anzahl
    6. Dim BlockType As PictureBox = New PictureBox
    7. locationX = rnd.Next(1, 42) * 25
    8. locationY = rnd.Next(1, 31) * 25
    9. BlockType.Location = New Point(locationX, locationY)
    10. BlockType.Image = My.Resources.Dirt
    11. BlockType.Width = BlockType.Image.Width
    12. BlockType.Height = BlockType.Image.Height
    13. Form1.Controls.Add(BlockType)
    14. Next i
    15. Return 0
    16. End Function

    So rufe ich die Funktion ab:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim Generate As New Generate
    3. Generate.generateDirt(100)
    4. End Sub

    Sonst habe ich mit Dirt nix anderes Angestellt, noch nicht.
    also Problem gelöst: dirt kann nicht gefunden werden, weils nicht existiert.

    jetzt 2 wichtige wichtige empfehlungen:
    1. Option Strict On!
      irgendwie habich festgestellt, dass diese Empfehlung besser rezipiert wird, wenn in einem vergrößerten SchriftTyp vorgetragen - ich weiß auch nicht - der normale VBP-User ist iwie zu dumm, um gelesenes aufzufassen, wenns einfach nur zu lesen ist.
    2. dieses Buch Lesen (ich versuchs nochmal mit normaler Schrift)
      du hast offensichtlich keinen schimmer von Datentypen, von Deklarationen, von Gültigkeitsbereichen. dieses Buch Lesen (die 2005er Version), und du verfügst immerhin über ein Vokabular, mit dem man mit dir über Programmierung kommunizieren kann. (nein - wenn du das Buch durchgearbeitet hast, kannst du programmieren, und würdest dein jetziges Problem sleber lösen, bzw. die ganze anwendung auf einem sinnvollerem Ansatz aufbauen.)

    Lukas97 schrieb:

    VB.NET-Quellcode

    1. For i = 0 To anzahl
    Dir ist bewusst, dass Du bei anzahl = 100 101 Objekte erstellst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!