Timer Intervall soll Veränderung bewirken

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Guenter.

    Timer Intervall soll Veränderung bewirken

    Hallo Gemeinde,

    ich habe aus Spaß an der Freude ein kleines Spiel zur Übung programmiert.
    Ein Shape kann mit w,a,s,d gesteuert werden und ein zweites verfolgt das erste.
    Wenn der Timer Intervall vorbei ist, soll eine msgbox erscheinen "nächstes lvl" oder so ähnlich.
    Außerdem soll der Verfolger nun schneller werden.

    Das nächste Problem, an dem ich noch nicht gearbeitet habe, wenn der Verfolger den Spieler berührt, soll das Spiel beendet sein.

    Danach habe ich noch ein Problem, der Spieler darf nicht über den Rand hinaus.

    Mit einem select case habe ich die Tasten festgelegt mit denen der Spieler gesteuert wird.
    Der Verfolger ist so programmiert

    VB.NET-Quellcode

    1. If (player.Location.X < hunter.Location.X) Then
    2. hunter.Left = hunter.Left - 6
    3. End If
    4. ...usw


    Es gibt zwei Timer, den "hunter_timer", wenn der läuft kann der Spieler bewegt werden und der Verfolger erledigt seine Aufgabe, und den lvl_timer. Der lvl_timer läuft parrallel zum hunter_timer. Nach dem Intervall soll eben eine msgbox kommen und das oben genannte Ereignis folgen.

    VB.NET-Quellcode

    1. lvl_timer.Start()
    2. If lvl_timer.Interval = 6000 Then
    3. hunter_timer.Enabled = False
    4. End If
    5. If lvl_timer.Interval = 6000 Then
    6. MsgBox("nächstes Level")
    7. End If
    8. End Sub


    Wie gesagt, bisher funktioniert der lvl_timer nicht. Wo könnte der Fehler liegen?
    Danach könnte ich einen Ansatz gebrauchen wie das Ereignis startet, das der Verfolger schneller wird.
    Dein Code ergibt nicht sehr viel Sinn.
    Du überprüfst, ob das Interval 6000 ist, zweimal.
    Beim ersten Mal disablest du den anderen Timer, beim zweiten Mal zeigst du eine MsgBox an.

    Der Timer hat ein Tick-Event, das nachdem das Intervall abgelaufen ist aufgerufen wird.
    Die Timer-Eigenschaft "Interval" ist kein Counter, also zählt nicht mit. Sie sollte zu Beginn festgelegt werden und gibt an, wie häufig (bzw. in welchem Abstand) das Tick-Event des Timers geschiet. Setzt du die Interval-Eigenschaft nicht, so bleibt diese Eigenschaft standardmäßig 100 und wird somit die 6000, die du abfragst, nie erreichen.
    Hier jetzt mal alles was ich bisher habe.
    Natürlich etwas gekürzt aus Platzgründen.

    VB.NET-Quellcode

    1. Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    2. 'Tastenbelegung zur Steuerung
    3. If hunter_timer.Enabled = True Then
    4. Select Case e.KeyChar
    5. Case "w"
    6. player.Top = player.Top - 12
    7. player.Width = 30
    8. player.Height = 60
    9. ... usw ...
    10. End Select
    11. End If
    12. Select Case e.KeyChar
    13. Case "w"
    14. hunter_timer.Enabled = True
    15. Case "a"
    16. hunter_timer.Enabled = True
    17. ..usw...
    18. 'bei pausieren kann das Spiel wieder mit Tastendruck gestartet werden um den Spieler direkt weiter zu bewegen
    19. End Select
    20. End Sub
    21. Private Sub hunter_timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles hunter_timer.Tick
    22. 'beide timer laufen parallel. vielleicht zu umständlich? dachte die abfrage weiter unten lässt sich so besser gestalten
    23. If hunter_timer.Enabled = True Then
    24. lvl_timer.Enabled = True
    25. End If
    26. If hunter_timer.Enabled = False Then
    27. lvl_timer.Enabled = False
    28. End If
    29. 'verfolgung des spielers auf der x achse
    30. If (player.Location.X < hunter.Location.X) Then
    31. hunter.Left = hunter.Left - 6
    32. End If
    33. If (player.Location.X > hunter.Location.X) Then
    34. hunter.Left = hunter.Left + 6
    35. End If
    36. 'verfolgung des spielers auf der y achse
    37. ...usw...
    38. End Sub
    39. Private Sub lvl_timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvl_timer.Tick
    40. lvl_timer.Start()
    41. If lvl_timer.Interval = 6000 Then
    42. hunter_timer.Enabled = False
    43. MsgBox("nächstes Level")
    44. End If
    45. 'zu beginn ist der lvl_timer auf 200.000 gestellt, damit sollte die abfrage von 6000 möglich sein
    46. 'zu testzwecken ist die zeit extra niedrig eingestellt
    47. End Sub
    Schau dir mal die Timer-Klasse und ihre Eigenschaften und Methoden in Ruhe an.
    1. Das Timer.Interval legt fest, in welchem Abstand (in ms, 6000 = 6 Sekunden) das Tick-Event aufgerufen(gefeuert) wird. Daher ist die Abfrage des Intervals überflüssig.
    2. Die Timer.Start-Methode startet den Timer. Der Aufruf dieser Methode innerhalb des eigenen Tick-Events (siehe dein lvl_Timer) ist also ebenfalls überflüssig.
    Der Start beider Timer erfolgt einmalig mit deinem Start-Button.
    Das Bewegen deiner Figuren sollte im Timer-Tick-Event durch ändern der Location oder Left oder Top-Eigenschaft erfolgen. Die Geschwindigkeit wird durch eine global definierte Variable (Schrittweite) festgelegt. Bei konstantem Timerinterval kannst du über die Schrittweite die Geschwindigkeit ändern.
    Im KeyPress-Event setzt du lediglich Boolean-Variablen oder noch besser eine Enumeration (hoch, runter, links, rechts). Die abfrage dieser Variablen im Tick-Event bewirkt schließlich die Bewegung.
    Für die "Treffer-Auswertung" gibt es die Rectangle.IntersectWith-Funktion. der übergibst du die beiden Rechtecke und erhältst einen boolschen wert, der dir angibt, ob sich die Rectangles überschneiden.
    Ich hoffe, du hast jetzt die Funktion des Timers verstanden

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Danke schon mal für deinen Beitrag Vatter, er ist sehr hilfreich.
    Nur verstehe ich nicht ganz wie die Bewegungsabläufe in das Timer-tick-Event eingebaut werden können.
    Mit e.KeyChar wird der timer doch nix anfangen können oder?
    Im KeyPress-Event (oder woauchimmer) legst du lediglich fest, was beim nächsten Timer-Event passieren soll. zb "Eins runter", "zwei nach links" oder wasauchimmer. Sobald dieser "Befehl" bearbeitet wurde (im Tick) wird er gelöscht und beim nächsten Tick wird der nächste "Befehl" ausgeführt - oder halt keiner.
    Du erstellst dir eine Enum und eine Variable, die die Bewegungsrichtungen speichert
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Enum _richtung'Enumeration
    2. nüscht
    3. hoch
    4. runter
    5. links
    6. rechts
    7. End Enum
    8. Private Richtung As _richtung'Speichervariable für Bewegungsrichtung

    Dieser Variablen weist du im Keydown_Event den entsprechenden Wert (Select case) zu.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Bewegung starten
    2. Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    3. Select Case e.KeyCode
    4. Case Keys.A
    5. Richtung = _richtung.hoch
    6. Case Keys.B
    7. Richtung = _richtung.runter
    8. Case Else
    9. End Select
    10. End Sub
    11. 'hier wird die Bewegung angehalten
    12. Private Sub Form1_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
    13. Richtung = _richtung.nüscht
    14. End Sub


    Im Timer-Tick tuste dann die Bewegungen organisieren
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim SchrittweitePlayer, SchrittweiteJager As Integer
    2. Private Sub Timeröff_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    3. 'Kollisionsprüung
    4. 'Wenn Kollision, dann lvl_Timer.Stop
    5. 'Exit Sub
    6. 'Bewegung Spielerdingens
    7. Select Case Richtung
    8. Case _richtung.hoch
    9. Schwabbel.Top -= SchrittweitePlayer
    10. Case _richtung.links
    11. Schwabbel.Left -= SchrittweitePlayer
    12. Case Else
    13. End Select
    14. 'Bewegung Jägerdingens
    15. If Jäger.Left > Schwabbel.Left Then
    16. 'muttu um SchrittweiteJager nach links
    17. End If
    18. 'usw, usw
    19. End Sub


    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: