Beweglichen Button nicht durch Picturebox lassen

  • VB.NET

Es gibt 55 Antworten in diesem Thema. Der letzte Beitrag () ist von TheoTechnic.

    Beweglichen Button nicht durch Picturebox lassen

    Bei meinem Spiel lässt sich ein Button als Figur steuern.
    Ich möchte dass er nicht durch eine Picturebox durchgehen kann.
    Ich hab es schon mit "bounds.intersectswith" versucht , was aber nicht geklappt hat .
    Kann mir jemand helfen ??
    Ich möchte einen festen Gegenstand haben durch den man nicht durchgehen kann und auf dem die Figur stehen kann
    Irgendwie bekomm ich das aber nicht hin
    Ich habs so versucht:
    wenn der spieler den gegenstand berührt wird der Spieler einen pixel weggesetzt in die andere Richtung
    wenn ich das aber so mache ist es total ruckelig und wenn man trotzdem die taste gedrückt hält
    kann man trotzdem durch den Gegenstand laufen.
    Es muss eine andere Lösung geben...
    Ob sich zwei Konturen überschneiden ist eigentlich einfach zu prüfen. S.o. etc. Wenn's bei dir nicht klappt, ist der rest des Codes falsch. Und im Zweifel macht man das ganze halt nicht mit CONTROLS!

    Aber!
    Zu prüfen ob ein sich bewegender Gegenstand mit einem festen kollidiert ist nicht ganz so einfach! Nimm an, ein Quadrat bewegt sich pro "Tick" (Zeiteinheit, Frame, ...) eine Strecke, die 4-5 mal seiner Größe entspricht. Das feste Hindernis ist ein dünne Wand. Bei Tick "n" steht das quadrat VOR der Wand, beim Tick "n+1" dahinter! Es hat einer keiner festen position eine Kollision gegeben, aber trotzdem ist klar, dass es eine gegebene HÄTTE!
    Also muss man im Prinzip die gesamte überfahrene Fläche (bei einem Quadrat dürfte das maximal ein Hexagon sein, oder?) prüfen, ob sie mit dem "Hindernis" kollidiert. Wenn ja, "wann" und halt die neue Position VOR der Wand berechnen.
    Also muss man im Prinzip die gesamte überfahrene Fläche (bei einem Quadrat dürfte das maximal ein Hexagon sein, oder?) prüfen, ob sie mit dem "Hindernis" kollidiert. Wenn ja, "wann" und halt die neue Position VOR der Wand berechnen.
    Wie kommst du auf Hexagon? Ich hätte gesagt, diese Fläche könnte vom Prinzip her so ziemlich beliebig sein, wenn man Rotation miteinberechnet, ansonsten komm ich irgendwie nur auf Vierecke(Parallelogramm(e) - weiß nicht ob die Mehrzahl stimmt?!^^)

    Edit:@singu: hast du die eigentliche Komplexität denn begriffen, welche picoflop hier erkannt und gepostet hat?!
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Wie kommst du auf Hexagon?

    Ohne Rotation. entweder ein Rechteck, oder ein Hexagon. Stell die ein auf der Spitze stehendes Qaudrat vor und bewege es horizontal -> Hexagon. Ein Quadrat, dass sich genau in der Verlängerung einer seiner Seiten bewegt, ergibt ein Rechteck als überfahrene Fläche.

    Button1_click schrieb:

    wenn der spieler den gegenstand berührt wird der Spieler einen pixel weggesetzt in die andere Richtung
    wenn ich das aber so mache ist es total ruckelig und wenn man trotzdem die taste gedrückt hält
    Das ruckeln kommt vom zurückspringen. du mußt deine Logik umbauen:
    1. Nächste Position errechnen und auf Kollision prüfen
    2. Je nach Ergebnis die bewegung ausführen oder nicht.
    Und eben die Sonderfälle der Kollision beachten, die picoflop schon gepostet hat. da gibs auch so lustige Tunneleffekte bei diagonalen Bewegungen, wenn die Ecken der beiden Objekte nur kurz kollidieren.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hallo, Ich habe Alles gemacht, was ihr wolltet, und bei mir kann man mit intersect von rechts durch die picbox
    Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim previ_key As New Keys
    3. Dim beschl As Integer = 1
    4. Private Sub Key_Press(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles Button1.KeyDown
    5. If previ_key = e.KeyValue Then
    6. beschl += 1
    7. Else
    8. beschl = 1
    9. End If
    10. Dim rect_button As New Rectangle(Button1.Location, Button1.Size)
    11. Dim rect_picBox As New Rectangle(PictureBox1.Location, PictureBox1.Size)
    12. Dim rect_b_soon As New Rectangle(New Point(Button1.Location.X + beschl, Button1.Location.Y), Button1.Size)
    13. If e.KeyValue = Keys.D Then
    14. If rect_b_soon.IntersectsWith(rect_picBox) Then
    15. Return
    16. Else
    17. Button1.Location = New Point(Button1.Location.X + beschl, Button1.Location.Y)
    18. End If
    19. ElseIf e.KeyValue = Keys.A Then
    20. If rect_b_soon.IntersectsWith(rect_picBox) Then
    21. Return
    22. Else
    23. Button1.Location = New Point(Button1.Location.X - beschl, Button1.Location.Y)
    24. End If
    25. ElseIf e.KeyValue = Keys.W Then
    26. If rect_b_soon.IntersectsWith(rect_picBox) Then
    27. Return
    28. Else
    29. Button1.Location = New Point(Button1.Location.X, Button1.Location.Y - beschl)
    30. End If
    31. ElseIf e.KeyValue = Keys.S Then
    32. If rect_b_soon.IntersectsWith(rect_picBox) Then
    33. Return
    34. Else
    35. Button1.Location = New Point(Button1.Location.X, Button1.Location.Y + beschl)
    36. End If
    37. End If
    38. previ_key = e.KeyValue
    39. End Sub
    40. Private Sub Key_Up(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles Button1.KeyUp
    41. beschl = 1
    42. End Sub
    43. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    44. Button1.Location = New Point(156, 188)
    45. End Sub
    46. End Class


    (im Anhang die .exe dazu)
    warum kann ich von hinten durch die picbox durch? ?(
    Valerian
    Dateien
    • BewegApp.zip

      (9,72 kB, 132 mal heruntergeladen, zuletzt: )
    Ah, kapiere:
    Dim rect_b_soon As New Rectangle(New Point(Button1.Location.X + beschl, Button1.Location.Y), Button1.Size)

    auch mit
    Dim rect_b_soon As New Rectangle(New Point(Button1.Location.X (!) - (!) beschl, Button1.Location.Y), Button1.Size)

    Dim rect_b_soon As New Rectangle(New Point(Button1.Location.Xl, Button1.Location.Y + beschl), Button1.Size)

    Dim rect_b_soon As New Rectangle(New Point(Button1.Location.Xl, Button1.Location.Y - beschl), Button1.Size)

    ;)
    du musst bei der Beschleunigung einfach auch negative Werte angeben, dann reicht ein Reckteck...
    d.h. bei einer Rechtsbewegung setzt du die beschleunigung auf > 0
    bei einer linksbewegung < 0
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    aber prinzipiell brauche ich dann trotzdem 2 rechtecke (x und y achse)
    und ähm... macht man dann mit SSEEHHRR vielen rechtecken (Landschaft) lieber eine matrix?
    also ich sowas wie das hier machen:
    N-Game
    Macht man bei sowas eine matrix oder auch mit rectangle?