캐릭터 이동제한, y축 점프이동거리 감소, 홀드

|

우선 캐릭터 이동거리 제한을 합시다.



빨간색 칸 안에서만 이동할 수 있도록 합시다.

첫 번째로 할 일은 캐릭터의 시작 지점을 바꿔주는 일입니다.


캐릭터의 시작 지점을 정해 주는 변수는 m_Position인데 Object클래스에서 상속받아서 사용하고 있습니다.

그렇기 때문에 Object클래스에 있는 변수의 값을 바꿔주도록 하겠습니다.


1
2
3
4
5
void Object::Init( HBITMAP _m_hResource )
{
    m_hResource   = _m_hResource;
    m_Position    = MakePoint(100,500);
}
cs


그러면 위 이미지와 같이 캐릭터가 저만한 위치에 서게 됩니다.


그리고 이동제한을 걸도록 하죠

1
2
if(pos.x > 0 && pos.x < 1080 && pos.y > 340 && pos.y < 570 )
    this->SetPos(pos.x, pos.y);
cs


저 if범위가 저 빨간색 칸의 범위 입니다.

캐릭터가 저 범위의 안에 있을때만 좌표를 Set하게 해서 범위 밖을 벗어나면 Set을 안하게 됨으로

캐릭터가 밖으로 나가지 못하게 됩니다.


1
2
3
void Hero::Action( float _dt )
{
}
cs

액션 함수 안에 넣어주시면 되겠습니다.


두 번째로 점프시 y축 이동 감소를 하도록 하겠습니다.

간단합니다

1
2
3
4
5
6
7
8
9
10
if(GetAsyncKeyState(VK_UP))
{
    if( m_iState != JUMP && m_iState != DROP ){ m_iState = WALK; pos.y -= m_MoveSpeed; }
    else pos.y -= m_MoveSpeed / 3;
}
if(GetAsyncKeyState(VK_DOWN))
{
    if( m_iState != JUMP && m_iState != DROP ){ m_iState = WALK; pos.y += m_MoveSpeed; }
    else pos.y += m_MoveSpeed / 3;
}
cs

점프중이 아니고 떨어지는 중이 아니면 일반적인 속도를

점프 중일때는 m_MoveSpeed / 3 스피드를 3/1로 감소 시킵니다.


마지막으로 홀드를 적용 시킵시다.

홀드는 점프를 시작할 때 움직일수 없게 하고

착지 할때 움직일 수 없게 하기 위한 것입니다.


클래스 맴버변수로

1
bool m_hold;
cs

를 추가 시킵시다.

초기화는

1
m_hold            =    FALSE;
cs

FALSE로 주시고


1
2
3
4
5
6
7
8
9
10
if(GetAsyncKeyState(VK_RIGHT))
{
    if(m_hold == FALSE ){ pos.x += m_MoveSpeed; m_iDirection = RIGHT; }
    if( m_iState != JUMP && m_iState != DROP ) m_iState = WALK;
}
if(GetAsyncKeyState(VK_LEFT))
{
    if(m_hold == FALSE ){ pos.x -= m_MoveSpeed; m_iDirection = LEFT; }
    if( m_iState != JUMP && m_iState != DROP ) m_iState = WALK;
}
cs

액션 함수에서의 키 값은

홀드가 FALSE일때만 움직일 수 있게 하면 됩니다.



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
case JUMP:
    {
        m_srcPos        =    MakePoint(85,135);
        m_srcSize       =    MakePoint(m_iDirection == RIGHT ? 0 : 610610);
        m_offset        =    MakePoint(-m_srcPos.x / 2-m_srcPos.y);
 
        m_dFrameDelay += _dt;
        if(m_dFrameDelay < 0.1f)
        {
            m_JumpPower = JUMP_POWER;
            m_nFreame = 0;
            m_hold = TRUE;
            break;
        }
            
        m_fz += m_JumpPower * _dt;
        m_JumpPower -= GRAVITY * _dt;
 
        if(m_dFrameDelay > 0.1f){m_nFreame = 1; m_hold = FALSE;}
        if(m_dFrameDelay > 0.2f) m_nFreame = 2;
        if(m_dFrameDelay > 0.3f) m_dFrameDelay = 0.1f;
 
        if(m_JumpPower <= 0)
        {
            m_iState = DROP;
            m_JumpPower = 0;
            m_hold = FALSE;
        }
        break;
    }
cs


1
2
3
4
5
6
7
if(m_dFrameDelay < 0.1f)
{
    m_JumpPower = JUMP_POWER;
    m_nFreame = 0;
    m_hold = TRUE;
    break;
}
cs

점프 파워를 셋팅하는 부분에 홀드를 TRUE로 주겠습니다.

TRUE가 됬으니 움직이지 못할 겁니다.

하지만 게속 그 상태를 유지하면 안되므로


1
if(m_dFrameDelay > 0.1f){m_nFreame = 1; m_hold = FALSE;}
cs

시간 딜레이가 0.1보다 커지면 홀드를 FALSE로 바꿔주어 풀어 줍니다.


그리고 착지 할때도 움직이게 하면 안되므로

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    case DROP:
        {
            m_srcPos        =    MakePoint(85,135);
            m_srcSize       =    MakePoint(m_iDirection == RIGHT ? 0 : 610610);
            m_offset        =    MakePoint(-m_srcPos.x / 2-m_srcPos.y);
 
            m_fz -= m_JumpPower * _dt;
            m_JumpPower += GRAVITY * _dt;
            m_dFrameDelay += _dt;
 
            if(m_fz <= 0)
            {
                m_fz = 0;
                if(m_dFrameDelay > 0.2f) m_nFreame = 5;
                if(m_dFrameDelay > 0.3f) m_nFreame = 6;
                if(m_dFrameDelay > 0.4f){m_iState = IDLE; m_hold = TRUE; }
            }
            else
            {
                m_nFreame = 3;
                if(m_dFrameDelay > 0.1f) m_nFreame = 4;
            }
            break;
        }
cs


1
2
if(m_dFrameDelay > 0.4f){m_iState = IDLE; m_hold = TRUE; }
 
cs

딜레이 시간이 0.4보다 커질때 홀드를 TRUE시켜줍니다.

그럼 언제 홀드를 해제(FALSE)해 주느냐?


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
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++;
                m_hold = FALSE;
                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++;
                m_hold = FALSE;
                if(m_nFreame >= 8) m_nFreame = 0;
            }
            break;
        }
 
cs

IDLE상태와  WALK상태 일때 하시면 됩니다.



결과




'API > 이론' 카테고리의 다른 글

캐릭터 점프  (0) 2016.05.01
메모리 생성을 각 클래스 안으로 넣기.  (0) 2016.04.30
싱글턴을 이용한 메인함수의 메모리 버퍼 정리  (0) 2016.04.30
싱글턴 패턴  (0) 2016.04.30
이미지 깜박거림 없앰.  (0) 2016.04.29
And