디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.07.21 23:02:31
조회 312 추천 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/27 - -
147242 전자레인지에 라면 끓이면 짱맛있어 [11] 좃프로그래머(124.53) 09.09.10 181 0
147241 니가 누굴 떠올리는지 맞춰주는 사이트 [19] 빕뱟뱟갤로그로 이동합니다. 09.09.10 197 0
147239 API 화면 찍는 원리가 궁금해서 말야, 질문좀 들어줘 형님들. [25] 겨울달갤로그로 이동합니다. 09.09.10 167 0
147236 넥슨 이번에 왠지 대박예감인걸? [4] 좃프로그래머(124.53) 09.09.10 168 0
147234 Vita500 보셈. [2] 그런데갤로그로 이동합니다. 09.09.10 80 0
147233 물어볼게잇는데요......... [4] 고미뉴(121.140) 09.09.10 112 0
147231 충격.. 유리한이 신종플루에 걸리는 꿈 꿈 [5] 좃프로그래머(124.53) 09.09.10 141 0
147230 던파 크루 버프타이머나 만들어야겠따. [2] 씬입사원갤로그로 이동합니다. 09.09.10 100 0
147226 횽들 QT 라이센스 LGPL로 바껴짢앙 [3] (210.117) 09.09.10 160 0
147225 소박한 유언.. [4] yundream(211.189) 09.09.10 124 0
147224 비타횽님 혹시 시간 있어? [4] 맑탉앉앍꿇헒갤로그로 이동합니다. 09.09.10 80 0
147223 포토샵 고수분들께 질문 [3] 유리한갤로그로 이동합니다. 09.09.10 66 0
147222 아프리카 여행 얘기가 나와서.. [4] 유리한갤로그로 이동합니다. 09.09.10 125 0
147221 횽들 자바 awt 배경 윈도우 바둑판처럼 덮을려면 어떻게 해야될까? 신발라마갤로그로 이동합니다. 09.09.10 60 0
147219 80년대 도트찍기 그래픽 프로그래밍 [3] Gromit갤로그로 이동합니다. 09.09.10 196 0
147218 님들아 자바배워보려는데 책추천좀..... [6] ㅁㄴㅇ(112.76) 09.09.10 127 0
147217 니들 소설같은건 읽냐? [5] ㅇㅇㅃ갤로그로 이동합니다. 09.09.10 129 0
147216 오바마 국회 연설 [5] Tathagata갤로그로 이동합니다. 09.09.10 113 0
147215 오브젝트 풀예제 [2] Vita500갤로그로 이동합니다. 09.09.10 74 0
147212 대학때 여친 지금은 [1] 피로토스갤로그로 이동합니다. 09.09.10 145 0
147210 그런데, 윤쿰횽은 그만둔거야? [2] Vita500갤로그로 이동합니다. 09.09.10 76 0
147209 프로그래밍 금액 질문.. (답변 좀 굽신굽신) [14] 소대갤로그로 이동합니다. 09.09.10 155 0
147207 나 여친이랑 여행가기로 했음 [4] ㅇㅇㅃ갤로그로 이동합니다. 09.09.10 124 0
147206 아오 근데 왜 내 여친님은 항상 참치갤로그로 이동합니다. 09.09.10 67 0
147205 windows fopen 질문. [21] 물속의다이아갤로그로 이동합니다. 09.09.10 181 0
147204 'ㅅ' prismatic갤로그로 이동합니다. 09.09.10 45 0
147202 프로그래밍 좀 못하는데 프로그래밍에 취업해도 괜찮을련지.. [14] 목소리(121.174) 09.09.10 246 0
147201 이런거 보면 정말 열받아 [6] 이모군(110.8) 09.09.10 116 0
147200 내가 보기에 결국 중요한건 자본이다. [9] yundream(211.189) 09.09.10 142 0
147199 난 C언어 백만줄 발로 코딩한다... [3] 물속의다이아갤로그로 이동합니다. 09.09.10 144 0
147198 난 C언어 2000줄 코딩 발로 한다. [8] 물속의다이아갤로그로 이동합니다. 09.09.10 148 0
147196 아프리카 여행 [8] 유리한갤로그로 이동합니다. 09.09.10 120 0
147194 난 다부서 마음에 드는데? [1] 유리한갤로그로 이동합니다. 09.09.10 80 0
147193 디시에 그런말이 있냐능? [2] Vita500갤로그로 이동합니다. 09.09.10 68 0
147191 형들 여행갈건데. [25] yundream(211.189) 09.09.10 170 0
147190 박재범 피장파장이네요 [11] 이모군(110.8) 09.09.10 161 0
147189 솔직히 C언어 좆밥도 2천줄 코딩한다. [22] 다부서(211.227) 09.09.10 298 0
147187 수업시간에 입갤. [1] 혼아갤로그로 이동합니다. 09.09.10 42 0
147186 내가 집에서 RAID 0인가 그걸 쓰거든 [6] nRST(114.206) 09.09.10 88 0
147185 내가 보기엔 자본보다는 지식이 더 중요한 factor 같은데... [7] 분당살람갤로그로 이동합니다. 09.09.10 83 0
147184 지금 C가 중요한게아냐!! API 고수 없엉? [10] 다부서(211.227) 09.09.10 128 0
147183 ccna 자격증 취득쉽나여? [2] 사성천갤로그로 이동합니다. 09.09.10 77 0
147181 저도 리눅스를 깔기로 했습니다. [14] prismatic갤로그로 이동합니다. 09.09.10 136 0
147180 야근 개발자의 애환 [5] LightEach갤로그로 이동합니다. 09.09.10 137 0
147179 C언어를 배워보려고 책사서 보고있는데 첨부터 막히네요 -_- [3] 반반쓰갤로그로 이동합니다. 09.09.10 79 0
147178 씨언어 도움을주실 횽잇나요 . ~ 모가 틀린거지요.... [3] dd(211.114) 09.09.10 63 0
147176 자본가와 노동자라.. [8] ㄱㄱ(211.254) 09.09.10 98 0
147174 호기심에 한 번 구입해본 SSD .. [9] 때릴꺼야?(116.40) 09.09.10 130 0
147172 우리는 자신의 후장에 대해 조금 더 신중 할 필요가 있다. [3] 개쉛기갤로그로 이동합니다. 09.09.10 89 0
147171 오브젝트 풀이란걸 만드는데.. [18] Vita500갤로그로 이동합니다. 09.09.10 94 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2