Announcement

Collapse
No announcement yet.

mehrere Timer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • mehrere Timer

    Hallo

    ich versuche ein Kartenspiel zu schreiben. Bin auch fast fertig, nur die Anzeige des Gewinns und Verlustes machen mir gerade das Leben schwer.
    Diese sollen nach dem klicken auf eine von 4 Karten in der Mitte des Bildschirms nach einander für ca 2 Sekunden angezeigt werden.

    Mein Problem ist nun, dass ich nicht weiß wie ich mehrere Events hintereinander zeitverzögert ausführen kann. Ein Timer ist kein Problem, aber was tun bei mehreren?

    Hier ein Auszug des relevanten Codes:
    Code:
            private void KarteA_Click(object sender, EventArgs e)
            {
                        int temp_gain = KarteA_gain[A_Runde];
                        int temp_loss = KarteA_loss[A_Runde];
                        ergebnis = temp_gain - temp_loss;
    
                        this.KarteA.Enabled = false;
                        this.KarteA.Image = global::IGTmod.Properties.Resources.black;
    
                        mytimer.Interval = 3000;
                        mytimer.Tick += new EventHandler(Bildwechsel_A);
                        mytimer.Start();
    }
    
     private void Bildwechsel_A(object sender, EventArgs e)
            {
                this.KarteA.Image = global::IGTmod.Properties.Resources.test_back;
                this.KarteA.Enabled = true;
            }
    Um nochmal kurz zu erklären wie der Ablauf aussehen soll. Man klickt auf die Karte, diese wird deaktiviert. Dann folgt der Gewinn für 2 Sekunden, dann der Verlust und anschließend wird alles von einem Kontostand abgezogen.
    Wie kann ich das über den Timer lösen? Hab schon alles mögliche versucht und auch schon viel gegoogelt, aber irgendwie steh ich aufm Schlauch!

  • #2
    Hallo,

    die Aufgabe ist mit einem Workflow vergleichbar, wobei der jeweils auszuführende Schritt vom Zustand abhängt. Wenn auf die Karte geklickt wird, wird diese deaktivert (Zustand A) und der Timer gestartet. Wenn der Timer feuert und der Zustand A aktiv ist, wird der Gewinn angezeigt (Zustand B) und der Timer erneut gestartet. Wenn der Timer feuert und der Zustand B aktiv ist, wird der Gewinn verborgen und der Verlust (Zustand C) angezeigt sowie der Timer neu gestartet. Das Ganze wiederholt sich mit dem gleichen Timer-Ereignis solange, bis der Workflow alle Zustände abgearbeitet hat.

    Comment


    • #3
      Hey Andreas, erstmal danke für deine Antwort. Habe es jetzt so gelöst:

      Code:
      private void KarteA_Click(object sender, EventArgs e)
              {
                      if (A_Runde <= 40) //Es soll nur 40 Karten pro Deck geben. Insgesamt gibt es 4 Decks A,B,C,D mit jeweils 40 Karten. Jedes Spiel dauert 100 Durchgänge
                      {
                          
                          temp_gain = KarteA_gain[A_Runde]; //Gewinn aus Array
                          temp_loss = KarteA_loss[A_Runde]; //Verlust aus Array
                          ergebnis = temp_gain - temp_loss;
               
                          this.backblackA.Visible = true; //soll aussehen als sei Karte umgedreht
                          this.GewinnBox.Visible = true; //Gewinn anzeigen
                          this.smilyGewinnBox.Visible = true; //lachender Smily bei Gewinn
                          this.pictureBox2.Visible = false; //Anzeige "Bitte Karte auswählen" ausblenden
                          Utility.playSoundFromResource("winsound2"); //Sound bei Gewinn abspielen
                          step = 0;
                          mytimer.Interval = 3000;
                          mytimer.Tick += new EventHandler(Bildwechsel_A);
                          mytimer.Start();
                          
                          
      
                          A_Runde++;
                          runde++;
      
                          //Ergebnisse in Datei schreiben
                              string sLines = "" + runde + "\t" + "A'\t" + temp_gain + "\t" + temp_loss + "\t" + konto + "\r\n";
                              StreamWriter myFile = new StreamWriter(filename, true);
                              myFile.Write(sLines);
                              myFile.Close();
                      }
                      else
                      {
                          this.KarteA.Image = global::IGTmod.Properties.Resources.blackback;
                      }
                      
      }
      
             private void Bildwechsel_A(object sender, EventArgs e)
              {
      
                  step++;
      
                      switch (step)
                      {
                          case 1:
                              this.smilyGewinnBox.Visible = false; //Gewinn Smily wird ausgeblendet
                              this.SmilyVerlustBox.Visible = true; //damit Verlust Smily angezeigt werden kann
                              this.GewinnBox.Visible = false; //Gewinn ausblenden
                              this.VerlustBox.Visible = true; //Verlust anzeigen
                              Utility.playSoundFromResource("losesound1"); //Verlustsound abspielen
                          
                              break;
                          case 2:
                              this.VerlustBox.Visible = false; 
                              this.SmilyVerlustBox.Visible = false;
                              this.pictureBox2.Visible = true; // vorher über fb=Bitte Karte auswählen angezeigt
                              fb = "Bitte warten"; //jetzt soll bitte warten angezeigt werden
                              this.pictureBox2.Invalidate();
                              this.KontostandBox.Invalidate(); //und die Kontostandanzeige über Balken aktualisieren
                              break;
                          case 3:
                              int latenz; //Hier soll eine gewisse Zeit gewartet werden, die man in einem Einstellungsmenü festlegen kann
                              latenz = m_Config.Latenz * 1000;
                              System.Threading.Thread.Sleep(latenz);
                              break;
                          case 4: //hier nach soll alles wieder so aussehen wie zuvor
                              fb = "Bitte Karte auswählen"; 
                              this.pictureBox2.Invalidate();
                              this.backblackA.Visible = false;
                              break;     
                  }
                  
                  
                  
              }
      Problem ist nur, es klappt beim ersten Durchgang, aber nicht mehr ab dem zweiten...

      Comment


      • #4
        Originally posted by klaus007 View Post
        Problem ist nur, es klappt beim ersten Durchgang, aber nicht mehr ab dem zweiten...
        Und was ist mit meinen letzten Vorschlägen gestern um 13.07 Uhr? Jürgen

        PS. Du siehst hier deutlich das Problem von gleichzeitigen Posts in mehreren Foren: verschiedene Antworten, die nichts voneinander wissen...

        Comment


        • #5
          Problem ist gelöst!
          Lag am Konstruktor!

          Vielen Dank für deine Hilfe!

          LG,
          Klaus


          PS.: Was ist so schlimm daran in meheren Foren nach zu fragen?

          Comment

          Working...
          X