디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.07.21 23:02:31
조회 320 추천 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/02 - -
271189 할거는 웹디 웹 프로그래밍 밖에 없나? [1] 으힉(119.198) 11.09.10 59 0
271188 화씨 바꾸는거 봐바 [4] 독담갤로그로 이동합니다. 11.09.10 58 0
271187 진지하게 질문 하나만할게요.. 부탁.. [6] 안초심갤로그로 이동합니다. 11.09.10 78 0
271186 행님들 C프로그램 뭐써??? [3] 안초심갤로그로 이동합니다. 11.09.10 58 0
271185 야이 프로그램이나 쳐만들때가 아니다!! [4] 거칠게갤로그로 이동합니다. 11.09.10 94 0
271184 이틀후면 추석인데 아저씨들은 내려갈꺼야? 가격거품갤로그로 이동합니다. 11.09.10 29 0
271183 NDK r6을 죽입시다 ㅁㄴㅇㄹ(115.137) 11.09.10 49 0
271182 컴좀 잘하는 흉들 도와죠 [3] 도시인(61.102) 11.09.10 50 0
271181 야이쉬벨 직렬화ID따윈 개나주라지 쵸쵸쵸(219.251) 11.09.10 19 0
271180 화씨온도를 섭씨온도로 바꾸는 c언어로 [4] ff(211.228) 11.09.10 437 0
271179 살춤이횽 소환! [5] Light search갤로그로 이동합니다. 11.09.10 65 0
271178 니들 반성문을 영어로 하면 뭔줄 아냐??! [4] 독담갤로그로 이동합니다. 11.09.10 112 0
271177 추석연휴잘들보내세요들 三didas갤로그로 이동합니다. 11.09.10 21 0
271176 명지대 컴공이면 괜춘함? [1] 독담갤로그로 이동합니다. 11.09.10 162 0
271175 아부지가 통닭 시켜주심 ㅋㅋㅋ [4] 독담갤로그로 이동합니다. 11.09.10 80 0
271174 dot 영어 왤케 잘함?? 20살때 725?? 대학교 어디임??? [3] 컴돌이(180.227) 11.09.10 102 0
271173 야 뒹신드라.추석 d-2이다. [1] 쵸쵸쵸(219.251) 11.09.10 30 0
271171 아오 이마트서 장보는데 [13] 뇌지랄갤로그로 이동합니다. 11.09.10 144 0
271170 내 노트북 개쩜 [2] 독담갤로그로 이동합니다. 11.09.10 92 0
271169 프갤러들 주식에 관심없음?? [10] 독담갤로그로 이동합니다. 11.09.10 105 0
271168 열강 C 존나 많음 [1] 로하로하알로하갤로그로 이동합니다. 11.09.10 79 0
271167 흠,,, 디아블로3 나오면 난 아마 또 공부를 하지않겠지.. [2] 독담갤로그로 이동합니다. 11.09.10 51 0
271166 외부변수가 뭐지 ㅜㅜㅜㅜ [4] 독담갤로그로 이동합니다. 11.09.10 63 0
271165 Deanex횽 어디삼 [2] 로하로하알로하갤로그로 이동합니다. 11.09.10 39 0
271164 if랑 for문만 써서 만들었음.. [1] IUV갤로그로 이동합니다. 11.09.10 74 0
271163 내가 다니는 대학교에 유학파 형이한명있는데 [1] 독담갤로그로 이동합니다. 11.09.10 87 0
271162 성대아싸는 영어장애인입니다. [2] [성대아싸]갤로그로 이동합니다. 11.09.10 107 0
271161 영어 실력이 그렇게 쉽게 느나??? [46] 컴돌이(180.227) 11.09.10 254 0
271159 보안하고싶은사람 꼭봐라 [1] 보안막장(122.46) 11.09.10 108 0
271158 배열을 외부변수로 바꾸라는게 무슨소리예염?? [4] 독담갤로그로 이동합니다. 11.09.10 66 0
271155 새상은 넓고 [3] Adelposs갤로그로 이동합니다. 11.09.10 55 0
271154 개발환경 원클릭으로 만들라고! 탐라국(121.159) 11.09.10 44 0
271153 이야 ! 해냈다! [8] 독담갤로그로 이동합니다. 11.09.10 114 0
271152 횽들 들여쓰기 떄문에 그러는데 [7] 독담갤로그로 이동합니다. 11.09.10 65 0
271150 게임은 무슨언어로 만들엉?? [5] 열심히해보잣갤로그로 이동합니다. 11.09.10 134 0
271149 시그멘테이션 오류는 어떻게해야 나는거예염?? [4] 독담갤로그로 이동합니다. 11.09.10 69 0
271148 천재해커의 전설 기억나징 [2] Adelposs갤로그로 이동합니다. 11.09.10 93 0
271147 공부 하고있거든요 ㅜㅜ [3] 독담갤로그로 이동합니다. 11.09.10 73 0
271146 아아.. 너무 잉여롭다 [1] Rei@디씨갤로그로 이동합니다. 11.09.10 49 0
271145 포인터까지배우고 나서 교수님이 시킨거 생각난다 Adelposs갤로그로 이동합니다. 11.09.10 61 0
271144 니들이 존재의 의미를 깨닫지 못하는한 영원히 고통스러울뿐이다. [2] 쵸쵸(219.251) 11.09.10 50 0
271143 중소기업들이 나의 능력을 알아보지 못하는 이유... [6] 천재해커(59.14) 11.09.10 171 0
271142 프갤러들 다 기본으로 토익 800이상에 토익스피킹 7급이상 나오잖아? [30] Deanex갤로그로 이동합니다. 11.09.10 228 0
271140 돈 받고 프로그래머 때려치우기 VS 프로그래머로서 정년 55세까지 보장 [1] ㅇㅇㅇ(121.144) 11.09.10 273 0
271139 이히 횽 봐랑 [2] y녀6디리(220.118) 11.09.10 38 0
271138 만약 C++ 나 C에서 (수정) [10] 써무사(50.131) 11.09.10 96 0
271137 훌륭한 프로그래머와 대단한 개발환경 [2] 구글리(115.145) 11.09.10 88 0
271135 별찍기 해봄 ㅇㅇ 변수 5개나 씀 [2] 로하로하알로하갤로그로 이동합니다. 11.09.10 84 0
271134 내가 옜날에 수학 떡밥 관련해서 본 개념글 올려봄 [4] 뇌지랄갤로그로 이동합니다. 11.09.10 133 0
271133 형들 플밍에서 수학은 어디까지? [5] Adelposs갤로그로 이동합니다. 11.09.10 105 0
뉴스 ‘피디씨’ 헨리, “바이올린 배우기 싫어 부순 적도”…음악 천재로 거듭난 터닝 포인트는? 디시트렌드 07.04
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2