2010-04-04 2 views
2

0부터 카운트하거나 특정 숫자에서 카운트 다운하는 기능이있는 일반 타이머를 만들고 있습니다. 나는 또한 사용자가 시간을 더하고 빼기를 원한다. 타이머가 어떤 숫자에서부터 카운트 다운되는 경우를 제외하고는 모든 것이 구현하기가 쉽고 사용자는 타이머를 더하거나 뺍니다.시간에 추가 할 수있는 카운트 다운 타이머 알고리즘

예를 들어 :

float Timer::GetElapsedTime() { 
    if (m_forward) { 
    m_elapsedTime += m_clock.GetElapsedTime() - m_elapsedTime; 
    } else { 
    m_elapsedTime -= 
     m_elapsedTime - m_startingTime + m_clock.GetElapsedTime(); 
    } 
    return m_elapsedTime; 
} 

이 좀 더 명확 타이머가 카운트 다운 100에서 시작 상상하기 (m_clock는 SFML의 시계의 인스턴스입니다). 10 초 후에 위의 함수는 100 -= 100 - 100 + 10과 같으며 90과 같습니다. 20 초 후에 호출 되었다면 90 -= 90 - 100 + 3070과 같습니다.

정상적인 계산에서는 작동하지만 AddTime() (m_elapsedTime + = arg)을 호출하면 역방향 계산 알고리즘이 실패합니다.

더 많은 회원을 사용하고 이전 시간 등을 추적 할 수 있다는 것을 알고 있습니다.하지만 분명히 구현이 누락되었는지 궁금합니다. 그 단일 작업에서 가능한 한 간단하게 유지하는 것이 좋습니다.

답변

3

코드가 불필요하게 복잡합니다.

float Timer::GetElapsedTime() { 
    if (m_forward) { 
    m_elapsedTime = m_clock.GetElapsedTime(); 
    } else { 
    m_elapsedTime = m_startingTime - m_clock.GetElapsedTime(); 
    } 
    return m_elapsedTime; 
} 

희망 AddTime()이 작동하지 않는 이유를 설명 : 다음은 동일합니다 m_elapsedTimeGetElapsedTime() 모든 호출에 대체되고있다.

float Timer::GetElapsedTime() { 
    float elapsedTime = m_forward 
         ? m_clock.GetElapsedTime() 
         : m_startingTime - m_clock.GetElapsedTime(); 
    return elapsedTime + m_addedTime; 
} 
+0

가. 같은 대답을 내 :-( – Yuliy

+0

글쎄, 내 목표는 기능에 대한 다른 멤버를 사용하지 않으려 고했다. 그럴 경우 m_elapsedTime 직접 시간을 추가하려면 해당 함수가 필요합니다 때문에 첫 번째 블록을 작동하지 않을 경우 + = 및 - =. 그러나 별도의 멤버를 만드는 것만이 유일한 옵션 인 경우 그 내용은 내가 함께 갈 것입니다. – Person

+1

추가 멤버가 아닙니다. m_elapsedTime을 없애고 m_addedTime을 더하고 있습니다. – Yuliy

1

를 사용하면, 사용자가 의해 경과 된 시간의 양을 감소하는 것을 시뮬레이션 할 수있는 남은 시간을 늘리려면 가장 간단한 해결책은 트랙이 추가/별도로 시간을 감산함으로써 GetElapsedTime() 재가공이다. m_elapsedTime += m_clock.GetElapsedTime() - m_elapsedTimem_elapsedTime = m_clock.GetElapsedTime()에 해당하고, m_elapsedTime -= m_elapsedTime - m_startingTime + m_clock.GetElapsedTime()는 m_elapsedTime = m_startingTime에 해당 - m_clock.GetElapsedTime()`:

귀하의 산술 식

은해야보다 더 복잡하다.

이 시점에서 문제는 분명합니다. m_elapsedTime의 이전 값은 이후 결과에 영향을주지 않습니다. offset 필드를 추가하여 타이머의 시작 값에 대한 변경 사항을 처리하는 것이 좋습니다. 이 시점에서, 타이머 : GetElapsedTime 그냥 다음과 같을 수 있습니다

카운트 다운을위한 카운트 업하고 시작 값을 0에서 시작 오프셋
float Timer::GetElapsedTime() { 
    if (m_forward) { 
    return offset + m_clock.GetElapsedTime(); 
    } else { 
    return offset - m_clock.GetElapsedTime(); 
    } 
} 

. 오프셋 업데이트를위한 신호가 있는지 확인하고 AddTime()

+0

같음 위의 경우, AddTime을 m_elapsedTime에 직접 사용하면 GetElapsedTime 함수에 + = 및 - =를 사용해야합니다. 그러나 별도 멤버를 구현하는 방법이 있습니다. – Person