Was ist an diesem Code falsch?

  • VB.NET

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

    Was ist an diesem Code falsch?

    Kollision wird irgendwie nicht erkannt.

    VB.NET-Quellcode

    1. Public Class gemälde
    2. Dim untengedrückt As Boolean = False
    3. Dim obengedrückt As Boolean = False
    4. Dim linksgedrückt As Boolean = False
    5. Dim rechtsgedrückt As Boolean = False
    6. Dim gezeigt As Boolean = False
    7. Dim playerspeed As Integer = 1
    8. Private Sub gemälde_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    9. If e.KeyCode = Keys.W Then
    10. obengedrückt = True
    11. untengedrückt = False
    12. rechtsgedrückt = False
    13. linksgedrückt = False
    14. ElseIf e.KeyCode = Keys.S Then
    15. untengedrückt = True
    16. obengedrückt = False
    17. linksgedrückt = False
    18. rechtsgedrückt = False
    19. ElseIf e.KeyCode = Keys.A Then
    20. linksgedrückt = True
    21. rechtsgedrückt = False
    22. obengedrückt = False
    23. untengedrückt = False
    24. ElseIf e.KeyCode = Keys.D Then
    25. rechtsgedrückt = True
    26. linksgedrückt = False
    27. obengedrückt = False
    28. untengedrückt = False
    29. End If
    30. End Sub
    31. Private Sub gemälde_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    32. movement.Enabled = True
    33. End Sub
    34. Private Sub movement_Tick(sender As System.Object, e As System.EventArgs) Handles movement.Tick
    35. Dim snake As New PictureBox
    36. snake.Width = 16
    37. snake.Height = 16
    38. snake.BackColor = Color.Red
    39. If rechtsgedrückt Then
    40. snake.Left = player.Left - player.Width
    41. snake.Top = player.Top
    42. ElseIf linksgedrückt Then
    43. snake.Left = player.Left + player.Width
    44. snake.Top = player.Top
    45. ElseIf obengedrückt Then
    46. snake.Left = player.Left
    47. snake.Top = player.Top + player.Height
    48. ElseIf untengedrückt Then
    49. snake.Left = player.Left
    50. snake.Top = player.Top - player.Height
    51. End If
    52. If obengedrückt = True Then
    53. player.Top -= playerspeed
    54. Controls.Add(snake)
    55. ElseIf untengedrückt = True Then
    56. player.Top += playerspeed
    57. Controls.Add(snake)
    58. ElseIf linksgedrückt = True Then
    59. player.Left -= playerspeed
    60. Controls.Add(snake)
    61. ElseIf rechtsgedrückt = True Then
    62. player.Left += playerspeed
    63. Controls.Add(snake)
    64. End If
    65. If player.Bounds.IntersectsWith(snake.Bounds) Then
    66. MsgBox("You lose!")
    67. Me.Close()
    68. label1.text = "collision!"
    69. End If
    70. End Sub
    71. End Class

    VB.NET-Quellcode

    1. If rechtsgedrückt Then
    2. snake.Left = player.Left - player.Width
    3. snake.Top = player.Top
    4. ElseIf linksgedrückt Then
    5. snake.Left = player.Left + player.Width
    6. snake.Top = player.Top

    Ist das nicht genau anders herum sinnvoller?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    XpressMak schrieb:

    VB.NET-Quellcode

    1. Dim untengedrückt As Boolean = False
    2. Dim obengedrückt As Boolean = False
    3. Dim linksgedrückt As Boolean = False
    4. Dim rechtsgedrückt As Boolean = False
    Mach da ein Enum draus.
    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!
    Aber was hat das damit zu tun, dass die Kollisionsdetektion nicht funktioniert? Bewegung und Erzeugung weiterer Pictureboxen geht ja.

    MemoAnMichSelbst schrieb:

    VB.NET-Quellcode

    1. If rechtsgedrückt Thensnake.Left = player.Left - player.Widthsnake.Top = player.TopElseIf linksgedrückt Thensnake.Left = player.Left + player.Widthsnake.Top = player.Top
    Ist das nicht genau anders herum sinnvoller?
    Warum sollte es anders herum sinvoller sein? Oder wie sollte es deiner Meinung nach aussehen?Möchte so verhindern, dass eine Kollision von Anfang an besteht.

    XpressMak schrieb:

    VB.NET-Quellcode

    1. Me.Close()
    2. label1.text = "collision!"
    Interessante Reihenfolge.
    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!
    Warum ich frage ob das anders herum sinnvoller ist?
    Naja wenn ich links drücke erwarte ich doch dass sich die Position auf der x-Achse nach LINKS verschiebt...
    also blaba.Left -= blubb.width
    Aber kann auch ein grober Gedankenfehler von mir sein ^^ Ist nicht auszuschließen.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    MemoAnMichSelbst schrieb:

    VB.NET-Quellcode

    1. If rechtsgedrückt Then
    2. snake.Left = player.Left - player.Width
    3. snake.Top = player.Top
    4. ElseIf linksgedrückt Then
    5. snake.Left = player.Left + player.Width
    6. snake.Top = player.Top

    Ist das nicht genau anders herum sinnvoller?


    RodFromGermany schrieb:

    XpressMak schrieb:

    VB.NET-Quellcode

    1. Me.Close()
    2. label1.text = "collision!"
    Interessante Reihenfolge.


    Als ich bemerkte, dass me.close nicht funktioniert, machte ich ein label, welches mir anzeigt ob die Kollision erkannt wird. Klappte auch nicht.

    XpressMak schrieb:

    ob die Kollision erkannt wird
    Setze einen Haltepunkt in die Prozedur und arbeite Deinen Code zeilenweise ab. Verfolge den Inhalt der Variablen. Stellst Du fest, dass der Soll- und der Ist-Inhalt voneinander abweichen, hast Du einen Fehler gefunden. :thumbup:
    Gugst Du hier.

    RodFromGermany schrieb:

    Mach da ein Enum draus.
    Und? Hast Du?
    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!

    XpressMak schrieb:

    warum enum?
    Du hast 4 Boolean, von denen maximal einer auf True stehen kann.
    Sieh Dir dies mal an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Enum KeyPressed
    2. keiner
    3. oben
    4. unten
    5. links
    6. rechts
    7. End Enum
    8. Private MyKey As KeyPressed = KeyPressed.keiner
    9. Private Sub gemälde_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    10. If e.KeyCode = Keys.W Then
    11. MyKey = KeyPressed.oben
    12. End If
    13. End Sub
    14. Private Sub movement_Tick(sender As System.Object, e As System.EventArgs)
    15. Select Case (MyKey)
    16. Case KeyPressed.oben
    17. ' was tun
    18. Case KeyPressed.unten
    19. ' ...
    20. End Select
    21. End Sub
    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!
    Wobei man eigtl die Keys-Enumeration verwenden kann.

    VB.NET-Quellcode

    1. Private MyKey As Keys
    2. Private Sub gemälde_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    3. MyKey = e.KeyCode
    4. End Sub
    5. Private Sub movement_Tick(sender As System.Object, e As System.EventArgs)
    6. Select Case (MyKey)
    7. Case Keys.W
    8. ' was tun
    9. Case Keys.S
    10. ' ...
    11. End Select
    12. End Sub
    Jou.
    Und man kann das alles in das KeyDown-Event packen, einen Timer braucht der @TE gar nicht.
    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!
    Ich denke den Timer hat er damit das Ding sich auch bewegt wenn kein Knopf gedrückt wird.
    Also wäre das Key-Down Event alleine nicht ganz ausreichend. Oder?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    ich glaub, das Prob ist zu spezifisch, als das mans lösen kann, ohne konkret die Solution lauffähig ins Visualstudio geladen zu haben.

    Ich kann mir garnix vorstellen, wie die Snake aussieht, und der Player, und wie die sich verhalten, wenn man was drückt.

    Und welches Verhalten nu das Fehlverhallten ist.

    Also ich täte vorschlagen, du zippst eine BeispielSolution und hängst die an.
    Aber lauffähig soll sie sein (vorher testen!!), und keine Binaries enthalten - nur Sources!