Breakpoint Problem mit IsInputKey

  • VB.NET

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

    Breakpoint Problem mit IsInputKey

    Moin,
    schon einige male habe ich hier in den Foren nützliches gefunden, jetzt hoffe ich selbst auf Hilfe.
    direkt Butter bei die Fische:

    Der Rahmen:
    Ich programmiere neuerdings mit vb.net und habe als Einstiegsprojekt aufgetragen bekommen snake zu programmieren.
    Die Basiselemente des Spiels funktionieren auch super, sodass ich mir weiter und weiter kleinere Sachen ausdenke, die ich dann einarbeite.
    Aktuell ist dies eine Bestenliste (leaderboard) welches in einer txt Datei gespeichert werden soll. Auch dies funktioniert für sich genommen.

    Das Problem:
    Ich habe die Steuerung der Schlange über eine überschriebene IsInputKey Funktion realisiert. Eine MoveToStart Funktion soll das Spiel auf den Startzustand bringen, dh. die wichtigen Variablen zurücksetzen etc. Für das Leaderboard und eine Namenseingabe habe ich Groupboxen verwendet, die jeweils wenn sie gebraucht werden über die Visible Property angezeigt oder ausgeblendet werden.
    So weit so gut...
    Für sich genommen funktionieren alle dieser drei "Teilnehmer", dh. das Programm lief einwandfrei, bevor ich den ganzen Leaderboardkram eingearbeitet habe.
    Jetzt die Kuriosität:
    Nachdem ich mich ins Leaderboard eingetragen habe wird die MoveToStart Funktion aufgerufen, jedoch reagiert jetzt die IsInputKey Funktion nicht mehr auf meine Pfeiltasteneingabe, genauer gesagt: alles steht still..
    Setze ich jedoch einen Breakpoint und gehe step by step durch den Code so funktioniert es prima, nachdem eintragen ins Leaderboard springt das Programm bei Pfeiltasteneingabe in die IsInputKey Funktion...

    Da ich keine Ahnung habe wo das Problem liegt, obs n Einzeiler is oder ich mir ordentlich was zusammengebraut habe, füge ich den kompletten Code mit an und hoffe auf euch!

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Public Class Form1
    4. Dim pausenVariable As Integer
    5. Dim randomize As New Random
    6. Dim randomX As Integer
    7. Dim randomY As Integer
    8. Dim getPoint As Boolean
    9. Dim scoreCount As Integer
    10. Dim upKey As Boolean
    11. Dim downKey As Boolean
    12. Dim leftKey As Boolean
    13. Dim rightKey As Boolean
    14. Dim snake(0 To 2, 0 To 9) As Integer
    15. Dim Schlange(256) As System.Windows.Forms.Label
    16. Dim RichtungSchlange As Integer = 0 '0 = Stop, 1 = hoch, 2 = runter, 3 = links, 4 = rechts
    17. Dim timerCounter As Integer
    18. Dim leaderboard As New List(Of String)
    19. Dim rank As Integer
    20. Public Sub New()
    21.  
    22. ' Dieser Aufruf ist für den Designer erforderlich.
    23. InitializeComponent()
    24. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    25. For index As Integer = 0 To 255
    26. Schlange(index) = New System.Windows.Forms.Label
    27. Schlange(index).Size = New System.Drawing.Size(10, 10)
    28. Schlange(index).BackColor = Color.Black
    29. Schlange(index).BorderStyle = BorderStyle.Fixed3D
    30. Schlange(0).Visible = True
    31. Me.Panel1.Controls.Add(Schlange(index))
    32. Next
    33. ' Leaderboard/bestenliste einlesen
    34. Using sr As New StreamReader("C:\Users\Labor\Documents\Visual Studio 2010\Projects\snakePfeiltasten\Leaderboard.txt")
    35. ' bis dateiende lesen
    36. While (sr.Peek <> -1)
    37. Dim zeile = sr.ReadLine()
    38. ' zur hauptliste hinzufügen
    39. leaderboard.Add(zeile)
    40. End While
    41. ' streamreader schliessen
    42. End Using
    43. MoveToStart()
    44. End Sub
    45. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    46. checkCrash()
    47. checkWallCrash()
    48. 'Bewegung der Schlange merken
    49. For index As Integer = 255 To 1 Step -1
    50. Schlange(index).Location = New Point(Schlange(index - 1).Location.X, Schlange(index - 1).Location.Y)
    51. Next
    52. 'Bewegen der Schlange
    53. If (upKey = True) Then
    54. Schlange(0).Location = New Point(Schlange(0).Location.X, Schlange(0).Location.Y - 10)
    55. RichtungSchlange = 1
    56. ElseIf (downKey = True) Then
    57. Schlange(0).Location = New Point(Schlange(0).Location.X, Schlange(0).Location.Y + 10)
    58. RichtungSchlange = 2
    59. ElseIf (leftKey = True) Then
    60. Schlange(0).Location = New Point(Schlange(0).Location.X - 10, Schlange(0).Location.Y)
    61. RichtungSchlange = 3
    62. ElseIf (rightKey = True) Then
    63. Schlange(0).Location = New Point(Schlange(0).Location.X + 10, Schlange(0).Location.Y)
    64. RichtungSchlange = 4
    65. End If
    66. 'Punkt gefressen
    67. If (Schlange(0).Location = Label2.Location) Then
    68. getPoint = True
    69. scoreCount = scoreCount + 1
    70. Schlange(scoreCount).Visible = True
    71. Label1.Text = scoreCount
    72. Label1.Visible = True
    73. Timer2.Start()
    74. If Timer1.Interval > 50 Then
    75. Timer1.Interval = Timer1.Interval - 5
    76. End If
    77. End If
    78. 'Neuen zufälligen Punkt erstellen
    79. If (getPoint) Then
    80. randomX = randomize.Next(1, 48) * 10
    81. randomY = randomize.Next(1, 48) * 10
    82. Label2.Location = New Point(randomX, randomY)
    83. getPoint = False
    84. End If
    85. End Sub
    86. 'prüft, ob die schlange sich selbst gebissen hat. falls ja, wird der scorecount geprüft und ggf. ein eintrag in der bestenliste vollzogen
    87. Private Sub checkCrash()
    88. Dim j As Integer
    89. If scoreCount > 0 Then
    90. While (j < scoreCount - 1)
    91. j = j + 1
    92. If Schlange(j + 1).Location = Schlange(0).Location Then
    93. Timer1.Stop()
    94. MessageBox.Show("Oops, you crashed!!")
    95. If scoreCount > leaderboard(9) Then
    96. Label3.Text = scoreCount
    97. checkLeaderboard()
    98. Else
    99. MoveToStart()
    100. End If
    101. End If
    102. End While
    103. End If
    104. End Sub
    105. 'setzt die wichtigen variablen zurück und setzt das spiel auf den startzustand
    106. Private Sub MoveToStart()
    107. getPoint = False
    108. scoreCount = 0
    109. For index As Integer = 1 To 255
    110. Schlange(index).Visible = False
    111. Schlange(index).Location = Nothing
    112. Next
    113. Schlange(0).Location = New Point(250, 250)
    114. upKey = False
    115. downKey = False
    116. leftKey = False
    117. rightKey = False
    118. randomX = randomize.Next(1, 48) * 10
    119. randomY = randomize.Next(1, 48) * 10
    120. Label2.Location = New Point(randomX, randomY)
    121. Label1.Visible = False
    122. End Sub
    123. 'über RichtungSchlange wird die aktuelle fahrtrichtung der schlange gemerkt und eine 180° wendung ausgeschlossen
    124. Protected Overrides Function IsInputKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
    125. Select Case keyData
    126. Case Keys.Up
    127. If RichtungSchlange <> 2 Then
    128. leftKey = False
    129. rightKey = False
    130. upKey = True
    131. End If
    132. Timer1.Start()
    133. Return True
    134. Case Keys.Down
    135. If RichtungSchlange <> 1 Then
    136. leftKey = False
    137. rightKey = False
    138. downKey = True
    139. End If
    140. Timer1.Start()
    141. Return True
    142. Case Keys.Left
    143. If RichtungSchlange <> 4 Then
    144. upKey = False
    145. downKey = False
    146. leftKey = True
    147. End If
    148. Timer1.Start()
    149. Return True
    150. Case Keys.Right
    151. If RichtungSchlange <> 3 Then
    152. upKey = False
    153. downKey = False
    154. rightKey = True
    155. End If
    156. Timer1.Start()
    157. Return True
    158. End Select
    159. End Function
    160. 'bei kollision mit einer wand wird die schlange automatisch auf die entferntere ecke abgelenkt
    161. Private Sub checkWallCrash()
    162. If RichtungSchlange = 1 And Schlange(0).Location.Y = 0 Then
    163. If Schlange(0).Location.X > 245 Then
    164. upKey = False
    165. leftKey = True
    166. RichtungSchlange = 3
    167. ElseIf Schlange(0).Location.X < 245 Then
    168. upKey = False
    169. rightKey = True
    170. RichtungSchlange = 4
    171. End If
    172. End If
    173. If RichtungSchlange = 2 And Schlange(0).Location.Y = 480 Then
    174. If Schlange(0).Location.X > 245 Then
    175. downKey = False
    176. leftKey = True
    177. RichtungSchlange = 3
    178. ElseIf Schlange(0).Location.X < 245 Then
    179. downKey = False
    180. rightKey = True
    181. RichtungSchlange = 4
    182. End If
    183. End If
    184. If RichtungSchlange = 3 And Schlange(0).Location.X = 0 Then
    185. If Schlange(0).Location.Y > 245 Then
    186. leftKey = False
    187. upKey = True
    188. RichtungSchlange = 1
    189. ElseIf Schlange(0).Location.Y < 245 Then
    190. leftKey = False
    191. downKey = True
    192. RichtungSchlange = 2
    193. End If
    194. End If
    195. If RichtungSchlange = 4 And Schlange(0).Location.X = 480 Then
    196. If Schlange(0).Location.Y > 245 Then
    197. rightKey = False
    198. upKey = True
    199. RichtungSchlange = 1
    200. ElseIf Schlange(0).Location.Y < 245 Then
    201. rightKey = False
    202. downKey = True
    203. RichtungSchlange = 2
    204. End If
    205. End If
    206. End Sub
    207. 'für 2 sekunden wird bei jedem neuen gefressenem punkt der scorecount auf der spielfläche angezeigt
    208. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    209. timerCounter = timerCounter + 1 '1 tick = 0,5 s
    210. If timerCounter = 2 Then
    211. Timer2.Stop()
    212. Label1.Visible = False
    213. timerCounter = 0
    214. End If
    215. End Sub
    216. 'prüft, ob der scorecount für eine platzierung in der bestenliste reicht und wenn ja wo. zeigt bei ja eine groupbox an in welcher man einen namen einträgt
    217. Private Sub checkLeaderboard()
    218. Select Case scoreCount
    219. Case leaderboard(9) + 1 To leaderboard(7)
    220. rank = 8
    221. enterNameGroupBox.Visible = True
    222. Case leaderboard(7) + 1 To leaderboard(5)
    223. rank = 6
    224. enterNameGroupBox.Visible = True
    225. Case leaderboard(5) + 1 To leaderboard(3)
    226. rank = 4
    227. enterNameGroupBox.Visible = True
    228. Case leaderboard(3) + 1 To leaderboard(1)
    229. rank = 2
    230. enterNameGroupBox.Visible = True
    231. Case Is > leaderboard(1)
    232. rank = 0
    233. enterNameGroupBox.Visible = True
    234. End Select
    235. End Sub
    236. 'sobald ein buchstabe eingegeben ist, soll dieser als name bestätigt werden können
    237. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    238. Button1.Enabled = True
    239. End Sub
    240. 'mit ("accept"-button) bestätigtem namen wird die leaderboardgroupbox aktualisiert angezeigt, gespeichert und die groupbox für die namenseingabe für das nächste mal vorbereitet
    241. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    242. ' Leaderboard überschreiben
    243. For index As Integer = 9 To rank Step -1
    244. If index = 1 Then
    245. Exit For
    246. End If
    247. leaderboard(index) = leaderboard(index - 2)
    248. Next
    249. leaderboard(rank) = TextBox1.Text
    250. leaderboard(rank + 1) = scoreCount
    251. Using writer As StreamWriter =
    252. New StreamWriter("C:\Users\Labor\Documents\Visual Studio 2010\Projects\snakePfeiltasten\Leaderboard.txt")
    253. For index As Integer = 0 To 9
    254. writer.WriteLine(leaderboard(index))
    255. Next
    256. End Using
    257. enterNameGroupBox.Visible = False
    258. Label4.Text = leaderboard(0)
    259. Label5.Text = leaderboard(1)
    260. Label6.Text = leaderboard(2)
    261. Label7.Text = leaderboard(3)
    262. Label8.Text = leaderboard(4)
    263. Label9.Text = leaderboard(5)
    264. Label10.Text = leaderboard(6)
    265. Label11.Text = leaderboard(7)
    266. Label12.Text = leaderboard(8)
    267. Label13.Text = leaderboard(9)
    268. LeaderboardGroupBox.Visible = True
    269. Button1.Enabled = False
    270. End Sub
    271. 'der button "play again" in der leaderboardgroupbox
    272. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    273. LeaderboardGroupBox.Visible = False
    274. MoveToStart()
    275. End Sub
    276. End Class
    Willkommen im Forum. :thumbup:

    TimoDerPraktikant schrieb:

    IsInputKey
    schmeiß raus, nimm die .NET-Methode:

    VB.NET-Quellcode

    1. Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    2. Select Case e.KeyData
    und setz zusätzlich im Designer der Form KeyPreview = True.
    Ferner mach Option Strict On.
    Gib der Datei eine Variable als Namen und behandle den Initialzustand, wo die Datei nicht vorhanden ist.
    Da die Richtung nicht gleichzeitig mehr als eins von { links, rechts, hoch, runter } sein kann, 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!

    TimoDerPraktikant schrieb:

    Option Strict On ist mir noch zu hoch
    Deine Einstellung ist hier leider falsch.
    Da Du noch nicht lange dabei bist, solltest Du sofort richtig lernen, mit Datentypen korrekt umzugehen.
    Salopp gesagt ist bei Strict Off "1" und 1 dasselbe, also ein String mit dem Inhalt "1" wird bei Verwendung als numerischer Wert in eine 1 konvertiert, ein numerischer Wert 1 wird bei Anzeige in den String "1" konvertiert.
    So weit so gut.
    Aber bald kommt der Fall, dass da keine "1", sondern "Roullade mit Klößen" im String steht, und dann bist Du der Erste, der sich beschwert, dass sich "Roullade mit Klößen" nicht in einen numerischen Wert konvertieren lässt.
    Um dies zu vermeiden, solltest Du sofort ordentlich lernen, mit Option Strict On zu programmieren.
    Und wenn Du das verinnerlicht hast, wirst Du es nicht mehr missen wollen.
    Übrigens gibt es den Zustand Strict Off bei C / C++ / C# und anderen Sprachen nicht, da ist überall Strict On.
    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!