Klick-Spiel programmieren mit Countdown

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von PatrickH96.

    Klick-Spiel programmieren mit Countdown

    Hi,

    ich bin Anfänger in VB und nachdem mir mein ursprüngliches Projekt nun doch zu schwer wurde, möchte ich zunächst mit einem simplen Programm beginnen. Konkret hab ich mir gedacht, ich baue ein kleines "Spiel".

    Und zwar soll das so aussehen: Es gibt einen Button, den kann man klicken und die Anzahl der Klicks werden über ein Label ausgegeben. So weit so gut, das hab ich bereits implementiert.
    Nun soll das ganze jedoch etwas herausfordernder werden: Ein Timer soll nach dem ersten Klick ablaufen (sagen wir mal 10 Sek.) und nach Ablauf des Countdowns soll dann der Button ausgrauen und somit "unklickbar" werden.


    Nun meine Frage... wie mache ich sowas am besten? Hat jemand Tipps? :)

    Vielen Dank! :)

    Thema verschoben ~VaporiZed

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Bist Du in WPF oder WinForms unterwegs? In WPF hast Du XAML-Design-Code, in WinForms sowas hier:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    - also das mit dem Handles am Ende der Zeile gibt es in WinForms, in WPF aber nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann hau Dir aus der ToolBox nen Timer auf's Form, stell dessen Interval auf 10000 (Millisekunden, = 10 Sekunden), im Button_Click-EventHandler schreibst Du als Code: "Wenn der Timer nicht aktiviert ist, starte den Timer". Und im Timer_Tick-EventHandler (der aufgerufen wird, wenn die 10 Sekunden rum sind) schreibst Du "deaktiviere Button".
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Kannst Du Deinen Versuch vielleicht in Code darstellen?
    Dann können wir viel besser erkennen, wo der (Denk?)Fehler ist.
    Und bitte immer konkret werden. Welcher Fehler wo mit welchem Wortlaut.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Quellcode

    1. ​Public Class Form1
    2. Private zähler As Integer = 0
    3. Private ButtonTimer As New Timer
    4. Private ButtonCountDown As Integer
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. zähler += 1
    7. Label1.Text = String.Format("{0:0,0}", zähler)
    8. 'Setup Timer
    9. AddHandler ButtonTimer.Tick, AddressOf ButtonTimer_Tick
    10. ButtonTimer.Interval = 10000
    11. ButtonTimer.Start()
    12. 'Disable Button
    13. If ButtonTimer.Interval() = 10000 Then Button1.Enabled = False
    14. End Sub
    15. Private Sub ButtonTimer_Tick(ByVal obj As Object, ByVal e As EventArgs)
    16. 'Decrement ButtonCountDown and if not zero we can just leave and do nothing.
    17. ButtonCountDown -= 1
    18. If Not ButtonCountDown = 0 Then Exit Sub
    19. 'We have reached zero, stop timer and clean up.
    20. ButtonTimer.Stop()
    21. RemoveHandler ButtonTimer.Tick, AddressOf ButtonTimer_Tick
    22. ButtonTimer.Dispose()
    23. 'Enable Button
    24. Button1.Enabled = True
    25. End Sub
    26. Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click
    27. End Sub
    28. End Class



    Das hab ich mal so geschrieben bisher... wie gesagt, ich bin Anfänger und weiß daher nicht, ob das arg verhunzt ist.
    Das Label2 ist ein statischer Text, also da ändert sich nix.
    Naja, als Deinen Code würd ich das nicht bezeichnen. Eher als schamlos abgekupfert von stackoverflow. X(
    Fast alles kommt weg. Zeile#1, #2, #5-#7, #17 und #36 bleiben.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private zähler As Integer = 0
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. zähler += 1
    5. Label1.Text = zähler.ToString
    6. End Sub
    7. End Class

    Dann nochmal Post#2 durchlesen und anwenden:

    VaporiZed schrieb:

    Dann hau Dir aus der ToolBox nen Timer auf's Form, stell dessen Interval auf 10000
    Die Erstellung eines Timers per Code stand da nicht drin.

    ##########

    Sobald Du den Timer auf dem Form hast, machst Du einen Doppelklick drauf und Du kommst im Timer_Tick-EventHandler an, wo es dann weitergeht, sobald Du das hast.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    :huh:
    Ich erklär's mit Bild. 1. Timer auf's Form ziehen (oder n Doppelklick drauf machen), 2. Doppelklick auf die Timerinstanz (namens Timer1) machen. Wenn Du dann nicht automatisch im Codefenster mit dem Timer-EventHandler bist, dann stimmt was mit Deinem Vorgehen oder Deinem Visual Studio nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    PatrickH96 schrieb:

    Ich weiß nicht, wie... ABER: Es läuft!!!
    Schlecht. Also, ersterer Teil. Aber das bessert sich.
    Wie lange der Timer läuft? Davon war nie die Rede …
    Timer-Intervall auf 1000 stellen, wenn Du ein sekündliches Update haben willst, im Timer_Tick-EventHandler mitzählen (indem Du mit einer neuen Countdown-Integervariablen (neben zähler) und einem Startwert von 10 bei jedem "Tick" diese um 1 senkst), den aktuellen Wert ans Label übergeben und die Buttondeaktivierungscode so ändern, dass er nur ausgeführt wird, wenn die Countdown-Variable den Wert 0 erreicht hat. Ach ja, dabei auch gleich den Timer stoppen.
    Ausprobieren. Und wenn's nicht klappt, dann kannste gerne Deinen Versuchscode posten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hab jetzt etwas anderes gemacht. Passt mir für's erste auch.

    Folgendes hätte ich noch gern gewusst:

    Wie kann ich denn das Label auf 0 Klicks zurücksetzen?

    Ich hab einen Button gemacht, wo der Timer zurückgesetzt wird. Nun soll beim Klick darauf aber auch die Zahl im Label wieder auf 0 zurück... bisher wird nur weitergezählt. Also wenn ich 44 Klicks hatte, werden dann 45 daraus.
    So, wie Du den Counter hochgezählt und ans Label gemeldet hast?
    Keine Ahnung, ohne Deinen Code zu sehen, kann ich nur spekulationieren. Und das geht meist schief.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Quellcode

    1. ​Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Button1.Enabled = True
    3. Timer1.Interval = 10000
    4. Timer1.Start()
    5. End Sub


    So sieht der Code von dem "Reset" Button aus. Ich möchte nun, dass er nicht nur den Timer neu startet, sondern auch wieder von 0 zu zählen beginnt. Tut er aber nicht, er macht einfach beim letzten Wert weiter...

    Brauchst Du nochmal den kompletten Code oder kann man damit schon was anfangen?
    Tja, wie gesagt: zähler auf 0 setzen und den Wert ins Label schreiben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.