[VB12] Timer in einer Klasse generieren und arbeiten lassen...

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    [VB12] Timer in einer Klasse generieren und arbeiten lassen...

    Hi Leute,

    ich beschäftige mich gerade mit Klassen(muss ich ja mal...). Dazu hab ich mir vorgenommen ein kleines Spiel zu machen. Betonung liegt auf klein. Jedenfalls habe ich eine Klasse zum schießen programmiert. Einziges Problem ist, dass ich es nicht hinbekomme einen Timer in der Klasse zu generieren. Der Timer, damit sich das "Geschoss"(Picturebox) bewegt. Ich habe es mit

    VB.NET-Quellcode

    1. '​...
    2. Dim geschoss As New Timer
    3. AddHandler geschoss.Tick, AddressOf geschoss_Tick
    4. geschoss.Interval = 15
    5. geschoss.Start()
    6. Private Sub geschoss_Tick(sender As Object, e As EventArgs)
    7. '[...]
    8. End Sub

    probiert. Leider hat das irgendwie nicht geklappt. Könntet ihr mir da irgendwie behilflich sein?^^ Hoffe mir kann jemand sagen, wie das geht oder mir eine Alternative sagen.

    LG

    ChOoSeMyNaMe

    ErfinderDesRades schrieb:

    problematisch, dass das Snippet so unvollständig ist.
    Ansonsten sieht der Code durchaus so aus, als ob der Timer ticken könnte.

    Wenner das nicht tut, liegts an hier nicht gezeigtem Code bzw. daran, dass der Code falsch eingebaut ist.

    Also ticken tut er nicht... ich füg einfach mal den ganzen Code ein, der für den Timer zu ständig ist.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub New(ByVal view As PictureBox, ByVal damage As Integer)
    2. m_pic.Add(My.Resources.looknorth)
    3. m_pic.Add(My.Resources.lookeast)
    4. m_pic.Add(My.Resources.looksouth)
    5. m_pic.Add(My.Resources.lookwest)
    6. With view
    7. If .Image Is m_pic(0) Then
    8. m_view = playershoot.view.North
    9. ElseIf .Image Is m_pic(1) Then
    10. m_view = playershoot.view.East
    11. ElseIf .Image Is m_pic(2) Then
    12. m_view = playershoot.view.South
    13. ElseIf .Image Is m_pic(3) Then
    14. m_view = playershoot.view.West
    15. End If
    16. End With
    17. dmge = damage
    18. shoot(m_view, view)
    19. End Sub
    20. Private shot As Integer
    21. Private schuss As Point
    22. Dim prichtung As view
    23. Sub shoot(ByVal richtung As view, ByVal player As PictureBox)
    24. Form1.gschoss.Size = New Size(15, 15)
    25. Select Case richtung
    26. Case 0
    27. schuss = New Point(player.Location.X + 10, player.Location.Y - 15)
    28. Case 1
    29. schuss = New Point(player.Location.X + 50, player.Location.Y + 10)
    30. Case 3
    31. schuss = New Point(player.Location.X - 15, player.Location.Y + 10)
    32. Case 2
    33. schuss = New Point(player.Location.X + 10, player.Location.Y + 50)
    34. End Select
    35. prichtung = richtung
    36. Dim geschoss as new Timer
    37. AddHandler geschoss.Tick, AddressOf geschoss_Tick
    38. geschoss.Intervall = 15
    39. geschoss.Start()
    40. End Sub
    41. Private Sub geschoss_Tick(sender As Object, e As EventArgs)
    42. If shot < 15 Then
    43. Select Case prichtung
    44. Case 0
    45. Form1.gschoss.Location = New Point(schuss.X, schuss.Y - 10)
    46. Form1.gschoss.Image = My.Resources.shot
    47. shot += 1
    48. Case 1
    49. Form1.gschoss.Location = New Point(schuss.X + 10, schuss.Y)
    50. Form1.gschoss.Image = My.Resources.shot
    51. shot += 1
    52. Case 2
    53. Form1.gschoss.Location = New Point(schuss.X, schuss.Y + 10)
    54. Form1.gschoss.Image = My.Resources.shot
    55. shot += 1
    56. Case 3
    57. Form1.gschoss.Location = New Point(schuss.X - 10, schuss.Y)
    58. Form1.gschoss.Image = My.Resources.shot
    59. shot += 1
    60. End Select
    61. Else
    62. End If
    63. End Sub


    Dazu sei gesagt, dass der Timer einmal tickt und dann einfach aufhört. Ich hab ihn schon global definiert, hat aber nicht geholfen. LG
    mein erster Blick immer in die Kompilier-Optionen - und:
    mach unbedingt Option Strict On!

    Bei Strict Off - wies bei dir ist - lernst du nie, Datentypen zu unterscheiden, oder was ein Datentyp überhaupt ist.

    Dann liegt der Fehler sicher darin, dass du System.Timers importierst.
    Schmeiß den Import raus, und tu den Timer weg - das ist ein Timer im NebenThread, der macht dir nur Ärger.

    Zieh aus der Toolbox einen Timer aufs Form und alles wird gut.


    Nöö - wird noch lange nicht gut - da sind noch zig weitere Böcke drinne.
    Aber ein nachm annern.

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

    ErfinderDesRades schrieb:

    mein erster Blick immer in die Kompilier-Optionen - und:
    mach unbedingt Option Strict On!

    Bei Strict Off - wies bei dir ist - lernst du nie, Datentypen zu unterscheiden, oder was ein Datentyp überhaupt ist.

    Dann liegt der Fehler sicher darin, dass du System.Timers importierst.
    Schmeiß den Import raus, und tu den Timer weg - das ist ein Timer im NebenThread, der macht dir nur Ärger.

    Zieh aus der Toolbox einen Timer aufs Form und alles wird gut.


    Nöö - wird noch lange nicht gut - da sind noch zig weitere Böcke drinne.
    Aber ein nachm annern.

    OK dann danke ich dir erstmal^^ Ich werde dass morgen so erstmal ausprobieren. Ich geh jetzt erstmal schlafen... LG und danke nochmal

    ChOoSeMyNaMe schrieb:

    VB.NET-Quellcode

    1. Dim geschoss As New Timer
    Pack diese Teile aus der Prozedur in die Klasse und schreib noch WithEvents dazu.
    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!
    wenn du in sein Projekt reinguckst - die Timer sind schon in der Klasse.

    Und das ist kontraproduktiv, denn so hatter viel zu viele Timer.
    Ein Timer reicht doch, um eine Art GameLoop zu gewährleisten.


    Ach - @KnubbelName: Bitte unterlasse es, bei jedem Post von dir ein Vollzitat dessen einzufügen, was eh direkt im Post darüber steht.
    Wenn das jeder täte, wäre dieser Thread bald 2 Kilometer lang.