Probleme mit Pong Spiel (Kollisionsabfrage)

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von MrLeo.

    Probleme mit Pong Spiel (Kollisionsabfrage)

    Hallo zusammen,
    ich habe gerade mein Pong Spiel (bis auf Animationen und fertige Grafiken) zu Ende programmiert.
    Jedoch habe ich ein Problem bei der Kollisionsabfrage, wenn der Ball auf den Spieler oder den Computer trifft.

    Das hier ist der Code für den Computer:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If Ball.Bounds.IntersectsWith(Computer.Bounds) Then
    2. Ball.Location = New Point(Computer.Location.X + Computer.Size.Width + 1, _
    3. Ball.Location.Y)
    4. xVel = -xVel
    5. End If


    Das ist der Code für den Computer:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If Ball.Bounds.IntersectsWith(Spieler.Bounds) Then
    2. Ball.Location = New Point(Spieler.Location.X - Ball.Size.Width, _
    3. Ball.Location.Y)
    4. xVel = -xVel
    5. End If


    Der Ball ist einfach nur eine kleine PictureBox, Spieler und Computer ebenfalls.

    Die Variable xVel ist wie folgt definiert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim xVel As Single = Math.Cos(RandomInstance.Next(5, 10)) * Geschwindigkeit


    Wäre nett, wenn mir jemand bei der Fehlerbehebung helfen könnte.

    Danke im Voraus und freundliche Grüße,
    Leo.
    Lass mal den Code im Zusammenhang sehen. Wenn wir das nachvolltiehen sollen, wollen wir auch nachvollziehbare Effekte sehen.
    Also: Kompletten Code posten,
    schreiben, was sein soll und wie es ist.
    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!

    VB.NET-Quellcode

    1. Public Class pongMain
    2. 'Einbinden der Variablen'
    3. Dim Geschwindigkeit As Single = 10
    4. Dim RandomInstance As New Random()
    5. Dim CompScore As Integer = 0
    6. Dim PlayScore As Integer = 0
    7. Dim xVel As Single = Math.Cos(RandomInstance.Next(5, 10)) * Geschwindigkeit
    8. Dim yVel As Single = Math.Sin(RandomInstance.Next(5, 10)) * Geschwindigkeit
    9. Private Sub pongMain_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    10. 'Mausbewegung wird an das Spielerpanel angepasst'
    11. If e.Y > 5 And e.Y < Me.Height - 40 - Spieler.Height Then
    12. Spieler.Location = New Point(Spieler.Location.X, e.Y)
    13. End If
    14. End Sub
    15. Private Sub GameLoop_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GameLoop.Tick
    16. 'Kollisionsabfragen für "oben und unten"'
    17. If Ball.Location.Y > 5 And Ball.Location.Y < Me.Height - 40 - Spieler.Height Then
    18. Computer.Location = New Point(Computer.Location.X, Ball.Location.Y)
    19. End If
    20. Ball.Location = New Point(Ball.Location.X + xVel,
    21. Ball.Location.Y + yVel)
    22. If Ball.Location.Y < 0 Then
    23. Ball.Location = New Point(Ball.Location.X, 0)
    24. yVel = -yVel
    25. End If
    26. If Ball.Location.Y > Me.Height - Ball.Size.Height - 45 Then
    27. Ball.Location = New Point(Ball.Location.X, Me.Height - Ball.Size.Height - 45)
    28. yVel = -yVel
    29. End If
    30. 'Kollisionsabfrage für Spieler und Computerpanel in Interaktion mit Ball'
    31. If Ball.Bounds.IntersectsWith(Spieler.Bounds) Then
    32. Ball.Location = New Point(Spieler.Location.X - Ball.Size.Width, _
    33. Ball.Location.Y)
    34. xVel = -xVel
    35. End If
    36. If Ball.Bounds.IntersectsWith(Computer.Bounds) Then
    37. Ball.Location = New Point(Computer.Location.X + Computer.Size.Width + 1, _
    38. Ball.Location.Y)
    39. xVel = -xVel
    40. End If
    41. 'Erhöhen der Punktzahl / Score Berechnung'
    42. If Ball.Location.X < 0 Then
    43. PlayScore += 1
    44. Ball.Location = New Point(Me.Size.Width / 2, Me.Size.Height / 2)
    45. SpielerScore.Text =
    46. Convert.ToString(PlayScore)
    47. End If
    48. If Ball.Location.X > Me.Width - Ball.Size.Width - Spieler.Width Then
    49. CompScore += 1
    50. Ball.Location = New Point(Me.Size.Width / 2, Me.Size.Height / 2)
    51. ComputerScore.Text =
    52. Convert.ToString(CompScore)
    53. End If
    54. End Sub
    55. Private Sub pongMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    56. 'Cursor ausblenden'
    57. Windows.Forms.Cursor.Hide()
    58. End Sub
    59. Private Sub pongMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    60. 'Beenden bei Druck auf Escpae (PLATZHALTER, wird noch gegen Menü getauscht)'
    61. If e.KeyValue = Keys.Escape Then
    62. Me.Close()
    63. End If
    64. End Sub
    65. End Class


    So, das hier ist das Grundgerüst des Spiels.
    Die Kollisonsabfrage oben und unten funktioniert, jedoch nicht die, wenn der Ball auf den Spieler oder den Gegner trifft.
    Ja was geht denn nun nicht?
    Die Kollision zwischen Ball und Computer läuft doch perfekt.
    Wiw soll denn der Spieler bewegt werden?
    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!

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

    Die Position des Spielers (also der Spielfigur) ist an die Mausbewegung gebunden.
    Das Problem ist, dass zwar die Kollision mit dem Ende des Fensters oben und unten funktioniert, der Spielball aber nicht von der eigenen oder der computergesteuerten Figur abprallt.

    VB.NET-Quellcode

    1. If Ball.Bounds.IntersectsWith(Spieler.Bounds) Then
    2. ball.Location = New Point(Spieler.Location.X + ball.Size.Width, ball.Location.Y) ' + statt -
    3. xVel = -xVel
    4. End If
    5. If Ball.Bounds.IntersectsWith(Computer.Bounds) Then
    6. 'ball.Location = New Point(Computer.Location.X + Computer.Size.Width + 1, ball.Location.Y)
    7. ball.Location = New Point(Computer.Location.X + ball.Size.Width + 1, ball.Location.Y)
    8. xVel = -xVel
    9. End If
    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!