Kollisionsabfrage

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Kollisionsabfrage

    Liebe Community,
    Ich bin gerade dabei einen "Kransimulator" zu programmieren.
    Mein Problem:
    Ich brauche eine Kollisionsabfrage. Doch alle die ich hier im Forum gefunden habe funktionieren nicht so wie ich es bei meinem Programm will.
    Mein Programm:
    Mein Kran besteht aus Panels. Der Haken ist auch ein Panel. Mit dem Haken soll man den Gegenstand (Auch ein Panel) "fangen" oder so.
    Hier mal mein Code:

    VB.NET-Quellcode

    1. If Gegenstand.Location.Y = Haken.Bottom Then
    2. If Gegenstand.Location.X = Haken.Location.X Then
    3. LevelZähler = 2
    4. MsgBox("Sie haben gewonnen!" & vbCrLf & "Klicken sie Ok, wenn sie für Level" & LevelZähler & " Bereit sind.", MsgBoxStyle.OkOnly)
    5. End If
    6. End If

    (Der Haken kommt von oben.)
    Der Code funktioniert auch, doch wenn man nicht ganz genau auf den Gegenstand trifft, wird es nicht erkannt.
    Könnt ihr mir bitte erklären wie ich programmiere, dass der "Haken" auch schräg auf den "Gegenstand" treffen kann, es aber trotzdem erkannt wird.
    Hier mal ein Screenshot, zur besseren Vorstellung:
    Ich hoffe das mit dem Bild geht, habe das noch nie gemacht ;) :D
    Bilder
    • 12345.PNG

      7,46 kB, 666×509, 98 mal angesehen
    Du musst die Maße mitbedenken. Die Kollision findet nicht nur punktgenau statt, sondern über eine Strecke hinweg.
    Beispiel:
    Gegenstand ist auf X = 10, Breite des Gegenstandes: 20 => X-Berührbereich geht von 10 bis 30. Genauso der Haken => Wenn Haken.X + Haken.Breite >= Gegenstand.X und Haken.X <= Gegenstand.X + Gegenstand.Breite Dann Treffer
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Zunächstmal dringend empfohlen: Visual Studio - Empfohlene Einstellungen ( <- folge dem Link)
    Mit der Default-Einstellung machst du dir das Erlernen von vb.net überaus schwer, weil
    a) du immer wieder veraltete vb6-Methoden verwendest, die im .Net-Kontext mehr oder weniger Müll sind (meistens mehr).
    b) du dir mangels Compiler-Unterstützung kaum jemals einen Begriff des fundamentalen Konzepts "Datentyp" machen kannst.



    Zur Frage: jedes Control hat eine Bounds-Property, vom Datentyp Rectangle.
    Und RectAngle hat eine Intersects() - Methode - As Boolean, mit der man ermitteln kann, ob 2 Rechtecke überlappen.

    Du siehst: Meine Erläuterung benennt bereits 3 Datentypen (Control, Rectangle, Boolean) - wie gesagt: ohne das zu verstehen kann man in vb.net nix werden.
    Deshalb bring als erstes deine Einstellungen in Ordnung.

    Dann schau dir die genannten Klassen/Datentypen auch im ObjectBrowser an ( <- folge dem Link).

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Was »funktioniert doch nicht«? Was hast Du ausprobiert? Wie sieht Dein Kollisionstest nun aus? Bitte immer so konkret wie möglich antworten, sonst gibt's nur noch Spekulatius.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @Progra Panels haben ein ClientRectangle. Sieh Dir mal im ObjectBrowser die Funktionen an, mit denen Du feststellen kanst, ob 2 Rectangles gemeinsame Punkte haben.
    Und:
    Kollisionsabfrage allein genügt nicht, Du musst die freien Abstände kennen, um bei Zeiten bremsen zu können. ;)
    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!
    @VaporiZed
    Ich habe das hier in mein Projekt eingebaut:
    Wenn Haken.X + Haken.Breite >= Gegenstand.X und Haken.X <= Gegenstand.X + Gegenstand.Breite Dann Treffer
    Doch dann kommt nach jedem Tastendruck die Meldung.
    Hier der Code:

    VB.NET-Quellcode

    1. 'If Gegenstand.Location.Y = Haken.Bottom Then
    2. If Haken.Location.X + Haken.Width >= Gegenstand.Location.X & Haken.Location.X <= Gegenstand.Location.X + Gegenstand.Width Then
    3. MsgBox("Test")
    4. End If
    5. 'End If

    Wenn ich den auskommentierten Code davor setzte macht er immer eine Meldung, wenn er die Höhe des Gegenstandes erreicht hat.
    Egal, ob der Gegenstand unter dem Haken ist, oder woanders.
    1. Der Klassiker: lerne zu debuggen. Wenn Die MsgBox kommt, dann schau, wie die Werte sind und ob es passt.
    2. Kommst Du aus der C-Programmierecke? Das & wird in VB.Net als And dargestellt, um eine es-müssen-beide-Bedingungen-zutreffen-Geschichte darzustellen => & durch And ersetzen und nochmal probieren. Und dann mal nach den anderen Antworten in diesem Thread schauen ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Habe jetzt geschafft. :thumbsup:
    Mir ist aufgefalllen, dass die Meldung immer kommt, sobald der Haken über dem Gegenstand ist. Auch wenn der Haken noch garnicht die Höhe
    des Gegenstandes erreicht hat. Die Meldung kommt aber nicht, wenn der Haken nicht direkt über dem Gegenstand ist, sondern zum Beispiel weiter rechts.
    Also habe ich einfach davor noch die Abfrage gemacht, ob der Gegenstand die Höhe erreicht hat und schon passts ;)
    Übrigens:
    Ich weiß nicht ob das einen Unterschied macht, aber:
    Der Haken (grauer Kasten im Bild) verlängert sich immer, also bewegt sich sozusagen garnicht.
    Am Schluss will ich dann noch programmieren, das der Gegenstand sich bewegt. (Schaff das aber glaub ich allein.)
    Vielen Dank für eure Hilfe ;) :thumbsup: ;)
    Hier mal der Code:

    VB.NET-Quellcode

    1. 'Kollisionabfrage:
    2. If Gegenstand.Top = Haken.Bottom Then
    3. If Haken.Location.X + Haken.Width >= Gegenstand.Location.X And Haken.Location.X <= Gegenstand.Location.X + Gegenstand.Width Then
    4. MsgBox("Test")
    5. End If
    6. End If

    @Progra Die überladene Rectangle.Contains()-Funktion beherrschst Du bereits, entschuldige bitte, dass ich gewagt habe, Dich daran zu erinnern. :sleeping:
    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!