Coding & Programming/C, C++, SFML

[C/C++, SFML] 4. 타이머(Timer) 구현하기

mainCodes 2021. 3. 27. 14:51

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

타이머는 게임 뿐만 아니라 여러 프로그램에서 사용되는 기능입니다. SFML에서도 Time 클래스를 이용하여 일종의 타이머 기능을 구현할 수 있습니다. SFML의 Time 클래스는 현재의 날짜(년, 월, 일, 시, 분, 초)를 나타내는 것이 아닌 시간의 양을 표현하는 용도로 사용됩니다. 

 

예를 들어 일정 시간단위로 어떤 기능을 수행해야 한다면 경과 시간을 측정하고 시계를 다시 재시작하기를 반복하면서 일정 주기로 특정 코드를 실행할 수 있습니다. Clock 클래스는 경과 시간을 측정하기 위해 초(asSeconds()), 밀리초(asMilliseconds()), 마이크로초(asMicroseconds()) 단위로 측정할 수 있는 메소드를 지원합니다.

경과 시간 통해 타이머를 구현하는 기본 개념은 아래와 같으며 시간 간격에 따라 여러 개의 타이머를 설정할 수도 있습니다.

 Clock clock
  Clock ai_timer;

  ...
  whiel(app,isOpen)
  {

      //초단위로 경과시간을 얻음
      float time = clock.getElapsedTime().asSeconds(); 
      clock.restart(); //시계 재시작

      interval += time; //시간 누적

      if(interval > 2.0)  //누적 시간이 2초보다 크면
      {
       //2.0초 단위로 기능 수행
       ... 

       interval = 0;
      }

      ...
  }

  그럼 전체 타이머 예제 코드를 한 번 보겠습니다.

 

SFML 타이머 예제 소스코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <SFML/Graphics.hpp>
#include <iostream>
 
using namespace std;
using namespace sf;
 
int main()
{
    Clock clock; //경과 시간을 측정할 수있는 Clock객체 선언
    Clock ai_timer;
    float interval = 0, delay1 = 4.0;
    int   count = 0;
 
    const Time ai_time = seconds(0.5f);
 
    cout << "프로그램이 시작되었습니다." << endl;
    //화면 크기, 캡션 이름 설정
    RenderWindow app(VideoMode(504504), "https://maincodes.tistory.com/");
    app.setFramerateLimit(60);  //프레임 비율 설정
    while (app.isOpen())
    {
        //초단위로 경과시간을 구함
        //밀리초는 asMilliseconds(), 마이크로초의 asMicroseconds()메소드 이용
        float time = clock.getElapsedTime().asSeconds();
        clock.restart();
 
        interval += time;
        //cout << "interval =" << interval << endl;
 
        Event event;
        //이벤트 처리
        while (app.pollEvent(event)) {
            //프로그램 종료 이벤트 처리
            if (event.type == Event::EventType::Closed)
            {
                app.close();
                cout << "프로그램이 종료되었습니다." << endl;
            }
        }
 
        //0.5초 마다 timer 재시작
        if (ai_timer.getElapsedTime() > ai_time)
        {
            ai_timer.restart();
            cout << "ai_timer... " << endl;
        }
 
 
        //4초 단위로 interval 초기화, count +1 증가
        if (interval > delay1)
        {
            cout << "interval = " << interval << " count = " << count << endl;
            interval = 0;
            count++;
        }
 
        //2초 단위로 배경색 변경
        if (((int)interval % 2== 0)
            app.clear(Color::White);
        else
            app.clear(Color::Blue);
 
        //윈도우를 화면에 출력
        app.display();
    }
 
    return 0;
}
cs

실행결과:

위 예제는 "[C/C++] 3. SFML - 기본 윈도우(RenderWindow) 출력하기" 의 기본 윈도우 출력 프로그램하기 예제에 타이머 관련 코드를 추가한 예입니다.  0.5초마다 ai_timer의 시간을 재시작하는 방법과 interval 변수에 시간을 누적하여 interval이 delay1(4초)보다 큰 수가 될 경우 별도의 타이머 기능을 수행하는 코드가 포함되어 있습니다. 

 

누적 시간이 4초가 넘을 경우 interval을 0으로 초기화하고 count 변수를 +1 증가시킵니다.  마지막으로 interval을 2로 나누어 나머지가 0이 되면 배경색을 흰색과 파란색으로 바꿔가면 화면에 출력합니다.

용도에 따라 Time 클래스가 지원하는 기능으로 타이머를 설정하여 시간 간격에 따라 원하는 기능의 코드를 작성하는 것이 기본 포인트가 되겠습니다.

이상 JollyTree였습니다 (•̀ᴗ•́)و