디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.07.21 23:02:31
조회 310 추천 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
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 어떤 상황이 닥쳐도 지갑 절대 안 열 것 같은 스타는? 운영자 24/05/20 - -
145594 정보처리산업기사 보고옴 ㅋ;; 근데 왠 여자들이 글케 많나염 [3] 맥콜(125.188) 09.08.30 211 0
145592 문장에서 단어 찾기좀 알려주세영; [7] 맑탉앉앍꿇헒갤로그로 이동합니다. 09.08.30 87 0
145591 곧휴가 .. 곧휴가 .. [1] Pupustory갤로그로 이동합니다. 09.08.30 113 0
145590 나도 블로그 홍보 [9] DMW(123.111) 09.08.30 213 0
145589 나 지금 재미있는 거 하고 있다능! [4] 분당살람갤로그로 이동합니다. 09.08.30 94 0
145586 고수님들 비베로 싸이월드 투데이 올리는거 만드는데 [5] 우왕굳뜨(121.129) 09.08.30 118 0
145585 D-113 횽들의 조언이 필요해! [2] 양희철갤로그로 이동합니다. 09.08.30 60 0
145584 웹사이트만들어서 떼돈벌려구할때 [1] 부락페스티발갤로그로 이동합니다. 09.08.30 82 0
145582 고수님들만 보세요;; 윈미플 라이브러리 내에 0kb파일 삭제 어떻게하죠? [5] 흐으밍갤로그로 이동합니다. 09.08.30 169 0
145581 티스토리 말고 다른 설치형 블로그 사이트 찾는中 [5] 양희철갤로그로 이동합니다. 09.08.30 106 0
145580 이 쯤에서 분당살람 블로그 선전 [5] 분당살람갤로그로 이동합니다. 09.08.30 134 0
145579 이상한 사이트를 하나 발견했다. [5] 천재플머(121.139) 09.08.30 161 0
145578 나를 제자로 받아줄 프갤러는 없나요? [1] 천재플머(121.139) 09.08.30 109 0
145577 분당살람횽 계신가연 [9] 빠워REX갤로그로 이동합니다. 09.08.30 127 0
145575 아오 ㅋㅋㅋㅋㅋㅋ [2] DMW(123.111) 09.08.30 98 0
145574 정보처리 산업기사 응시자격이 어케되는겨? [3] 신발라마갤로그로 이동합니다. 09.08.30 148 0
145573 저거 나만 오류 나나여? 전 오류 남 스샷 첨부 [6] 노소프소갤로그로 이동합니다. 09.08.30 110 0
145572 저 codepad 말인데여 공부하는데 쓰는데 전혀 지장 없슴? [2] 노소프소갤로그로 이동합니다. 09.08.30 86 0
145571 정보처리 기사 시험을 봤는데 ㅇㅇ(112.149) 09.08.30 63 0
145570 형님들 한번만 봐주십쇼 포인터 너무 어려워요 부탁드리겠습니다. [32] 프갤형님(58.238) 09.08.30 195 0
145569 2보다 큰 모든 홀수는 소수이다??를 증명하라 [3] 신발라마갤로그로 이동합니다. 09.08.30 129 0
145568 이거 안풀리네... [2] 신발라마갤로그로 이동합니다. 09.08.30 86 0
145567 유니코드에서 TCHAR 사용 [2] 드럼좋아요갤로그로 이동합니다. 09.08.30 64 0
145566 해킹하려면 텔넷서버 접속해야함? [2] 123(121.129) 09.08.30 126 0
145565 최강희가 동안이라는데 사실인가연? [1] 관심시전갤로그로 이동합니다. 09.08.30 112 0
145564 형들이 지금 사용하는 비주얼 어시스트 버젼은 몇임? 곽한구(58.237) 09.08.30 31 0
145563 리눅스마스터 자격증말인데요 이건 기능사급인가요? 썸브피해자갤로그로 이동합니다. 09.08.30 45 0
145562 기사셤보고 왔다능 ㅋ [1] ㅋㅋ(219.241) 09.08.30 75 0
145561 10시 땡치면 담배피구 하루일과 시작해야지 [1] DMW(123.111) 09.08.30 68 0
145559 도서관에서 함께 옹기종기 모여 RPG 하는 한국 학생들 [2] Tathagata갤로그로 이동합니다. 09.08.30 156 0
145558 으앜ㅋㅋ 오늘 정보처리산업기사 시험인뎈ㅋ 맥콜(125.188) 09.08.30 69 0
145557 야이 그지 깽깽이들아!!!!!!!!!!!!!!!!(2) DMW(123.111) 09.08.30 122 0
145555 스타크래프트 같은 유닛 움직임 구현하기 어려움? [2] 신발라마갤로그로 이동합니다. 09.08.30 149 0
145552 부끄러운줄 알아야지!! [2] 제로리플(118.36) 09.08.30 116 0
145551 사람 죽는거 한순간이다... [12] Q Lazzarus갤로그로 이동합니다. 09.08.30 360 0
145550 지금 2시 4분이다. [3] 천재플머(121.139) 09.08.30 116 0
145547 할퀴고 물어뜯는 너희들을 보니 갑자기 그 분이 떠오르는 구나. [5] 천재플머(121.139) 09.08.30 138 0
145544 아 ㅅㅂ 프로그래밍이랑 떨어져 사니깐 머리가 하얗네~ [2] 오세욧(117.20) 09.08.30 101 0
145543 xbmc와 함께 하는 환상의 멀티미디어 경험 [10] 분당살람갤로그로 이동합니다. 09.08.30 150 0
145542 아래 지 경험담 쓴건 좋은데.. [5] 학생(221.151) 09.08.30 189 0
145541 퇴ㅋ근ㅋ [1] 아주아슬갤로그로 이동합니다. 09.08.30 57 0
145540 비쥬얼 스튜디오 2010 언제 나와요? [6] 좃프로그래머(124.53) 09.08.30 139 0
145537 역대 정권 무역수지성적표 [8] Vita500갤로그로 이동합니다. 09.08.30 170 0
145536 분당살람님하 [4] ㅅㅈㅎ갤로그로 이동합니다. 09.08.30 69 0
145535 흑흑.. 좀 슬프다. [2] 미친소울러갤로그로 이동합니다. 09.08.30 50 0
145534 내년 공간정보예산 80% 삭감에 사업 '올스톱' 위기 [6] 아주아슬갤로그로 이동합니다. 09.08.29 127 0
145533 프로그래머 -진짜 경험담에서 나오는 이야기- [30] (124.56) 09.08.29 535 0
145532 사람은 상심할때 큰 병에 걸린다고 한다. [6] 머그컵갤로그로 이동합니다. 09.08.29 158 0
145531 역시 우리나라엔 멋쟁이들이 많어 ㅋㅋㅋ [1] Wymkap5ss28a(119.71) 09.08.29 116 0
145529 수행업체 괴롭히는 공무원 신고하는제도 있나? [6] 아주아슬갤로그로 이동합니다. 09.08.29 122 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2