2012-02-05 4 views
1

저는이 간단한보기를 만들었습니다. 일정 기간 동안 왼쪽에서 오른쪽으로 이동하는 빨간색 선을 애니메이션으로 만들어야합니다 (DURATION). 매번 DELAY의 위치를 ​​업데이트해야합니다. 원한다면 애니메이션을 더 부드럽게 조정할 수 있습니다. 필자는 에뮬레이터에서이 문제를 테스트하고 있습니다. 글쎄, 내가 DELAY을 증가 시키면 전체 애니메이션 시간에 영향을주지 않아도 애니메이션이 더 빨리 끝납니다. 나는 단순히 너무 빠르게 움직이고, 모든 리소스를 먹고 있는가? 아니면 내 수학은 꺼져 있니?캔버스에서 움직이는 선 애니메이션하기

public class AnimView extends View { 

    // Animation duration in milliseconds 
    private static final int DURATION = 4000; 

    // Update frame every delay (in milliseconds) 
    private static final int DELAY = 10; 

    private int pos; 
    private long lastTick; 
    private Paint paint; 

    public AnimView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     pos = 0; 
     lastTick = 0; 
     paint = new Paint(); 
     paint.setColor(Color.RED); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     if(System.currentTimeMillis() - lastTick >= DELAY) { 
      // Calculate a new position for the line 
      pos += (int) (((double) DELAY/DURATION) * getWidth()); 

      lastTick = System.currentTimeMillis(); 
     } 

     canvas.drawRect(pos, 0, pos + 1, getHeight(), paint); 

     if(pos < getWidth()) { 
      // Position is still below getWidth, keep animating 
      postInvalidate(); 
     } 

    } 

} 
+1

어디 lastTick을 바꿀까요? –

답변

2

당신은 if 문에 lastTick를 업데이트해야합니다 DELAY 통과 후

long currentTime = System.currentTimeMillis(); 
if(currentTime - lastTick >= DELAY) { 
    // Calculate a new position for the line 
    pos += (int) (((double) DELAY/DURATION) * getWidth()); 
    lastTick = currentTime; 
} 

그렇지 않으면 각 시간을 그릴 것입니다. 따라서 DELAY를 늘리면 드로잉이 줄어들고 프로그램이 더 빨리 끝납니다.

+0

그래, 코드를 업데이트했는데 문제는 같았지만 해결 된 몇 가지 추가 테스트가있었습니다. 감사. –

1

이 스레드에 약간의 추가 색상을 추가하려면 게임 개발에서 잘 알려진 문제입니다. "고정 시간 단계와 가변 시간 간격"을 검색하면 많은 리소스를 찾을 수 있습니다. 예를 들어 http://gafferongames.com/game-physics/fix-your-timestep/

애니메이션의 속도는 순간. 이것이 바로 이전 NES 메가맨 게임에서 CPU가 그 엔티티에 대한 모든 데이터를 계산할 때 더 많은 시간이 소요 되었기 때문에 한 번에 많은 적을 화면에 표시했을 때 속도가 느려지므로 각 프레임이 처리하는 데 더 오래 걸렸습니다). 당신은 애니메이션의 각 프레임 사이에 진행 시간의 양에 의해 각각의 움직임을 곱 변수 시간 단계에

  1. 이동 :

    이 문제를 해결 두 가지 방법이 있습니다. 그렇게하면 어떤 이유로 든 금액이 변경 될 때 애니메이션이 동일하게 보입니다.

  2. 드로잉하는 속도에 관계없이 업데이트 메서드에 전달되는 시간 diff를 제어 할 수 있도록 업데이트 및 드로 단계를 구분합니다.
+0

감사합니다. 이것은 실제로 게임 애완 동물 프로젝트의 시작이었고 귀하의 의견은 매우 관련성이 있습니다. –

관련 문제