2013-05-14 3 views
0

나는 임의의 시간을 설정하는 논리를 파악하고 그 시간을 다른 속도 (예 : .5x 또는 4x 실시간)로 "재생"하도록하려고합니다.Java : 속도 향상 및 감속 시간

import java.util.Calendar; 


public class Clock { 


    long delta; 
    private float speed = 1f; 

    public Clock(Calendar startingTime) { 
     delta = System.currentTimeMillis()-startingTime.getTimeInMillis(); 
    } 

    private Calendar adjustedTime() { 
     Calendar cal = Calendar.getInstance(); 

     cal.setTimeInMillis(System.currentTimeMillis()-delta); 

     return cal; 

    } 

    public void setPlaybackSpeed(float speed){ 
     this.speed = speed; 
    } 

    public static void main(String[] args){ 


     Calendar calendar = Calendar.getInstance(); 
     calendar.set(2010, 4, 4, 4, 4, 4); 
     Clock clock = new Clock(calendar); 

     while(true){ 
      System.out.println(clock.adjustedTime().getTime()); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 


} 

을 나는 "속도"속성이 논리에 사용되는 필요가있는 알아내는 데 문제 : 다음

정상 속도로 시간을 재생합니다 내가 지금까지 가지고있는 논리이다.

+0

실시간 및 사용자 정의 시계 간의 관계는 간단합니다. 즉, 현실 세계를 통과 한 매 초마다, 당신의 시계는'속도'초를 틱합니다. 'T_clock = 속도 * T_real'. 나머지는 시계의 인터페이스를 정의하는 방법입니다. –

+1

밀리 초 타이밍 만 있으면 캘린더가 너무 비쌉니다. 나는 long과'System.currentTimeMillis()'를 사용할 것이다. –

답변

2

다음 코드는 내부 상태가 double sppedlong startTime 인 시계를 디자인하는 예를 보여줍니다. 게시 메서드 getTime()을 표시합니다.이 메서드는 1970 년 1 월 1 일 자정부터 밀리 초 단위로 조정 된 시간을 반환합니다. 조정은 startTime 이후에 발생합니다.

조정 된 시간을 계산하는 공식은 간단합니다. 먼저 currentTimeMillis()startTime 씩 뺀 다음이 값에 speed을 곱하여 조정 된 시간대를 얻은 다음 startTime에 추가하여 결과를 얻으십시오.

public class VariableSpeedClock { 

    private double speed; 
    private long startTime; 

    public VariableSpeedClock(double speed) { 
     this(speed, System.currentTimeMillis()); 
    } 

    public VariableSpeedClock(double speed, long startTime) { 
     this.speed = speed; 
     this.startTime = startTime; 
    } 

    public long getTime() { 
     return (long) ((System.currentTimeMillis() - this.startTime) * this.speed + this.startTime); 
    } 

    public static void main(String [] args) throws InterruptedException { 

     long st = System.currentTimeMillis(); 
     VariableSpeedClock vsc = new VariableSpeedClock(2.3); 

     Thread.sleep(1000); 

     System.out.println(vsc.getTime() - st); 
     System.out.println(System.currentTimeMillis() - st); 

    } 
}