2017-05-04 2 views
0

Ich erstelle ein Arcade-Spiel für eine Klasse. Das Spiel ist Spalten. Ich versuche, alle frei schwebenden Blöcke einmal pro Sekunde fallen zu lassen. Mein Code, um sie fallen zu lassen funktioniert, aber der Timer nicht. Hier sind die relevanten Teile meines Codes.Swing-Timer funktioniert nicht

Diese ersten beiden erscheinen in meinem Blockmanager Objekt, das ich benutze die interne Logik UI

public void play(){ 
    t = new Timer(1000, this); 
    t.start(); 
    } 
public void actionPerformed(ActionEvent e) { 
    for(int v = 0;v < this.x; v++){ 
     if(v > this.x || v < 0){ 
      break; 
      } 
      for(int b = 0;b < this.y ;b++){ 
       this.gameScreen.get(v).get(b).setActive(true); 
      } 
     } 
     for(int i = 0;i < this.x; i++){ 
      if(i > this.x || i < 0){ 
       break; 
      } 
      for(int j = 0;j < this.y ;j++){ 
       if(this.gameScreen.get(i).get(j).getActive() == true){ 
        if(j + 1 < this.y){ 
         if(this.gameScreen.get(i).get(j+1).toString().equals(".")){ 
    Collections.swap(this.gameScreen.get(i), j, j+1); 
    this.gameScreen.get(i).get(j+1).setActive(false); 
         } 
        } 
       } 
      } 
     } 
    } 

this is the main method that is another file. 

public static void main(String[] args){ 
    ColumnsUI Col = new ColumnsUI(9,9); 
    Col.game.nextBlock(); 
    Col.gw.add(Col.show); 
    Col.game.play(); 
} 

Die Spalten zu verwalten Objekt ist eine einfache Methode, die auf der internen Logik basierenden Farben. Ich bezweifle, dass es etwas mit der Fehlfunktion des Timers zu tun hat, da es funktionierte, als ich den Inhalt von actionPerformed manuell anrief.

Danke für jede Hilfe!

+0

„Mein Code ihnen Werke fallen, aber der Timer nicht.“ Bitte mehr Informationen liefern als „funktioniert nicht.“ Was haben Sie passieren erwartet zu ? Was ist stattdessen passiert? – VGR

+0

Ich habe erwartet, dass der Code in actionPerformed ausgeführt wird. Wenn ich es außerhalb dieser Methode bewegte und es manuell ausführte, tat es genau das, was es beabsichtigte, das heißt, es bewegte die Blöcke nach unten. –

+0

Ist es möglich, dass 'Col.game.play();' eine andere play() Methode als die in Ihrer Frage gezeigte ausführt? – VGR

Antwort

-1

Der actionPerfomed wird aufgerufen, wenn ein Ereignis eintritt. Sie sollten eine separate Klasse für den Timer erstellen. Wie in diesem Code muss natürlich die Task-Klasse durch Ihren Code ersetzt werden, der die Bausteine ​​verschiebt.

Timer timer = new Timer(); 

// Start in 1 second and then all 5 seconds forever repatedly 
timer.schedule(new Task(), 1000, 5000); 

haben Sie einen Blick auf die Java API for TimerTask

+0

Dies ist aus zwei Gründen falsch: Erstens ist es nicht notwendig, eine separate Klasse für einen ActionLiStener zu erstellen. zwei, Sie beziehen sich auf java.util.Timer, aber diese Frage ist über javax.swing.Timer. – VGR

+0

@VGR Wenn Sie die Frage gelesen hätten, wüssten Sie, dass er den Code innerhalb der actionPerfrmed-Methode ausführen möchte. Ich glaube nicht, dass er so eine Methode braucht. TimerTask erledigt die Aufgabe sehr gut. Ich habe schon für meine swingbasierten Spiele verwendet;) –

+1

Du hast es rückwärts. Swing-Code * muss * im AWT-Ereignisversand-Thread ausgeführt werden. javax.swing.Timer macht das automatisch; java.util.Timer nicht. – VGR

Verwandte Themen