Einfache Kollisionserkennung

  • Allgemein

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

    Einfache Kollisionserkennung

    Hi,

    Ich schreibe gerade ein kleines Programm, das es auf dem Desktop schneien lässt. Das klappt auch ganz gut, nur will ich jetzt machen, dass der Schnee am unteren Bildschirmrand und aufeinander liegen bleibt, sodass der Schnee sich immer höher auftürmt.

    Könnt ihr mir nen kleinen Gedankenanstoß liefern, wie ich dieses Problem lösen kann?

    P.S. Die Schneeflocken sind eine eigene Klasse und werden von einem Timer bewegt und mit GDI+ gezeichnet.


    Vielen Dank schon mal!
    Speichere die einzelnen Schneeflockenobjekte in einer Liste und überprüfe vor jeder Bewegung der Schneeflocke anhand der Liste, ob unter ihr etwas ist.
    Falls nein, dann bewegen, falls ja, dann stehen bleiben.

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

    Ich hab das mal versucht, so zu lösen:

    VB.NET-Quellcode

    1. For i As Integer = 0 To flocken.Count - 1
    2. If flocken.Item(i).top < My.Computer.Screen.WorkingArea.Height - Form2.größe - 1 And flocken.Item(i).boden = False Then
    3. Dim anz As Integer = 0
    4. Dim zuf As Integer = zufall.Next(0, 2)
    5. Dim richt As Integer = 1
    6. For i1 As Integer = 0 To flocken.Count - 1
    7. If flocken.Item(i).top = flocken.Item(i1).top + 1 Then
    8. If zuf = 0 Then richt *= -1
    9. If flocken.Item(i).left = flocken.Item(i1).left + richt Then
    10. anz += 1
    11. End If
    12. End If
    13. Next
    14. If anz = 0 Then
    15. flocken.Item(i).top += 1
    16. If zuf = 0 Then flocken.Item(i).richtung *= -1
    17. flocken.Item(i).left += flocken.Item(i).richtung
    18. End If
    19. Else
    20. flocken.Item(i).boden = True
    21. End If
    22. Next
    23. Me.Refresh()


    Ist vielleicht ein bisschen wirr, da dich das jetzt einfach so kurz gemacht hab.


    Das Problem ist, es funktioniert nicht. Sie bleiben zwar auf dem Boden liegen, aber nicht aufeinander!

    Wisst ihr, was da nicht stimmt?


    P.S. Das Ganze läuft in einem Timer ab.
    Mit einer Schleife wirst du da nicht auskommen. Letztlich mußt du ja die Position jeder fallenden Schneeflocke mit allen anderen Flocken abgleichen. Das sind natürlich jede Menge Durchläufe (je nach Flockenanzahl). Das ist u.U. dann schon recht bremsend.

    Daher folgende Idee:
    Vielleicht wären 2 Schneeflockenlisten besser: Liste 1 = fallende Schneeflocken, Liste 2 = liegende Schneeflocken. Dabei Liste 2 nur zum Zeichnen benutzen und in einer weiteren Liste 3 die Positionen der Schneeoberkante speichern (also für jede mögliche X-Position die oberste Y-Position). Damit brauchst du deine fallenden Flocken nur noch mit der Oberkantenliste abgleichen (der Einfachheit halber entspricht der Index gleich der Y-Position).

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    @Vatter: Gute Idee.
    Die fallsnden Flocken kannst Du auch kanalisieren, da sie wohl nicht als Schneesturm über den Bildschirm brausen. Also: Denk Dir senkrechte Streifen einer sinnvollen Breite, dann musst Du die fallenden Flocken eines Streifens nur mit denen im Streifen selbst und den beiden Nachbarstreifen abgleichen. Spart Rechenarbeit, will aber organisiert werden.
    Bei quertreibendem Schnee können die Streifen auch schräg liegen.
    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!
    Das sieht dann aber echt langweilig aus. Da würde es ja reichen, zu jedem Pixel (Flockenmittelpunkt) die tiefste mögliche neue Flockenposition parat zu haben. Und ich wette, die Flocken "rollen" dann nicht mal in die benachbarte Kuhle.
    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!

    RodFromGermany schrieb:

    Das sieht dann aber echt langweilig aus.

    ?
    Flocke fälllllllllllt. Bevor sie nicht die "Oberkante" der liegenden Flocken unterschritten hat, braucht man schon mal gar nix zu tun. WENN sie denn das tut, fängt man an zu prüfen, ob auf ihrer "Bahn" was kollisionswürdiges ist.

    Wobei das irgendwie alles Quatsch ist. Es gibt ein Array mit 1920 Werten (die für jede Spalte die höhe des liegenden Schnees speichern). Da prüfe ich beim Fallen ob was unter mir ist oder nicht. Feddich.

    Und zum Kugelrollen: Das ist zumindest nicht trivial, da Schneeflocken ja bekanntlich schlecht rollten. Wenn's "echt" wirken sollen, ist es vermutlich eher sowas wie ein "umfallen" oder "kollabieren"?
    Wenn ich zum Fenster raus sehe, falls es denn mal schneit, kommen mir da bei den Wirbeln schon andere Gedanken, aber das sprengt den Plan des TE.
    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!