===== DX 2D비행슈팅강좌 ======
===== 16. 경로를 따라 이동하기 =====
게임에서 적들은 지정된 경로를 따라서 나와 이동하고,
플레이어에게 적절하게 탄을 퍼부은후 사라집니다.
그렇게 이동하는 기능을 구현하여 보겠습니다.
1. 모션데이터 구조체
2. 경로를 따라 이동하기 구현
3. 모션재생
4. Update 분리
5. 모션데이터를 넣는 함수
6. 모션 데이터 넣기
1. 모션데이터 구조체
struct Motion
{
FLOAT Time;
D3DXVECTOR3 Position;
};
이동에 필요한 정보를 담는 구조체를 만듭니다.
시간, 그리고 위치를 담습니다.
2. 경로를 따라 이동하기 구현
VOID Character::updateMotion(VOID)
{
if ( _bMot_play == FALSE)
return;
if ( _bAni_first_play == TRUE)
{
_bAni_first_play = FALSE;
return;
}
D3DXVECTOR3 vOut;
_fMot_cnt += t;
while ( _fMot_cnt > _fMot_time )
{
_fMot_cnt -= _fMot_time;
_uMot_num++;
if ( _uMot_num +1 >= _vMotion.size() )
{
_uMot_num--;
_fMot_cnt = _fMot_time;
_bMot_play = FALSE;
}
else
_fMot_time = _vMotion[_uMot_num+1]->Time - _vMotion[_uMot_num]->Time ;
}
D3DXVec3Lerp( &vOut,
&_vMotion[_uMot_num]->Position,
&_vMotion[_uMot_num+1]->Position,
_fMot_cnt / _fMot_time );
setPosition( &vOut );
}
이번 강좌의 구현부입니다.
잘보시면, 코드의 패턴은 애니메이션과 비슷합니다.
지정된 시간이 흐르면, 다음배열값으로 이동하죠.
애니메이션과는 달리, 모두 이동하면, 마지막위치에 멈추게 했습니다.
보통 슈팅게임에서 적이 화면상에 나타나 이리저리 이동한후 다시 사라지는 형태입니다.
그리고, 위치1과 위치2의 보간은 DX함수를 사용했습니다.
이부분은 직접구현해도 될만큼 쉽습니다.
보간으로 얻은값을 setPosition에 세팅하여, 위치를 갱신시켜줍니다.
3. 모션재생
VOID Character::playMotion(VOID)
{
if ( _vMotion.size() <= 1
||_bMot_play == TRUE)
return;
_bMot_play = TRUE;
_bMot_first_play = TRUE;
_fMot_time = _vMotion[_uMot_num+1]->Time - _vMotion[_uMot_num]->Time ;
}
모션재생에 관한 조건을 엄격하게 하여, updateMotion에서는
특별히 신경쓰지 않도록하였습니다.
이부분은 updateAnimation에도 같이 적용되었습니다.
벡터의 개수가 1개이하이면, play를 호출하여도 사용되지 않습니다.
그리고 모션의 Time차이값을 처음 재생할때 받아 둡니다.
4. Update 분리
VOID Character::Update(VOID)
{
updateMotion();
updateAnimation();
}
애니메이션에 모션이 추가되었으므로, 기능을 구분하기위해서
각각의 updateMotion, updateAnimation함수를 만들고,
그것을 모두 Update에 넣었습니다.
5. 모션데이터를 넣는 함수
VOID setMotion(MotionVec* vMotion);
모션을 받을때에도, 벡터로 통채로 받습니다.
6. 모션 데이터 넣기
MotionVec vMotion;
Motion* pMotion = NULL;
pMotion = new Motion;
pMotion->Position.x = 234.0f;
pMotion->Position.y = 64.0f;
pMotion->Time = .0f;
vMotion.push_back( pMotion );
pMotion = new Motion;
pMotion->Position.x = 96.0f;
pMotion->Position.y = 289.0f;
pMotion->Time = 2.0f;
vMotion.push_back( pMotion );
pMotion = new Motion;
pMotion->Position.x = 451.0f;
pMotion->Position.y = 267.0f;
pMotion->Time = 4.0f;
vMotion.push_back( pMotion );
pMotion = new Motion;
pMotion->Position.x = 234.0f;
pMotion->Position.y = 64.0f;
pMotion->Time = 6.0f;
vMotion.push_back( pMotion );
_Enemy.setMotion( &vMotion );
_Enemy.playMotion();
모션벡터를 만들어서 모션데이터를 넣습니다.
모션데이터는 new로 힙메모리를 사용하여야 하며,
시간을 0.0f, 2.0f, 4.0f, 6.0f등으로 증가하여야 합니다.
그리고, 각각의 시간이 될때의 위치를 넣어주면,
그 중간시간의 위치는 보간해줍니다.
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.