Kollisionsabfrage MazeGame

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von TheVBTutorialsVB.

    Kollisionsabfrage MazeGame

    Ich verzweifle gerade total.
    Ich versuche ein MazeGame zu machen und habe nun (textweise) 2 Panels in der Form1. Diese Sind quasi die "Brücken über die Lava". D.h, wenn die Maus über denen ist, ist alles Ok, wenn nicht dann ist man tot.
    So Nun mein Problem. Ich bekomme das hin mit einem Panel, nicht aber mit mehreren.
    Hier mal der Komplette Code vom Spiel:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim MausX As Integer
    3. Dim MausY As Integer
    4. Dim g As Panel = New Panel
    5. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    6. MausX = MousePosition.X - Me.Location.X - 2
    7. MausY = MousePosition.Y - Me.Location.Y - 19
    8. g.BackColor = Color.Red
    9. g.Location = New Point(MausX, MausY)
    10. g.BringToFront()
    11. Kollision()
    12. End Sub
    13. Sub Kollision()
    14. For Each Wall As Control In Me.Controls
    15. If Wall.Name.Contains("p") Then
    16. If g.Bounds.IntersectsWith(Wall.Bounds) Then
    17. Me.Text = "OK"
    18. Else
    19. Me.Text = "Not OK"
    20. End If
    21. End If
    22. Next
    23. End Sub
    24. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    25. g.Name = "A"
    26. g.BackColor = Color.Red
    27. g.Size = New Size(1, 1)
    28. g.BringToFront()
    29. End Sub
    30. End Class


    Das "g As Panel" ist einfach nur zur Kontrolle da (damit das bounds funktioniert)

    So bei einem Panel funktioniert das, beim anderen aber nicht.
    Die beiden Panel heißen p1 und p2
    Also das "Contains("p")... müsste gehen ( sieht man ja das es bei einem Panel funktioniert)

    Mit der Gleichen Methode Kollision() habe ich mal ein Pacman programiert. Dort funjtionierts super mit jedem Panel...

    Große Frage:
    Warum funktioniert es beim Anderen NICHT?
    Was hast Du denn in Deiner Form für Contrrols mit welchen Eigenschaften?
    Was soll denn passieren?
    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!
    Super antwort... Ich will meine Frage geklärt bekommen warum das nicht geht Obwohl es in meinem Pacman spiel funktioniert.
    Und nein ich will nicht GDI+ benutzen weil ich die Mazes selber zeichnen will und nicht per code. Ich finde das so einfach leichter.
    zumal du per GDI+ auch grafiken zeichnen kannst - du wirst also sehr wohl selbst "zeichnen" können.

    Wenn du weiterhin controls missbrauchen willst: kp warum dein code nicht funktioniert - ich würde das mouseenter/leave event dafür nutzen. Tipp: ein Sub kann mehrere handles haben^^
    Klar bekomm ich die gezeichnet, aber ist ne sau arbeit die ganzen Locationens zu finden damit alles passt. Das ist dann immer ein Coden und ausprobieren obs Passt zeug und das mag ich nicht. So ist es einfacher. Außerdem hätte ich mit GDI das gleiche Problem beim Abfragen ob die Maus eine Wand berührt.
    Außerdem hab ich kaum Ahnung von GDI. Ich bekomme es hin etwas zu zeichnen und es noch über den Bildschirm zu bewegen, aber Kollisionsabfrage und anderes Zeug... wüsste ich nicht wie man das macht. ich denke mal auch mit Bounds und IntersectWith. Wo wir dann wieder beim Meinem Problem sind...

    Könntet ihr mich nicht verraten warum es nicht funktioniert?? Ich meine Es funktioniert nur bei EINEM von (hier beliebige Anzahl von Panels einsetzen) Panels. Ich ich verstehe nicht warum.

    Mein PacMan ist auch aus lauter Panels aufgebaut die eben unterschiedliche Namen tragen, w(n) für Wälle, e(n) für die Essenspunkte. Das n steht für ne beliebige Zahl.
    Ok Pacman bewegt sich per tastendruck aber sollte dich hier auch funktionieren.

    Wenn ihr wollt lade ich mal mein PacMan hier hoch. Dann könnt ihr meinen (total schlechten Code) anschauen. Und auch die Kollisionsabfrage in PacMan anschauen und mal mit der Hier vergleichen.

    pS: Ich weiß das die Performace mit Steuerelementen nicht sehr gut ist.
    wenn du wirklich nicht alles "rausfinden" willst, kannst du ja einfach die locations / sizes der panels nehmen und abspeichern?

    zur frage, wie währs die for each schleife zu beenden mit "exit for" wenns nicht okay ist?

    btw, einfacher != besser
    In einem MazeGame ist das doch eig. egal ob man das mit Steuerelementen macht oder per GDI... es bewegt sich ja nichts darin.
    Es geht ja nur um die Abfrage ob ich auf dem Weg bin oder daneben.

    Okay ich habe das Problem nun anders gelöst:
    Ich frage nun einfach per MouseMove Event Ab ob die Maus über der Form bewegt wird. Solange die Maus sich aber nur auf dem Panel bewegt ist alles richtig. Wenn ich das Panel verlasse wird das MouseMove event aufgerufen und dann: Game Over. Funktioniert Super.

    ZUm Thema GDI:
    Kennt den Jemand ein Gutes (schön erklärtes) Tutorial,Buch etc. zu GDI? In meinem Buch wurde das nur Oberflächlich angekratzt und auch die Openbooks habe ich schon gelesen.
    Beim EntwicklerBuch zu VB hab ich leider totale Verständnis Probleme, wegen den ganzen Fach Kauderwälsch (schreibt man das so?)
    ...
    hmpf ich glaub das Programmieren liegt mir nicht so, obwohl ich jetzt schon 3 Bücher + Openbooks gelesen habe.
    Aber es macht mächtig Spaß (wenns klappt)

    Deshalb bin ich für jedes Tut, Buch, Tipp offen. Wäre auch cool wenn mir einer von euch "persöhnlichen Unterricht" Geben könnte. In vorm von Skype :)
    zum Thema GDI ein Tutorial von mir: [VB 2008] [Tutorial] GDI+

    Und nun mal zu deinem "Spiel": du benutzt Panels um IntersectWith etc zu nutzten. Das sind Funktionen die ein Rectangle aber auch bietet. Dein Problem: ein Rectangle wird nirgends "angezeigt" - also benutzt du panels xD

    Erstelle dir eine List(of Rectangle). Dort legst du alle Flächen ab als wären es Panels.. Großer vorteil: alles Unnötige entfällt: Backcolor, borderstyle, etc. Diese Liste kannst du für deine kollisionserkennung durcharbeiten (=> for each schleife) UND per GDI ganze einfach zeichnen (Im Paint-Event!)

    Wenn du etwas weiter gehen möchtest (z.B. die Panels sollen grafiken anzeigen, verschiedene farben haben, etc) kannst du dir auch eine klasse schreiben - renderObjekt oder so. Diese enthält dann alle funktionen und eigenschaften die du willst. Und gezeichnet wird anhand dieser eigenschaften mit GDI. Du hast dann alle Freiheiten und bist nicht mehr an Panel-basteleien gebunden^^

    lg
    OK, anderes Thema:

    kann man eine Variable in den Ressourcen Speichern?
    Ich habe eine Variable

    Dim level as Integer

    Diese Variable soll, wenn die Form geschlossen wird, gespeichert werden. Ich könnte das ganze per Stream Writer machen, aber geht das nicht auch mit My.resources.save oder so?

    Weil, wenn man das Spiel wieder startet soll man eben bei dem Level weiter Spielen können.
    Ich habe in google gesucht mit den wörtern : "VB Variable in My.Ressourcen speichern"

    .....

    Ok habs gefunden (in youtube)
    Zum speichern:

    VB.NET-Quellcode

    1. my.settings.NAME = VARIABLE
    2. my.settings.Save()
    3. my.settings.Reload()


    Zum laden:

    VB.NET-Quellcode

    1. VARIABLE = My.settings.VARIABLE


    hmm, ist nur noch die Frage wie ich den Wert wieder auf 0 bekomme, bis jetzt seht er auch 2...

    Edit:
    ah habs, per

    VB.NET-Quellcode

    1. my.settings.reset

    erst denken, dann schreiben
    Nimm GDI+ aber zu den PicutreBoxen: Das PictureBox_MouseMove-Event würde ich wohl nehmen. Dort kommt dann rein:

    VB.NET-Quellcode

    1. MsgBox("Wand getroffen!")
    2. Windows.Forms.Cursor.Position = New Point(0,0)


    Windows.Forms.Cursor.Position = New Point(0,0) dient dazu, dass man das Programm nicht so leicht überlisten kann, dafür würde ich aber den Start auch auf 0,0 legen.

    LG :)