디시인사이드 갤러리

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

갤러리 본문 영역

DX 2D비행슈팅강좌 17. 충돌박스

Vita500갤로그로 이동합니다. 2009.07.21 23:02:31
조회 322 추천 0 댓글 2


===== DX 2D비행슈팅강좌 ======
===== 17. 충돌박스 =====
충돌검사를 이미지의 크기로만했었는데, 그럴경우
너무 광범위한 판정이 납니다.
충돌박스를 만들어서 이미지와는 별도로 영역을 얻어서
충돌검사를 해보겠습니다.
적의 판정영역이 조금 작아진것을 알수가 있습니다.



1. 구조체 정의
2. 이미지내에 충돌박스를 포함하기
3. 충돌 데이터 설정
4. 충돌데이터 넣기
5. 이동시 충돌박스도 같이 이동
6. 충돌박스 얻기
7. 충돌체크 하기



1. 구조체 정의
struct BoundingBox
{
        D3DXVECTOR3 LT;
        D3DXVECTOR3 RB;
};
typedef std::vector <BoundingBox*> BoundBoxVec;

충돌박스 구조체를 만듭니다.




2. 이미지내에 충돌박스를 포함하기
struct Image_data 
{
        LPDIRECT3DTEXTURE9        Texture;        // 텍스쳐
        RECT                                Source;                // 텍스쳐내 이미지의 좌표
        D3DXVECTOR3                        Position;        // 이미지가 화면에 그려질 좌표
        D3DXVECTOR3                        Center;                // 이미지의 센터
        FLOAT                                Time;                // 재생시간, 상대시간
};

struct Image : public Image_data
{
        BoundBoxVec                        BoundBox;        // 충돌박스
};

구조체내에 벡터를 넣으면, ZeroMemory사용시 메모리릭이 발생하므로,
구조체 상속을 통해서 "ZeroMemory(&BulletImage, sizeof(Image_data))"
과 같은 형태로 초기화 합니다.
그 이유로 구조체를 상속하여 사용합니다.





3. 충돌 데이터 설정
BoundBoxVec vBound;
BoundingBox* pBox = NULL;

pBox = new BoundingBox;
pBox->Left = -54.0f;
pBox->Right = 43.0f;
pBox->Top = -90.0f;
pBox->Bottom = 104.0f;
vBound.push_back( pBox );
_Enemy.setBoundingBox( &vBound );

충돌 데이터는 벡터를 생성한후, BoundingBox의 인스턴스를 
힙메모리로생성하고 값을 정의한후에 벡터에 넣어
_Enemy에게 충돌박스를 설정합니다.
여기에서는 Character에게만 했지만,
각 이미지 마다 적용시, 이미지에 넣기만 하면됩니다.





4. 충돌데이터 넣기
VOID Character::setBoundingBox(const BoundBoxVec* vBox)
{
        _vBoundBox = *vBox;
}

벡터는 복사만 하면 끝입니다.




5. 이동시 충돌박스도 같이 이동
iBound_size = _vBoundBox.size();
for (INT c=0; c<iBound_size; ++c  )
{
        _vBoundBox[c]->LT.x += vPos->x;
        _vBoundBox[c]->LT.y += vPos->y;
        _vBoundBox[c]->RB.x += vPos->x;
        _vBoundBox[c]->RB.y += vPos->y;
}

충돌박스가 따라 다녀야 하므로, Character가이동시
같이 이동합니다.




6. 충돌박스 얻기
BoundBoxVec& Character::getBoundingBox(VOID)
{
        if ( _vBoundBox.empty() == FALSE )
        {
                return _vBoundBox;
        }
        else
        {
                return _vImages[_uAni_num][_uImage_num]->BoundBox;
        }
}

충돌박스는 각이미지마다 충돌벡터가 있지만, Character안에도 하나 있습니다.
만약, Character에 단 한개의 충돌박스가 있으면, 그것을 리턴합니다.
탄막슈팅처럼, 이미지의 충돌지점은 동일한데, 굳이 이미지마다 충돌박스를
정의할필요가 없을때 사용합니다.
이미지내에 충돌박스가 없는데, 리턴하게 되면, 다운됩니다.



