Grenzen bei Picture Boxen

  • VB.NET

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

    Grenzen bei Picture Boxen

    Hallo,

    ich habe auf einer Windows Forms Anwendung mehrere Picture Boxen raufgezogen und darin Bilder geladen. Sie stellen ein Zimmer da. Dann habe ich noch eine kleine Picture Box mit einer Spielfigur hinzugefügt. Diese Spielfigur kann man durch das Zimmer navigieren. Ich möchte es so machen dass wenn die Spielfigur Picture Box zum Beispiel das Bett berührt man nicht mehr weiter gehen kann und sie anhält. Im Bild habe ich euch diese Form einmal angehängt.
    Ich wäre froh über eine Antwort.

    *Topic verschoben*
    Bilder
    • Häßlomon_v.5.0 - Microsoft Visual Studio 11.10.2020 12_25_38.png

      204,42 kB, 1.920×1.050, 101 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hi @Jajo

    zur Logik:die
    linke Seite des Bettes (der Box) ist die Locationeigenschaft im
    Eigenschaftenfenster. Die rechte Seite = Location + Width. Oben = .Top
    und unten = top + Height (+ weil das Koordinatensystem von oben nach unten zeigt)

    alles,
    was nicht Bett / Schreibtisch / Nachtschrank ist, ist freie (erlaubte)
    Fläche. Soll zum Beispiel der nächste Schritt nach rechts sein, muss
    geprüft werden, ob ein Pixel nach rechts noch alles frei ist. Wenn ja,
    dann geh. Wenn nicht, dann nicht. Ich habe so etwas mal in C++ gemacht.
    Kannst du aber hoffentlich erkennen, was ich meine.

    C-Quellcode

    1. if (Key[3] && DoesPieceFit(du.X + 1, du.Y)) //→ (Pfeil nach rechts Taste)
    2. {
    3. du.X = du.X + 1;
    4. }


    DoesPiceFit ist eine Funktion, die die anzustrebenden Koordinaten bekommt und prüft, bevor man tatsächlich geht. Also wenn sie false zurückgibt, dann kann der Spieler nicht weiter gehen.

    C-Quellcode

    1. bool Spiel::DoesPieceFitGegner(int GegnerX, int GegnerY)
    2. {
    3. if (Spielfeld_Original[GegnerY][GegnerX] == ' ') //freie Fläche
    4. {
    5. return true;
    6. }
    7. else
    8. {
    9. return false;
    10. }
    11. }


    Für das Speichern der freien Fläche habe ich ein char-Array genommen.
    Bei einem jeden Tastendruck wird also geprüft, welche Pfeiltaste gedrückt
    wurde und ob das dann geht. Für Visual Basic nimmst du
    im Form-Load-Ereignis

    VB.NET-Quellcode

    1. Me.KeyPreview = True
    und nutze das Key-Down-Event aus. Da kommt der Prüfcode rein

    Dein Thema nennt man übrigens Kollisionserkennung
    Bilder
    • Screenshot 2020-10-11 152656.png

      3,99 kB, 154×82, 222 mal angesehen
    • Screenshot 2020-10-11 152632.png

      3,08 kB, 350×68, 85 mal angesehen

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

    Hallo,
    das was fu da machst nennt sich collision detection.
    Darüber gibt es sogar ganze Bücher.
    Ich denke für 2D Anwendungen wird das aber nicht so schwierig also wirst du kein Buch brauchen.

    Also ich kenne mich in VB.Net und dessen Kapazitäten nicht so gut aus, aber was du tun könntest wäre durch alle PictureBoxes durchzuloopen und true zurückgeben sobald die position einer PictureBox mit einer anderen übereinstimmt.
    Diesen Wert nimmst du als Mittel um zu definieren ob du weitergehen kannst oder nicht.

    Wie gesagt, VB.Net ist nicht meins aber normalerweise haben Komponenten immer eine Bounds Eigenschaft die die Ränder der Komponenten zurückgibt.
    Und somit diese Bounds Eigenschaft auch eine sogenannte "Intersects" Methode.
    Lass Intellisense dir mal ausspucken wie die heißen.
    Und dort wo du den loop machst da testet du mit der Intersects Methode des momentan durchlaufenden Objekts, ob dein Hauptobjekt, als dein Spielerobjekt, mit diesem Kollidiert.

    Im Notfall kannst du auch einmal nach "Intersect vb.net" auf Google suchen.
    Ich bin mir 100% sicher VB hat diese Methode.

    Edit: Übrigens, ich bin zwar kein Jurist, aber das Sprite das du für den Spieler verwendest ist Kopierrechtsgeschützt.
    Bei Gelegenheit solltest du dir da was eigenes machen.
    ----------------------------------------------------------------------------------------------------------------------

    Hier könnte meine Signatur stehen, aber die ist mir abfußen gekommen.

    ----------------------------------------------------------------------------------------------------------------------
    @Jajo Willkommen im Forum. :thumbup:
    Da es sich hier um PictureBoxen handelt, lässt sich Dein Problem elementar und einfach lösen.
    Probier mal dies:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Function Crash(pb1 As PictureBox, pb2 As PictureBox) As Boolean
    3. Dim rc1 = New Rectangle(pb1.Location, pb1.Size)
    4. Dim rc2 = New Rectangle(pb2.Location, pb2.Size)
    5. Return rc1.IntersectsWith(rc2)
    6. End Function
    7. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. If Crash(PictureBox1, PictureBox2) Then
    9. Label1.Text = "1-2: Crash"
    10. Else
    11. Label1.Text = "1-2: kein Crash"
    12. End If
    13. If Crash(PictureBox3, PictureBox4) Then
    14. Label2.Text = "3-4: Crash"
    15. Else
    16. Label2.Text = "3-4: kein Crash"
    17. End If
    18. End Sub
    19. End Class
    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!
    Hey @Jajo,

    vielleicht noch als Ergänzung, falls dir das alles von den anderen hier noch nicht genügt:
    Es gibt viele viele viele Möglichkeiten die Collision zwischen zwei Pictureboxen zu detecten.
    Ich bin in vb.net nicht mehr so wirklich fit, aber sowas wäre auch möglich gewesen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If bettpb.bounds.intersectWith(charakterpb.bounds) then
    2. collision = true
    3. end if​


    Das ist nur ein Beispiel einer anderen Vorgehensweise. Wollte es nur mal ergänzt haben.
    Ist natürlich nicht so elegant, wie die anderen Lösungen hier, aber es wäre auch ein Weg :)
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    Das IntersectsWith erwähnte RfG bereits …
    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.
    Ouh danke für den Hinweis, @VaporiZed
    naja doppelt hält besser. Hab es nochmal in einem anderen Beispiel gezeigt :)

    Grüße

    Vollzitat mir Erwähnung ersetzt ~EaranMaleasi

    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

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

    SystemException schrieb:

    VB.NET-Quellcode

    1. If bettpb.bounds.intersectWith(charakterpb.bounds) then
    2. collision = true
    3. end if

    @SystemException Da fehlt ein else das den Boolean auf false setzt...

    oder dann direkt

    VB.NET-Quellcode

    1. collision = bettpb.bounds.intersectWith(charakterpb.bounds)

    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hi mrMo,

    Ich denke darauf wäre der TE auch selbst gekommen, es war nur ein Beispiel wie man eine Kollision auch noch erkennen kann. Dass man dann die Logik der Situation nicht ignorieren darf und einen Oder-Fall beachten muss, ist natürlich richtig, danke für den Hinweis :)

    Is ja net meine Aufgabe gewesen

    Grüße
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    Da sich @Jajo so intensiv an der Diskussion beteiligt, vielleicht ein Schmankerl:
    Kollision und Reflexion - Elastischer Stoß
    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!