우선 캐릭터 이동거리 제한을 합시다.
빨간색 칸 안에서만 이동할 수 있도록 합시다.
첫 번째로 할 일은 캐릭터의 시작 지점을 바꿔주는 일입니다.
캐릭터의 시작 지점을 정해 주는 변수는 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 : 610, 610); 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 : 610, 610); 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 : 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++; 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 : 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++; 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 |