7. 충돌체크 하기
VOID Application::UpdateCollision(VOID)
{

        const BoundBoxVec& vEnemyBox = _Enemy.getBoundingBox();
        BoundBoxVec& vBulletBox = _Bullet[0].getBoundingBox();
        Property proEnemy = *_Enemy.getProperty();

        for (INT i=0; i<100; ++i)
        {

                if ( _Bullet[i].getVisible() == TRUE )
                {
                        BoundBoxVec& vBulletBox = _Bullet[i].getBoundingBox();

                        for (UINT k=0; k<vEnemyBox.size(); ++k)
                        {
                                for (UINT c=0; c<vBulletBox.size(); ++c)
                                {
                                        if ( vBulletBox[c]->LT.x < vEnemyBox[k]->RB.x
                                                &&vEnemyBox[k]->LT.x < vBulletBox[c]->RB.x
                                                &&vBulletBox[c]->LT.y < vEnemyBox[k]->RB.y
                                                &&vEnemyBox[k]->LT.y < vBulletBox[c]->RB.y)
                                        {
                                                // 충돌한 총알은 안보이고, 게이지 깍기
                                                if ( proEnemy.HP >= .0f )
                                                {
                                                        _Bullet[i].setVisible(FALSE);
                                                        proEnemy.HP -= _Bullet[i].getProperty()->AttackDamage;
                                                }
                                        }
                                }
                        }


                }
        }

        // 적의 능력치 업데이트
        _Enemy.setProperty(&proEnemy);


}

사각영역의 충돌방식은 이전과 같습니다.
다만, 그 사각영역을 이미지로 체크하는것이 아니라, 충돌영역으로
판정을 한다는것이 다릅니다.


