디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

DX 2D비행슈팅강좌 16. 경로를 따라 이동하기

Vita500갤로그로 이동합니다. 2009.07.17 22:20:24
조회 235 추천 0 댓글 0




===== 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등으로 증가하여야 합니다.
그리고, 각각의 시간이 될때의 위치를 넣어주면,
그 중간시간의 위치는 보간해줍니다.


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 어떤 상황이 닥쳐도 지갑 절대 안 열 것 같은 스타는? 운영자 24/05/20 - -
146313 외국계 본사 >>> 안드로메다 >>> 외국계 한국지사 [4] 중달(121.166) 09.09.04 167 0
146312 세그먼트 레지스트리에 대해 궁금해~ [9] 몰라(121.138) 09.09.04 107 0
146310 개발자에게 유이란...? [1] 중달(121.166) 09.09.04 140 0
146308 왜 프갤은...? [5] 중달(121.166) 09.09.04 115 0
146307 유이 [7] 세브(211.117) 09.09.04 213 0
146304 유이란 이름은 언제나 나에게 설레임의 대상이었다. [1] ㅇㅇㅃ갤로그로 이동합니다. 09.09.04 94 0
146303 톰캣이 병신인가 내가 병신인가 [2] 아주아슬갤로그로 이동합니다. 09.09.04 81 0
146302 프로그래머에게 이영애는 어울리지 않는듯. [6] yundream(211.189) 09.09.04 187 0
146301 말을 해도 알아듣질 못하니 솔찍히 이길 자신이없다. [8] 개쉛기갤로그로 이동합니다. 09.09.04 150 0
146299 !소환 가만히있어봐 [4] 후시기바나(110.76) 09.09.04 96 0
146296 기자가 미쳤나 ㅋㅋ [5] rntjr갤로그로 이동합니다. 09.09.04 183 0
146294 삼송멀티캠퍼스 가서 미팅하고 왔다 [4] 분당살람갤로그로 이동합니다. 09.09.04 141 0
146293 놋북 세컨 하드 설치하자 마자 [3] 중달(121.166) 09.09.04 79 0
146292 저는 보잘것 없는 공대생 입니다.. [5] 숙신갤로그로 이동합니다. 09.09.04 145 0
146291 SQL어 쉬움??? [4] 오시옷(115.20) 09.09.04 108 0
146290 어 내글 지워졌네 ㅋ [9] 관심시전갤로그로 이동합니다. 09.09.04 98 0
146287 마이컴 분야의 본좌 [[[[유리한]]]]]횽 저좀 도와주세요!!! [27] 가만히있어봐갤로그로 이동합니다. 09.09.04 219 0
146286 공부하는 대가리는 처음부터 결정된다? [18] 유전자(122.128) 09.09.04 238 0
146283 C# 소켓에서 비동기방식인데 [5] 라루나갤로그로 이동합니다. 09.09.04 117 0
146281 횽들 PHP배우는데 알고리즘필요해? [2] 초급뉴비(58.120) 09.09.04 103 0
146280 한국 댄스가수 중국 공연시 60만원 세금 추가 [3] ㅇㅇㅃ갤로그로 이동합니다. 09.09.04 107 0
146278 현기증난단말이에요. 빨리주세요. [4] 씬입사원갤로그로 이동합니다. 09.09.04 140 0
146277 횽들 컴공이면 전자 복전해서 취업 괜찬치 않음?? ㅇㅇ(112.153) 09.09.04 92 0
146276 알리 뱀파이어 [2] 이모군(210.218) 09.09.04 119 0
146275 bccard next generation project .. [1] Pupustory갤로그로 이동합니다. 09.09.04 57 0
146274 난 똑똑하다. [6] 개쉛기갤로그로 이동합니다. 09.09.04 125 0
146273 오늘 창립5주년 행사하는데... [5] 물속의다이아갤로그로 이동합니다. 09.09.04 90 0
146271 C코드 질문(어제 디-횽이 알려준 거임) [7] 중달(121.166) 09.09.04 135 0
146270 데브피아 병림픽 보면 항상드는 생각인데. [47] yundream(211.189) 09.09.04 304 0
146269 자신의 닉네임에 대해 좀 더 신중할 필요성이있다. [8] 개쉛기갤로그로 이동합니다. 09.09.04 102 0
146268 횽들은 왜 프로그래머가 됐어? [9] 라이체스터갤로그로 이동합니다. 09.09.04 166 0
146266 디씨 같은 홈페이지 만들려면 뭐 배워야 하나요? [7] ㅇㅇ(219.249) 09.09.04 120 0
146262 [1] (203.249) 09.09.04 33 0
146260 아까질문에 대한 추가궁금증 ㅜㅜ [7] 뉴비(59.6) 09.09.04 94 0
146259 아 진짜 너무들하네요 왜 다들 모나미 사간다는 얘기밖에 없는거죠?? [6] 개쉛기갤로그로 이동합니다. 09.09.04 165 0
146257 어서 가서 졸라라 [4] ㅇㅇㅃ갤로그로 이동합니다. 09.09.04 109 0
146255 놋북 하드 확장했다~ 우왕ㅋ굳ㅋ [4] 중달(121.166) 09.09.04 116 0
146252 어제 자바 어쩌구 에서 도와주셈한테 까인 걸 이제 봤다능 [2] prismatic갤로그로 이동합니다. 09.09.04 81 0
146251 이거 이해가 잘 안되네. 좀 도와줘. [2] cccc(211.51) 09.09.04 87 0
146250 오늘 벙개는 무엇을 상상하든 그이상을 보게 될것이야 [14] Vita500갤로그로 이동합니다. 09.09.04 212 0
146249 컴파일러에서 매개변수와 지역변수를 스택에 거꾸로 저장하는 이유 ?ㅜㅜ [3] 뉴비(59.6) 09.09.04 126 0
146247 코드잼 어렵네 -_- [3] 양반씨갤로그로 이동합니다. 09.09.04 127 0
146246 한줄짜리 코딩 질문여 T_T [2] ㅇㄴ(202.136) 09.09.04 109 0
146245 wine.. [2] 유리한갤로그로 이동합니다. 09.09.04 117 0
146244 리눅스마스터 [2] CP(118.221) 09.09.04 136 0
146243 SI 하고 솔루션 업체하고 다른점이 뭔가요? [2] ㅇㄹ(118.217) 09.09.04 139 0
146241 C# 비동기 구문 질문. 라루나갤로그로 이동합니다. 09.09.04 63 0
146240 전기도 '무선시대' 열리나 [2] Vita500갤로그로 이동합니다. 09.09.04 139 0
146238 A양 누드 사진이 유출되었다던데... [4] 아주아슬갤로그로 이동합니다. 09.09.04 261 0
146237 데브피아에서 병림픽 열던 보넥스 라는 사람의 최후... [24] 외계달팽갤로그로 이동합니다. 09.09.04 7105 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2