2016-03-14 5 views
1

Я пытаюсь сделать мой текущий счетчик/таймер ускоряться, когда целые числа становятся меньше. Например, это было бы как 10 ......... 9 ........, 8 ........, 7 ....... 6 .... .. 5 ..... 4 .... 3 ... 2 .. 1.Ускорение таймера?

Текущий код:

private int interval; 
private Timer timer; 

public void startTimer(final Player p, String seconds) { 
    String secs = seconds; 
    int delay = 1000; 
    int period = 1000; 
    timer = new Timer(); 
    interval = Integer.parseInt(secs); 
    timer.scheduleAtFixedRate(new TimerTask() { 

     @Override 
     public void run() { 
      p.sendMessage("" + setInterval(p)); 
     } 

    }, delay, period); 
} 

private final int setInterval(Player p) { 
    if (interval == 1){ 
     timer.cancel(); 
     p.sendMessage(ChatColor.RED + "" + ChatColor.BOLD + "Countdown Finished!"); 
    } 
    return --interval; 
} 
+3

вы получаете какие-либо ошибки или у вас есть вопрос? – Rishi

+0

Простите меня, если я ошибаюсь, но разве вы не печатаете 'n' количество периодов, где' n' - количество секунд, оставшихся на таймере? –

+0

@MichaelA Пожалуйста, уточните свой вопрос. Вы пытаетесь сократить время каждого интервала во время отсчета? –

ответ

1

From the Java docs:

public void scheduleAtFixedRate(TimerTask task, 
        Date firstTime, 
        long period) 

Расписание указанной задачи для повторных фиксированная ставка исполнение, начиная с указанного времени. Последующие казни выполняются приблизительно в с регулярными интервалами, разделенные на указанный период.

Используя этот метод, вы не можете изменить период, потому что этот метод не предназначен для этого. Если вы попытаетесь получить доступ к периоду внутри задачи, компилятор завершится с ошибкой, потому что период не отображается в задаче.

Если вы не хотите обертывать голову вокруг потоков, runnables и метода wait() и хотите придерживаться метода из класса Timer (который, как я полагаю, вы использовали, но для записи, , пожалуйста, добавьте импорт в свой размещенный исходный код, если вы используете методы из другого пакета, который, возможно, имеет документацию!), вместо этого используйте вместо этого public void schedule(TimerTask task, long delay), завернутый в цикл while. Затем вы можете изменить параметр задержки в цикле, и расписание выполняет задачу за другой промежуток времени.

Конечно, вам нужно будет выяснить, как выйти из цикла while, когда отсчет закончится (один «быстрый & грязный» способ будет использовать логическое значение). Но поскольку вы в основном «перезагружаете» таймер на каждой итерации цикла while, timer.cancel() ничего не сделает для вас. Он отменяет один раз, но следующий итерационный таймер просто перезапустит задачу.

1

Один из вариантов заключается в использовании javafx.animation.Timeline.

, например:

import javafx.animation.Interpolator; 
import javafx.animation.KeyFrame; 
import javafx.animation.KeyValue; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class CountDown extends Application { 

    private static final double SPEED_UP_FACTOR = 0.15; // + 15% 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     IntegerProperty counter = new SimpleIntegerProperty(10); 
     Timeline timeline = new Timeline(
       new KeyFrame(Duration.seconds(counter.get()), new KeyValue(counter, 0)) 
     ); 
     counter.addListener((observable, oldValue, newValue) -> { 
      double currentRate = timeline.getRate(); 
      timeline.setRate(currentRate + currentRate * SPEED_UP_FACTOR); // speed up count down 
      System.out.println(newValue); 
     }); 
     timeline.setOnFinished(event -> { 
      System.out.println("CountDown Finished!"); 
      Platform.exit(); 
     }); 
     timeline.play(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

EDIT:

или просто использовать Thread.sleep():

public class CountDown { 

    private static final double SPEED_UP_FACTOR = 0.15; // + 15% 

    public static void main(String[] args) { 
     CountDownTimer timer = new CountDownTimer(10, 1000); 
     new Thread(timer).start(); 
    } 

    static final class CountDownTimer implements Runnable { 

     final int initialValue; 
     final long intervalMillis; 

     CountDownTimer(int initialValue, long intervalMillis) { 
      this.initialValue = initialValue; 
      this.intervalMillis = intervalMillis; 
     } 

     @Override 
     public void run() { 
      int counter = initialValue; 
      double rate = 1; 
      while (counter > 0) { 
       sleep(Math.round(intervalMillis/rate)); 
       rate += rate * SPEED_UP_FACTOR; 
       System.out.println(--counter); 
      } 
     } 

    } 

    private static void sleep(long timeout) { 
     try { 
      Thread.sleep(timeout); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

}