추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 끝까지 다 본 걸 후회하게 만든 용두사미 드라마는? 운영자 25/07/07 - -
AD 디지털 액세서리 기간한정 세일! 운영자 25/07/11 - -
272287 앙...윈8 별로인 거 같어... [4] 분당살람갤로그로 이동합니다. 11.09.15 127 0
272286 역시 대기업은 여자 개발자가 있군하 [2] !@#ㅇㅇ(211.238) 11.09.15 164 0
272285 쿄스케횽은 나랑 이름도 비슷하다 사람들이 쭌이라부른다는데 [4] Light search갤로그로 이동합니다. 11.09.15 54 0
272283 요새 초등학생도 가슴 왜 이렇게 큰가요 ㄷㄷㄷ 발육이... [10] MEECL갤로그로 이동합니다. 11.09.15 1144 0
272281 아...이런... [5] McHello갤로그로 이동합니다. 11.09.15 104 0
272279 쿄스케형 여고딩소개시켜주고난뒤 후기 [13] Light search갤로그로 이동합니다. 11.09.15 222 0
272277 은(는) null 이거나 개체가 아닙니다. 라고함... blackd갤로그로 이동합니다. 11.09.15 202 0
272276 흑흑 눈물이 난다 이것때문에 1시간동안 삽질함 [2] Deanex(59.13) 11.09.15 69 0
272275 명품 usb 스팩공개.. [7] iljeomobolt갤로그로 이동합니다. 11.09.15 185 0
272274 아스야... 존나 못만든 안드로이드 어플이다.. [5] 쿄스케갤로그로 이동합니다. 11.09.15 99 0
272272 이런 명품 어디서 구할 수 없냐? [8] iljeomobolt갤로그로 이동합니다. 11.09.15 166 0
272271 형들 마방진 코드 디버깅좀 (자바 캐고수만) [8] 형들질문(175.116) 11.09.15 104 0
272268 ACM 대회 있길래 한번 참가해봄... [1] 통맥갤로그로 이동합니다. 11.09.15 90 0
272267 윈도우8 설치 결과!! 두둥!! [6] 분당살람갤로그로 이동합니다. 11.09.15 272 0
272266 맛폰 테더링 괜찬넹.... ㅅㄱㅅㄱㅅㄱ갤로그로 이동합니다. 11.09.15 27 0
272265 공부는 이렇게 해야지.... [3] 땡칠도사갤로그로 이동합니다. 11.09.15 110 0
272264 윈도우8... 분당살람갤로그로 이동합니다. 11.09.15 61 0
272262 wav형식의 파일을 주파수or스팩트럼으로 변환 방법 [7] 프로글래머(211.183) 11.09.15 119 0
272261 안드로이드 엠피어플 뭐가 좋아? [1] SODMaster갤로그로 이동합니다. 11.09.15 70 0
272260 천호동이야 쿄스케형 [7] Light search갤로그로 이동합니다. 11.09.15 91 0
272257 횽들 stdlib.h갤로그로 이동합니다. 11.09.15 19 0
272255 프로그램 제작 의뢰 [79] 담담이(58.225) 11.09.15 369 0
272254 다들 추석기간 동안 몇키로찜 ?? -_- [2] 쿄스케갤로그로 이동합니다. 11.09.15 39 0
272252 다들 이맛에 프로그램 짜지 않냐? [2] blackd갤로그로 이동합니다. 11.09.15 144 0
272251 아 역시 연휴 끝나고는 쥐약이다.. [1] 쿄스케갤로그로 이동합니다. 11.09.15 28 0
272250 쿄스케형 ㅡㅡ... [4] Light search갤로그로 이동합니다. 11.09.15 57 0
272248 형들 쫌 뜬금없지만.. 로케트담배(58.225) 11.09.15 50 0
272246 오늘 아침 디씨가 안되니 온몸에 경련이 왔다 Deanex갤로그로 이동합니다. 11.09.15 29 0
272244 저뉴비인데 [1] 뻘찔죶중딩갤로그로 이동합니다. 11.09.15 31 0
272242 디시가 살아났어ㅠ ㅋㄱ(183.96) 11.09.15 24 0
272241 현재 우리가 쓰는 휴대폰은 이종통신망간 handover 가 된다고 봐야하 [1] vF(125.128) 11.09.15 40 0
272240 정전인건가 내폰이이상한거가 三didas갤로그로 이동합니다. 11.09.15 35 0
272239 유지보수 하기싫으면 Adelposs갤로그로 이동합니다. 11.09.15 39 0
272238 아 니들은 좋겠다 먹고 살 거 있어서 [2] 1(125.135) 11.09.15 101 0
272237 tcp/ip 어떻게 구현되는지 밑바닥부터 설명해 드림. [3] ㅇㅇ(122.36) 11.09.15 132 0
272235 x86이랑 x86-64 중에 어떤거 다운로드? [3] dwq(129.128) 11.09.15 82 0
272234 비베로 코딩하면 [1] 써니무한사랑갤로그로 이동합니다. 11.09.15 52 0
272233 vs6.0 아직도 쓰냐...? [1] 이문동쮸쮸바갤로그로 이동합니다. 11.09.15 64 0
272232 우리집에 전공잭 많음 [1] Adelposs갤로그로 이동합니다. 11.09.15 56 0
272231 우분투 잡다한거 빼고 그냥 기본적인거만 인스톨 못함? [7] g(92.231) 11.09.15 72 0
272230 자바 아까 그문제ㅜㅜㅜㅜ [1] 플밍개초보(14.52) 11.09.15 55 0
272228 [c++]헤더파일. 내가 뭘 잘못한건지 모르겠음 [25] noname(211.200) 11.09.15 1227 0
272227 그리고 tcp ip는 os랑 독립적이다;; [11] 통신왕(121.142) 11.09.15 201 0
272226 안냐세요 소문듣구 왔어요..자바기본 다이아몬드 만들기 ㅠㅠ [5] 플밍개초보(14.52) 11.09.15 115 0
272225 그니까 tcp/ip에서 [7] 으아앙(121.142) 11.09.15 104 0
272222 n(노테이션)이 큰 곱셈연산? [2] Regi☆갤로그로 이동합니다. 11.09.15 54 0
272221 기계어 코드 작성문제 [2] Regi☆갤로그로 이동합니다. 11.09.15 74 0
272219 디바이드 앤 컨쿼 방식으로 곱하는 카마슈라 알고리즘 질문있습니다 조공 [3] 라솔갤로그로 이동합니다. 11.09.15 121 0
272218 지금 이거때매 고뇌에 빠짐 [19] 박구갤로그로 이동합니다. 11.09.15 165 0
272215 데이터베이스 수업에서 웹으로 구축하라고 하는데 웹은 뭘로 하는게 좋을까? [2] 아가리(122.32) 11.09.15 62 0
뉴스 스무공일∙EROS∙김도안, 7월 2주 차 위클리 키트앨범 스포트라이트 선정! 디시트렌드 07.11
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2