2014-06-14 1 views
0

나는 android와 함께 opengl을 사용하고 있습니다. 나는 단지 놀고있는 물건을 배우려고 노력하고있다. 그리고 삼각형이 떨어지는 곳에 간단한 게임을하기로 결정했다. 그리고 당신은 그들을 "모으기 위해 그들을 가볍게 치거나해야한다 (나의 생각을 훔치지 마라! xD).Android 타이머를 사용하여 그래픽 동작 구현

이 같은 안드로이드 Timer을 사용하고 있습니다 : 타이머가, 모든 40 밀리 초는 y는 하락 삼각형의 각 꼭지점의 좌표 : 그러니까 기본적으로이 코드가 무엇을하고 있는지

Timer t = new Timer(); 
t.scheduleAtFixedRate(new TimerTask() { 

    @Override 
    public void run() { 
     float[] p1Temp = mTriangle.getP1(); 
     float[] p2Temp = mTriangle.getP2(); 
     float[] p3Temp = mTriangle.getP3(); 

     mTriangle.changeCoords(new float[] {p1Temp[0], p1Temp[1] - 0.01f, p1Temp[2], 
              p2Temp[0], p2Temp[1] - 0.01f, p2Temp[2], 
              p3Temp[0], p3Temp[1] - 0.01f, p3Temp[2]}); 

     if (mTriangle.getP1()[1] <= -1.0f || 
      mTriangle.getP2()[1] <= -1.0f || 
      mTriangle.getP3()[1] <= -1.0f) { 
      t.cancel(); 
     } 
    } 

}, 0, 40); 

것은 이것이다 감소합니다. 이 프로세스는 화면 하단에 닿으면 중지됩니다 (즉, 지상에 닿습니다).

내 질문은 이것입니다, 나는 안드로이드에서 openGL을 사용하는 것에 익숙합니다. 이것은 객체의 "움직임"을 처리하는 올바른 방법입니까? 또는 애니메이션/움직임을 구현하는 데 사용해야하는 메서드가 있습니다.

답변

1

내가 본 가장 일반적인 접근 방식은 다소 다릅니다. 각 프레임을 렌더링 할 준비를하는 동안 애니메이션을 업데이트하고 마지막 프레임 이후 경과 한 시간을 기준으로 업데이트하는 것이 더 일반적입니다.

distance는 시간에 속도를 곱하기 때문에 각 개체에 속도 벡터를 할당하면됩니다. 그런 다음 애니메이션을 업데이트 할 시간이되면 마지막 업데이트 이후로 시간차가 생기고 위치에 적용되는 증가는 시간 차이에 속도를 곱한 것입니다. 속도는 선형 모션을 사용하는 한 일정하지만 시간이 지남에 따라 더 복잡한 애니메이션을 변경할 수도 있습니다. 중력, 다른 물체와의 충돌 등으로 인해 발생합니다.

Android에서 OpenGL을 사용하는 경우 렌더링에 GLSurfaceView이 사용되었을 가능성이 큽니다. 기본적으로 GLSurfaceView은 렌더링이 디스플레이 재생 빈도를 따라 잡을 수있는 경우 최대 60fps의 렌더링 기능을 지속적으로 호출합니다.

대략 무엇을 할지는 최종 프레임이 GLSurfaceView.Renderer 구현의 멤버 변수로 렌더링 된 시간을 유지하는 것입니다. 그런 다음 onDraw()이 호출 될 때마다 새 시간을 가져오고이 시간에서 마지막 프레임 시간을 뺍니다. 그런 다음 멤버 변수에 새 시간을 저장하고 시간 증가량에 속도를 곱한 다음 결과를 위치에 추가합니다.

위치가 업데이트 된 후 평소처럼 개체를 렌더링합니다.

는 당신에게 개요를 제공하기 위해, 다음과 내가 비슷한 질문에 대한 내 대답에서 복사 (사이비) 코드의 약간 적응 조각 (Android timing in OpenGL ES thread is not monotonic)이다 lastFrameTime는 멤버 변수입니다

public void onDrawFrame(GL10 gl) { 
    currentTime = SystemClock.elapsedRealtime() 
    deltaTime = currentTime - lastFrameTime 
    lastFrameTime = currentTime 
    update animation based on deltaTime 
    draw frame 
} 

, currentTime은 지역 변수입니다.

+0

글쎄,이 새끼들, 처음부터 시작해야 할 것 같아. 어쨌든 나에게 올바른 길을 보여줄 시간을내어 주셔서 감사합니다 :) – Ogen

+0

Lol, 내 upvote 및 허용 대답은 당신을 4K 담당자 휴식하게 만들었습니다. – Ogen

관련 문제