2014-11-24 5 views
0

게임을 진행하면서 애니메이션을 더 매끄럽게 만들기 위해 postDelay()을 사용하고 있습니다. 내가 실행중인 문제는 postDelay() 메서드를 실행하면 메서드가 작동하는 변수가 예기치 않게 변경되지 않는다는 것입니다. 비트 맵이 제대로 그리지 않는 등 이상한 동작이 발생합니다.예상치 못한 변수 변경을 처리하는 핸들러 postDelay()가 발생했습니다.

rotate()가 매우 빠르게이라고
 synchronized private void rotate(int dir) { 
      final int originalAngle = angle; //angle is the suspicious variable 
      final int steps = 4; 

      for (int i = 0; i != steps; i++) { 
       smoothAnimateRotate(i, steps, originalAngle, dir); 
      } 
      finishAnimateRotate(steps); 
     } 

     private void smoothAnimateRotate(final int i, final int steps, final int originalAngle, final int dir) { 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        angle = originalAngle + dir*(90*(i+1))/steps; 
        rotateStep(); 
       } 
      }, 100 * (i + 1)); 
     } 


     private void rotateStep() { 
      angle = (angle+1800) % 360; 
      viewdx = (int) (Math.cos(radify(angle))*(1<<16)); 
      viewdy = (int) (Math.sin(radify(angle))*(1<<16)); 
      moveStep(); 
     } 

     private void moveStep() { 
      notifyViewerRedraw() ; 
      try { 
       Thread.currentThread().sleep(25); 
      } catch (Exception e) { } 
     } 

, 나는 어떻게 든 변수 angle가 엉망이됩니다 생각 : 여기

는 귀찮은 부분입니다. 약 1 초 간격으로 rotate()을 호출하면 이런 일이 발생하지 않지만, 내가 매우 빠르게 수행하면 angle은 0, 90, 180 또는 270으로 45도 또는 다른 것으로 변경됩니다. 나는 이유를 알 수 없으며 디버깅은 유익한 결과를 제공하지 못했습니다. 그렇다면 어떻게하면 angle이 예상치 못한 방식으로 수정 될 수 있습니까?

답변

0

해결했습니다. Runnables 안에 isRunning이라는 부울을 넣고 켜고 껐다.

synchronized private void rotate(int dir) { 
    final int originalAngle = angle; 
    final int steps = 4; 

    if (!isRunning) { 
     for (int i = 0; i != steps; i++) { 
      smoothAnimateRotate(i, steps, originalAngle, dir); 
     } 
     finishAnimateRotate(steps); 
    } 
} 

private void smoothAnimateRotate(final int i, final int steps, final int originalAngle, final int dir) { 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      isRunning = true; 
      angle = originalAngle + dir*(90*(i+1))/steps; 
      rotateStep(); 
     } 
    }, 100 * (i + 1)); 
} 

private void finishAnimateRotate(final int steps) { 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      rotateFinish(); 
      isRunning = false; 
     } 
    }, 100 * (steps + 1)); 
}