디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.07.17 22:20:24
조회 243 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
267475 좋은아버지형 소환됩니까? [4] 사람(58.234) 11.08.28 55 0
267474 아기갤이고 프갤이고 프로그래밍 제일 잘하는 갤은 [1] (61.102) 11.08.28 102 0
267473 아기갤에 가서 [3] 좋은아버지갤로그로 이동합니다. 11.08.28 48 0
267472 마지막 피방알바가 삼십분남앗다 [2] 서전트페퍼갤로그로 이동합니다. 11.08.28 53 0
267471 아기갤에 글쓰는걸 목표로 하쟈... [5] blackd갤로그로 이동합니다. 11.08.28 127 0
267469 형들 나 직업 바꿀까? 진심 고민된다. [4] 좋은아버지갤로그로 이동합니다. 11.08.28 75 0
267468 아기갤 쩌네.. 앞으로 프로그램 짜다 짜증나면 여기 가봐야 겠다.. [6] blackd갤로그로 이동합니다. 11.08.28 141 0
267465 그런데 프갤만 원래 훈훈한거야? [6] 좋은아버지갤로그로 이동합니다. 11.08.28 69 0
267464 으흐 내 대답이 빛을 발하고있다 [11] Agangs갤로그로 이동합니다. 11.08.28 83 0
267461 살춤아 대학원 궁금하냐? [9] blackd갤로그로 이동합니다. 11.08.28 187 0
267460 아하하하하하핳 TCP/IP 시-발 y녀6디리(218.146) 11.08.28 70 0
267459 ㅋㅋㅋㅋㅋ이럴때뭐라대답하지 [6] Agangs갤로그로 이동합니다. 11.08.28 67 0
267455 으으 지금 생각해보면 내가 대학원까지 가게될줄은 상상도 못했다 [22] System32갤로그로 이동합니다. 11.08.28 238 0
267454 성님들 php 질문 좀..도와주세요 (조공有) [21] 재경2갤로그로 이동합니다. 11.08.28 215 0
267452 쿄스케 형은 봅니다.2 [2] 좋은아버지갤로그로 이동합니다. 11.08.28 49 0
267447 정화짤은 이거지 [4] System32갤로그로 이동합니다. 11.08.28 101 0
267446 횽들은 이럴때어떻게해? [5] Agangs갤로그로 이동합니다. 11.08.28 68 0
267443 난 왜 정전 되면 글을 자꾸 싸지르고 싶어질까? [6] blackd갤로그로 이동합니다. 11.08.28 62 0
267439 나 낼 꼬꼬면 사먹어볼려고 하는데.. 정말 맛있냐? [7] blackd갤로그로 이동합니다. 11.08.28 88 0
267438 형 나 후불 교통카드 쓸려고 하는데 [8] 좋은아버지갤로그로 이동합니다. 11.08.28 67 0
267436 난 설마 온라인에도 왕따가 있을줄은 몰랐는데 말야... [8] blackd갤로그로 이동합니다. 11.08.28 102 0
267435 신세경 참 이쁜거 같아.jpg [4] blackd갤로그로 이동합니다. 11.08.28 155 0
267433 쿄스케 횽은 봅니다. [3] 좋은아버지갤로그로 이동합니다. 11.08.28 54 0
267432 요세 컴돌이 어그로 쩔던데.. 그래도 참 좋은 현상임.. [10] blackd갤로그로 이동합니다. 11.08.28 164 0
267431 음원 유출 되는거 보면 대부분 어떤경로 로 유출되는거지? [4] minsu갤로그로 이동합니다. 11.08.28 64 0
267430 어차피 세상은 될놈은 되고 안될놈은 안될지도 [5] ㅇㅇ(61.77) 11.08.28 63 0
267425 2000년대 초반 미국 IT버블당시 [1] ㅇㅇ(61.77) 11.08.28 122 0
267424 좋은아버지횽 있어? [3] 쿄스케갤로그로 이동합니다. 11.08.28 53 0
267422 형들 물어볼꼐잇는데 [27] 헐크킼갤로그로 이동합니다. 11.08.28 155 0
267421 컴돌이 저새키 내 과외 학생이었으면 [14] ㅁㄴ(210.107) 11.08.28 146 0
267420 adnoctum 걍 씹병신임 무시해라 서전트페퍼갤로그로 이동합니다. 11.08.28 51 0
267419 아 여기에 자기가 일당잡부가 아니라고 생각하는 넘 있냐? [1] ㄹㅇㄴㅁㄹㅈ(211.109) 11.08.27 59 0
267416 C의 형편없는 가독성!!! 약초식남(219.251) 11.08.27 71 0
267414 형들 malloc으로 할당된 크기 알아내는법좀 가르쳐주세영 ㅜㅜ [2] ㅠㅠ메몰메몰(221.146) 11.08.27 46 0
267413 솔까말 김치맨은 영문법에만 집중하자. 약초식남(219.251) 11.08.27 34 0
267412 그럼 직면하다라고 해석하면 틀린거아녀??? [47] 컴돌이(180.227) 11.08.27 190 0
267411 이제부터 영어로 대화하자 [4] 우ㅈ갤로그로 이동합니다. 11.08.27 70 0
267407 포인터의 눈물 [6] 포인터의눈물(59.14) 11.08.27 71 0
267405 퇴갤선물 calculator.c [1] 개발자(115.23) 11.08.27 67 0
267404 컴돌이가 원하는 문장 분석 [2] ㅁㄴ(210.107) 11.08.27 59 0
267403 아싸 highlighter 완성 ㅋㅋ [3] [성대아싸]갤로그로 이동합니다. 11.08.27 88 0
267402 아 ㅅㅂ 로또되면 직장 때려치고 편하게 코딩이나 하면서 살라 그랬는데.. 약초식남(219.251) 11.08.27 67 0
267400 프로세서가 갈수록 고성능화되고, 인터넷 속도가 빨라질수록 [4] 약초식남(219.251) 11.08.27 91 0
267398 내가 비록 해본언어는 C와 자바 뿐이지만 [4] 약초식남(219.251) 11.08.27 106 0
267396 멀티라인 주석 , 토큰 인식 실패 [6] [성대아싸]갤로그로 이동합니다. 11.08.27 97 0
267394 이 영어 문장 분석할 실력되는 분 혹시 있나하고... [53] 컴돌이(180.227) 11.08.27 226 0
267390 자바 배우는데 글케 오래걸리나요? [12] c늅이(180.150) 11.08.27 118 0
267389 결혼을 왜하며, 애새끼를왜 낳을까.. [5] 약초식남(219.251) 11.08.27 78 0
267386 쿄스케 형은 봅니다. [1] 좋은아버지갤로그로 이동합니다. 11.08.27 31 0
267385 자바스크립트 assa highlighter 98% 완성 [6] [성대아싸]갤로그로 이동합니다. 11.08.27 104 0
뉴스 이효리, 11년 제주살이 이유 따로 있었다…“주변에서 말 많아” 디시트렌드 07.03
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2