2D Spiel Grundgerüst von Kollisionserkennung

    • VB.NET

    Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von FAtheone.

      2D Spiel Grundgerüst von Kollisionserkennung

      Hi Leute, ich hab mir mal ein paar gedanken gemacht wie man am einfachsten eine Kollisionserkennung in VB 08 Programmiert, und das ist dabei rausgekommen:

      VB.NET-Quellcode

      1. 'Kollisionserkennung by Freakstar
      2. Public Class Form1
      3. 'Bodenkollision
      4. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      5. Dim BMAP As Bitmap = Me.BackgroundImage
      6. If BMAP.GetPixel(PictureBox1.Location.X, PictureBox1.Bottom) = New Color().FromArgb(255, 0, 0, 0) Then
      7. Else
      8. PictureBox1.Location = PictureBox1.Location + New Point(0, 2)
      9. End If
      10. End Sub
      11. Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
      12. Dim BMAP As Bitmap = Me.BackgroundImage
      13. 'Wenn die Linkstaste gedrückt wird
      14. If e.KeyCode = Keys.Left Then
      15. If BMAP.GetPixel(PictureBox1.Left - 6, PictureBox1.Location.Y - PictureBox1.width) = New Color().FromArgb(255, 0, 0, 0) Or _
      16. BMAP.GetPixel(PictureBox1.Location.X - 6, PictureBox1.Location.Y) = New Color().FromArgb(255, 0, 0, 0) Or _
      17. BMAP.GetPixel(PictureBox1.Location.X - 6, PictureBox1.Location.Y + (PictureBox1.width -1)) = New Color().FromArgb(255, 0, 0, 0) Then
      18. Else
      19. PictureBox1.Location = PictureBox1.Location - New Point(6, 0)
      20. End If
      21. End If
      22. 'Wenn die Rechtstaste gedrückt wird
      23. If e.KeyCode = Keys.Right Then
      24. If BMAP.GetPixel(PictureBox1.Right + 6, PictureBox1.Location.Y - PictureBox1.width) = New Color().FromArgb(255, 0, 0, 0) Or _
      25. BMAP.GetPixel(PictureBox1.Location.X + 6, PictureBox1.Location.Y) = New Color().FromArgb(255, 0, 0, 0) Or _
      26. BMAP.GetPixel(PictureBox1.Location.X + 6, PictureBox1.Location.Y + (PictureBox1.width -1)) = New Color().FromArgb(255, 0, 0, 0) Then
      27. Else
      28. PictureBox1.Location = PictureBox1.Location + New Point(6, 0)
      29. End If
      30. End If
      31. End Sub
      32. End Class


      Und so Funktionierts:
      Ihr malt eine Kollisionsmap mit den Farben Schwarz und Weiß, die Farbe schwarz stellt hindernisse da, die Farbe Weiß stellt den 'weg' da. z.B. so:

      diese Kollisionsmap macht ihr bei eurem Form als Hintergrund bild.


      Jetzt braucht ihr noch die designmap, die stellt alle designs da z.B. pflanzen bäume etc. zb. so:


      Jetzt fügt ihr eurem Form noch ein Panel hinzu, bei der Dock eigenschaft stellt ihr Fill ein. bei Backgroundimage benutzt ihr die Designmap.

      als letztes benutzt ihr noch eine Picturebox in der größe 25x25 pxl, das wird der Spieler sein.

      das Quadrat bewegt sich zwar nur langsam aber das kann man ja noch verbessern^^

      ich hoffe ihr könnt damit etwas anfangen, have fun ;)
      lg.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

      Hallo, die Idee ist ja nicht neu ;) Aber eines bleibt doch anzumerken, du beachtest das tunneling Problem nicht und somit ist diese Kollisionsabfrage nicht zu gebrauchen. Desweiteren vermisse ich das einbinden der verstrichenen Zeit seid dem letzten Aktualisieren.

      das Quadrat bewegt sich zwar nur langsam
      Und eben ganu das kannst du mit dieser super simplen Kollisionsprüfung nicht "schneller machen" ;)
      Vollzitat eines Vorposts an dieser Stelle entfernt ~VaporiZed

      Wenn man ein Spiel programmieren - und sei es auch noch so kleine - dann doch bitte richtig. Man benötigt eine min. Eine Verctor2 Klasse, eine Matrix Klasse, eine Kamera Klasse und weitere viele kleine Hilfsklassen ;)

      Das Tunnelling beschreibt das Problem, das bei einem zu schnellen Objekt die Kollision nicht erkannt wird und das Objekt durch ein Hinderniss hindurch fliegen kann. Deswegen kann man das Objekt in diesem Fall auch nicht schneller machen !

      aber google.de ist dein Freund und helfer in Zeiten der Unwissenheit ;)

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

      Nur weil du weißt wie das geht, kann es trotzdem andere Leute geben
      denen das vielleicht weitergeholfen hat!!!

      Und wenn man Snake oda so programmiert braucht mann sicher nicht Vektor2, usw.!

      Is ja nett von ihm wenn er sein Wissen mit uns teilt, oder?! :huh:
      könnte man die map-file(das background-bmp) nicht in eine array einlesen (0 für weiß und 1 für schwarz) und dann statt getpixel einfach nur in das array-element gucken? das würde jedenfalls schneller gehen
      Von meinem iPhone gesendet