이번에는 시간 경과에 따른 애니메이션을 구현해 보도록 하겠다.
우선, 시간관련 함수를 사용하기 위해서는 #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 : 610, 10);
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 : 610, 310);
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 |
함수들을 차례차례 수정한다.
결과
'API > 이론' 카테고리의 다른 글
이미지 깜박거림 없앰. (0) | 2016.04.29 |
---|---|
캐릭터 뒷배경 검정색 없애기. (0) | 2016.04.29 |
캐릭터 출력하기. (0) | 2016.04.28 |
배경을 클래스화 해서 출력하기. (0) | 2016.04.27 |
여러 이미지 출력을 위한 소스정리 및 파일 나누기 (0) | 2016.04.26 |