시간 경과에 따른 애니메이션

|

이번에는 시간 경과에 따른 애니메이션을 구현해 보도록 하겠다.

우선, 시간관련 함수를 사용하기 위해서는 #pragma comment(lib, "winmm.lib")을 포함 시켜야 한다.

헤더에 포함 시켜주도록 하자.




timeGetTime() 

 컴퓨터가 부팅된 시간으로부터 현재의 시간을 구한다.


위의 코드들을 간단히 설명하자면. '한번 싸이클을 도는 시간을 측정한다.'


예를들어서

deltaTime = timeGetTime();

PrevTime = timeGetTime();

이 두 변수에는 같은 시간이 들어가 있다.

들어가 있는 시간이 예를들어 5라고 해보자.


deltaTime  = timeGetTime() - PrevTime; // 5  = 5 - 5;

PrevTime = timeGetTime(); // 5


deltaTime에는 0이 들어가고

PrevTime에는 5가 들어가게 된다.


while에서 timeGetTime()으로 새롭게 시간을 가져왔지만,

 아직 싸이클을 다 돌지 않았기 때문에 위에 선언한 변수의 시간과 같은 시간이 들어온다.

한 번의 싸이클이 끝나고 다음 싸이클이 돌게되면

deltaTime  = timeGetTime() - PrevTime; // 0  = 6 - 5;

PrevTime = timeGetTime(); // 6


다음은


deltaTime  = timeGetTime() - PrevTime; // 1  = 7 - 6;

PrevTime = timeGetTime(); // 7

. . . . . .

이렇게 게속 돌게 되므로, 일정한 시간을 얻어올수 있게 된다.



Object_Hero.cpp

-----------------------------------------------------------------------------------------------------------------------------------------------------

랜더

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Hero::Render()
{
    CGPoint pos = this->GetPos();
 
    pos.x -= m_offset.x + m_srcPos.x / 2;
    pos.y -= m_srcPos.y;
 
    SelectObject(m_hMemDC, m_hResource);
    BitBlt(m_hBackBuffer, 
            pos.x, pos.y,
            m_srcPos.x, m_srcPos.y,
            m_hMemDC,
            m_srcSize.x + m_srcPos.x * m_nFreame, m_srcSize.y,
            SRCCOPY);
}
cs

오프셀을 적용시켜준다.

※오프셀이란?





애니메이션

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
void Hero::Animation( float _dt )
{
    switch(m_iState)
    {
    case IDLE:
        {
            m_srcPos        =    MakePoint(54,144);
            m_srcSize       =    MakePoint(m_iDirection == RIGHT ? 0 : 61010);
            m_offset        =    MakePoint(-m_srcPos.x / 2-m_srcPos.y);
 
            m_dFrameDelay += _dt;
            if(m_dFrameDelay > 0.1f)
            {
                m_dFrameDelay = 0;
                m_nFreame++;
                if(m_nFreame >= 4) m_nFreame = 0;
            }
            break;
        }
    case WALK:
        {
            m_srcPos        =    MakePoint(75,143);
            m_srcSize       =    MakePoint(m_iDirection == RIGHT ? 0 : 610310);
            m_offset        =    MakePoint(-m_srcPos.x / 2-m_srcPos.y);
 
            m_dFrameDelay += _dt;
            if(m_dFrameDelay > 0.1f)
            {
                m_dFrameDelay = 0;
                m_nFreame++;
                if(m_nFreame >= 8) m_nFreame = 0;
            }
            break;
        }
    }
}
cs


액션

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Hero::Action( float _dt )
{
    CGPoint pos = GetPos();
    m_MoveSpeed = 300.0f * _dt;
 
    m_iState = IDLE;
    if(GetAsyncKeyState(VK_RIGHT))
    {
        pos.x += m_MoveSpeed;
        m_iDirection = RIGHT;
        m_iState = WALK;
    }
    if(GetAsyncKeyState(VK_LEFT))
    {
        pos.x -= m_MoveSpeed;
        m_iDirection = LEFT;
        m_iState = WALK;
    }
    if(GetAsyncKeyState(VK_UP))    pos.y -= m_MoveSpeed;
    if(GetAsyncKeyState(VK_DOWN))  pos.y += m_MoveSpeed;
 
    this->SetPos(pos.x, pos.y);
}
cs

함수들을 차례차례 수정한다.


결과




And