디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.07.21 23:02:31
조회 311 추천 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 - -
146955 롤러코스터~ [3] 유리한갤로그로 이동합니다. 09.09.09 70 0
146954 같은 app을 만든다면 아이폰 앱이 나을까 앤드로이드 앱이 나을까? [2] LOO(64.252) 09.09.09 80 0
146953 횽들 200⑨년 ⑨월 ⑨일 ⑨시 ⑨분이 지났어! [덯짤] [1] 맑탉앉앍꿇헒갤로그로 이동합니다. 09.09.09 89 0
146952 재범이 이야기 [4] Vita500갤로그로 이동합니다. 09.09.09 114 0
146951 어제 여교사 사건 있자나.. [4] rntjr갤로그로 이동합니다. 09.09.09 224 0
146950 본격 상부상조.png [1] 개쉛기갤로그로 이동합니다. 09.09.09 131 0
146949 아오... [2] clique갤로그로 이동합니다. 09.09.09 64 0
146948 무료 SVN호스팅 [4] Vita500갤로그로 이동합니다. 09.09.09 96 0
146110 씬입사원횽 서울순방기념, 벙개공지 [36] Vita500갤로그로 이동합니다. 09.09.03 2192 0
144108 프갤 정모 8월21일(금) [71] Vita500갤로그로 이동합니다. 09.08.17 2802 0
146946 웹프로그래밍이 응용프로그래밍보다 어려운듯 [1] 맥콜(125.188) 09.09.09 155 0
146945 잠깐 왔다가 퇴갤. Rei@디씨갤로그로 이동합니다. 09.09.09 54 0
146944 오늘은 200⑨년 ⑨월 ⑨일입니다. [1] Rei@디씨갤로그로 이동합니다. 09.09.09 76 0
146943 와.. 플렉스 샘플 보고 있는데, 바로 이거다... [2] 플렉스빠똘이(123.214) 09.09.09 123 0
146942 이슈가 되는 아이티 기술은? [7] ㅅㅈㅎ갤로그로 이동합니다. 09.09.09 145 0
146941 사는게 점점 두려워져 [4] 이모군(118.222) 09.09.09 99 0
146940 아까 물어본 문제인데요;;;;;;;;;;; [8] 샤이닝™갤로그로 이동합니다. 09.09.09 96 0
146939 노래 듣ㅋ기ㅋ DMW(220.68) 09.09.09 47 0
146937 횽들 오늘은 200⑨년 ⑨월 ⑨일이야! [덯짤] [1] 맑탉앉앍꿇헒갤로그로 이동합니다. 09.09.09 91 0
146935 신호 그래프로 처리하는건데요 [3] 얼룩팬더갤로그로 이동합니다. 09.09.08 113 0
146934 도와주세요 스크립트 관련 [6] 동큐(123.213) 09.09.08 77 0
146933 한 회사에 1년이상 못 있는것도 병인가요? [8] 켁큇갤로그로 이동합니다. 09.09.08 170 0
146930 결국 [2] IT대학갤로그로 이동합니다. 09.09.08 66 0
146929 형들 리눅스 터미널에서 현재까지의 cpu 사용시간 아는 명령어가 뭐야? [7] 맥콜(125.188) 09.09.08 176 0
146928 네트워크 질문 [7] 아돌아삔다(121.127) 09.09.08 91 0
146927 아주쓸쓸훃은 봄미다 [3] 개쉛기(61.101) 09.09.08 49 0
146926 타루 Live.swf [5] 숙신갤로그로 이동합니다. 09.09.08 120 0
146925 두근두근 [3] IT대학갤로그로 이동합니다. 09.09.08 62 0
146924 과연 타루 좋아하는 프갤러가 있을까 [4] 숙신갤로그로 이동합니다. 09.09.08 97 0
146923 이거 좀 웃긴다 [3] ㅇㅇㅃ갤로그로 이동합니다. 09.09.08 81 0
146921 scjp 희소가치같은거 읎죠? [1] 임베디드(112.150) 09.09.08 98 0
146920 비베 답변좀 [9] 테켄갤로그로 이동합니다. 09.09.08 70 0
146919 유리한 봐봐!!!!! [5] 천재플머(121.139) 09.09.08 135 0
146918 오늘 자바 강의가 있어서 들었는데. [8] IT대학갤로그로 이동합니다. 09.09.08 154 0
146917 gdb 잘 쓰고 좋아하는 사람 있습니까? [7] 부락페스티발갤로그로 이동합니다. 09.09.08 97 0
146916 [질문]제가 지금 대학교2학년 컴퓨터전공 학생인데...!! [3] ㅇ.ㅇ(58.235) 09.09.08 147 0
146915 집봐 누님이 연락왔다 [1] Vita500갤로그로 이동합니다. 09.09.08 48 0
146914 좋지못한 질문 [5] 이에갤로그로 이동합니다. 09.09.08 130 0
146913 자바할때 eclipse랑 jdk 있잖어 형들 [5] ㅇ.ㅇ(58.235) 09.09.08 84 0
146912 횽들중에 비주얼 어시스트 쓰시는분 있으면 답변좀 부탁해염. [2] 좇뉴비(110.11) 09.09.08 68 0
146911 가ㅡ상화 [2] 때릴꺼야?(116.40) 09.09.08 90 0
146910 2진수 떡밥 [4] 폭풍간지프로그래머갤로그로 이동합니다. 09.09.08 95 0
146908 놋북쓰는 형들 저스트모먼트 [6] 참치갤로그로 이동합니다. 09.09.08 114 0
146905 프로그램의 겉모습이 그럴듯 해 보이는 이유. [4] 천재플머(121.139) 09.09.08 106 0
146904 c++에서는 칸맞추는거 없어? [7] ㅇㅇ(119.197) 09.09.08 100 0
146903 네트워크쪽 일하는 횽들 궁금한게 있는데 [7] 혀배터갤로그로 이동합니다. 09.09.08 108 0
146897 2진수 떡밥.. [4] rntjr갤로그로 이동합니다. 09.09.08 116 0
146896 아오 요새 고딩들 왜이럼? [2] 숙신갤로그로 이동합니다. 09.09.08 150 0
146894 여친있는 횽아들 문자 함 보내보자. [9] 물속의다이아갤로그로 이동합니다. 09.09.08 161 0
146893 예고사건 그거 [2] ㅇㅇㅃ갤로그로 이동합니다. 09.09.08 107 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2