ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 더블 버퍼링 활용 - 애니메이션
    Win API/6. Double Buffering 2021. 4. 5. 10:41

    소스 파일은 아래의 내용을 가지고 와서 구현을 할 것이다.

    designatedroom87.tistory.com/426?category=937686

     

    더블 버퍼링의 기초

    이미지 리소스와 소스 파일은 밑에서 작업한 것을 그대로 가지고 온다. designatedroom87.tistory.com/425 활용 - 애니메이션 애니메이션으로 쓸 이미지 파일은 아래의 사이트에서 구할 수 있다. 아래의

    designatedroom87.tistory.com

     

     

    애니메이션에 대한 처리에 하기 전에, 키 입력을 통해 플레이어를 이동 시켜 보자.

     

     

    키 입력에 대한 처리는 WinMain 함수의 while 문에서 처리를 한다.

    BitBlt 함수에서 플레이어에 대한 정보로 g_hBackBufferDC에 저장한다.

    플레이어 비트맵 이미지에서 IDLE상태의 첫 번째 이미지를 플레이어의 현재 위치에 보이게 하기 위함이다.

    플레이어의 상태에 따라 그리고 몇 번째 프레임(장면)이냐에 따라 이 정보들은 변한다.

    그 이유는 비트맵 애니메이션 과정에서 충분히 설명을 하였다.

     

     

    아래는 WM_CREATE 메시지에서 플레이어에 대한 정보를 초기화 한다.

     

     

    프로그램 실행영상

     

     

    소스 파일

    WinMain.cpp
    0.01MB

     

     

     

    이번에는 IDLE 상태에서의 애니메이션을 재생시켜보자.

    비트맵에서는 SetTimer함수를 이용해서 1초마다 WM_TIMER메시지를 발생시켜 애니메이션을 처리하였다.

    그런데 여기에서는 전역변수로 시간 변수를 두어서 적당히 값을 증가시키다가

    이 값이 특정한 값을 넘어서면, 다음 장면으로 넘어가도록 만들어 보자.

    나중에는 deltatime이라는 것을 이용해서 처리할 수 있다.

    아래와 같이 추가적으로 전역 변수들을 추가한다. 

    이는 앞의 비트맵에서 사용한 변수들이다.

     

     

    아래는 WinMain 함수의 while 문이다. 

    내용이 길다.

    시간을 누적 시키는 원리는 한 번의 시스템이 돌고나서 적당히 값을 누적 시킨다.

    이 값이 특정한 값을 넘어서면 그 때 해줘야 할 작업을 진행하면 된다.

    우리는 다음 화면을 출력하도록 설정하면 된다.

    다음 화면의 소스 위치와 가로 크기와 세로 크기에 대한 정보를 설정하면 된다.

    그리고 이동 방향 키가 입력이 되면, IsMoving 변수를 true로 설정해서 이동 중임을 표현한다.

     

     

    아래의 내용은 이동 방향키가 눌려졌다가 떼졌을 때, IDLE 상태로 만드는 과정이다.

    이 부분은 앞의 비트맵 애니메이션에서 진행한 내용이다.

     

     

    프로그램 실행영상

     

     

    소스 파일

    WinMain.cpp
    0.01MB

     

     

     

    이동 방향 키 입력에 대해서 애니메이션 처리를 해보자.

    기존의 움직임에 대한 부분은 위치를 변경해야 한다.

    위의 while 문에서 if( g_fTime >= 1.f ) 조건 내에 위치 시키자.

    그리고 오른쪽 방향 혹은 왼쪽 방향으로 이동했을 시에, 그에 맞는 장면에 대한 소스 위치와

    소스 크기 정보를 찾아 설정해야 하는데 이는 앞에서 MoveToRight 함수와 MoveToLeft 함수에서 처리를 하였다.

    아래는 MoveToRight 함수

     

    아래는 MoveToLeft 함수

     

    아래의 4개의 if문은 이동 방향에 대한 설정부분이다.

    기본적인 로직은 앞에서 이미 한 내용을 그대로 복사해서 가져온 것이다.

    전반적인 부분은 밑에서 설명하기로 한다.

     

    위의 로직 파악은 크게 아래와 같다.

    가장 먼저, 파악할 상태는 IDLE 상태이다. 그 이 후에 파악할 상태는 키 입력이 들어왔는지를 파악한다.

    이는 곧, IDLE 상태가 우선순위가 가장 높다는 것을 의미한다.

    그 이유는 이동방향 키가 눌리면 WALK 상태가 되지만, 이 키가 눌렸다 떼지면 IDLE 상태로 돌아와야 하기 때문이다.

    그렇기 때문에 가장 높은 우선 순위를 갖는 상태를 맨 위에서 체크를 한다.

    이동 방향 키 입력이 없다면, IDLE 상태의 if 문에서만 처리가 된다.

    그러다가 이동 방향 키 입력이 들어오면 그에 맞게 설정을 하면 된다.

     

     

    프로그램 실행영상

     

     

    소스 파일

    WinMain.cpp
    0.02MB

     

     

     

    이번 내용은 번외편으로 그냥 보고 지나가도 될 것 같다.

    위에서는 적당한 값을 누적 시켜 특정한 값을 넘어설 때, 다음 화면으로 이동했으나

    이번에는 시스템 시간을 이용해서 애니메이션을 재생시켜보자.

    프로그램이 한 바퀴 도는 시간을 Delay Time(DT) 라 한다.

    보통 프로그램이 한 바퀴 돌았을 때를 1tick이라 한다.

    이는 컴퓨터 사양이 높으면 DT는 작아진다. 즉, 컴퓨터 사양에 따라 DT는 다르다.

    DT를 구하기 위해서는 timeGetTime 함수를 이용해서 OS가 부팅되고 난 후의 시간을 구한 후에

    이전과 이후의 시간 차로 DT를 구할 수 있다. 

    아래는 timeGetTime 함수에 대한 내용이다.

     

    아래의 내용을 추가해야 한다.

     

    아래는 WinMain 함수 내부이다.

    timeGetTime 함수를 이용해서 일정한 시간 값을 만들어서 이를 이용해서 애니메이션 제어를 한다.

     

     

    프로그램 실행영상

     

     

    소스 파일

    WinMain.cpp
    0.02MB

    'Win API > 6. Double Buffering' 카테고리의 다른 글

    더블 버퍼링의 기초  (0) 2021.04.05

    댓글

Designed by Tistory.