디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.07.21 23:02:31
조회 313 추천 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 - -
147566 엘지전자 소스코드 공개 거부 [1] 관심시전갤로그로 이동합니다. 09.09.13 163 0
147565 정전이로세. JuEUS-U갤로그로 이동합니다. 09.09.13 31 0
147561 인천공한 해외매각등 사유화 반대서명 Vita500갤로그로 이동합니다. 09.09.13 52 0
147559 c++에 입문하였는데 [6] 뒹굴구르는이갤로그로 이동합니다. 09.09.13 149 0
147557 떡밥 [4] IT대학갤로그로 이동합니다. 09.09.13 103 0
147555 누가 관심좀 [3] NaCl갤로그로 이동합니다. 09.09.13 97 0
147552 난 사실 대학교 와서 [39] IT대학갤로그로 이동합니다. 09.09.13 453 0
147551 오늘은 여자사람과 놀이동산에 다녀왔음 [4] 케케켁켁갤로그로 이동합니다. 09.09.13 177 0
147549 이력서 여기저기 보냈는데 답이 없네 [4] Q Lazzarus갤로그로 이동합니다. 09.09.13 134 0
147548 타락플머의 하루군 타락플머(121.139) 09.09.13 31 0
147546 고전명화 매트릭스를 프로그래머적인 시각으로 함 바라봐봅시다? [6] 부락페스티발갤로그로 이동합니다. 09.09.13 152 0
147544 우아..... 정말 개강이군효 [7] Tathagata갤로그로 이동합니다. 09.09.12 91 0
147543 이게 뭔경우죠? [4] 공백(124.51) 09.09.12 64 0
147542 MYSQL 질문 ㅜㅜ [3] CP(118.221) 09.09.12 69 0
147541 netrw가 이상해요 [1] fL(222.238) 09.09.12 43 0
147540 이코드가 최적화 코드가 맞나요? [2] 화나(219.241) 09.09.12 81 0
147539 rand()함수에 관한건ㄷ ㅔㅠㅠ [21] 초보자(218.49) 09.09.12 153 0
147538 치킨창업 알아보는 살람 필독! [2] 분당살람갤로그로 이동합니다. 09.09.12 106 0
147536 병특가신 프겔러분 혹시 있나요? 있다면 질문 있습니다.! [2] 이강오(222.113) 09.09.12 84 0
147535 php copy함수 다시 질문 [1] 3(61.84) 09.09.12 29 0
147532 fprintf 질문요;; [7] 퍼덕퍼덕(218.235) 09.09.12 51 0
147530 예쁜 곳 [1] 조공플머(121.139) 09.09.12 99 0
147528 컴공과 학생인디요. 자격증 정보처리기사 밖에 안봄? [6] 이강오(222.113) 09.09.12 154 0
147527 c,d드라이브에 윈도우를 깔았을 때의 생기는 문제점 [3] 통프(124.137) 09.09.12 134 0
147526 횽들 바이러스치료 어떻게 하나요 ㅠ 제발 도와주세요 [6] 늅늅(211.209) 09.09.12 48 0
147524 좃프로그래머를 까지 맙시다. [2] 좇플머(121.139) 09.09.12 126 0
147523 횽들 VM웨어 질문점 잽싸게 해볼게 [1] 초급뉴비(58.120) 09.09.12 55 0
147519 아오 ICWT 이 호로색기들 BCPL(118.221) 09.09.12 46 0
147518 야 팩토리얼인지 좃터리얼인지가 그러케 대단하냐? [4] 좃프로그래머(124.53) 09.09.12 176 0
147516 주말은 한산하넹. 혼아갤로그로 이동합니다. 09.09.12 21 0
147515 충격.. 프갤 꿈을 또 꿈 [4] 좃프로그래머(124.53) 09.09.12 152 0
147514 스미골햏 보시오. 철학플머(121.139) 09.09.12 127 0
147513 오늘 산업기사 시험쳤다 양희철갤로그로 이동합니다. 09.09.12 59 0
147510 횽들 너무 그러지 마라능 [3] prismatic갤로그로 이동합니다. 09.09.12 79 0
147509 개강시즌이 되니깐 프겔이 온갖 개나 소가 점령을 해서 물을 흐리는구나. [6] 씬입사원갤로그로 이동합니다. 09.09.12 133 0
147505 C다음에 바로 API공부하면 힘든가요? [7] 흠점무갤로그로 이동합니다. 09.09.12 132 0
147504 몸을 파는 여자. [3] 철학플머(121.139) 09.09.12 168 0
147503 그런데 이것도 병신같은게 [8] Alkyl갤로그로 이동합니다. 09.09.12 120 0
147502 병신이 겨우 php에 goto생긴거 가지고 호들갑떨고 자빠졌네 [1] Alkyl갤로그로 이동합니다. 09.09.12 102 0
147501 나는 왜 이 모양일까? [1] 철학플머(121.139) 09.09.12 49 0
147500 이건 뭔가 자존심 상하는 일이 아닌가? 철학플머(121.139) 09.09.12 53 0
147499 나를 돌아본다. [2] 철학플머(121.139) 09.09.12 92 0
147498 이것은 무슨 뜻입니카? [14] 사나이갤로그로 이동합니다. 09.09.12 150 0
147496 루비에서 숫자 97을 a로 바꾸려면 어떻게 해야 하나요? [9] 루비질문(125.190) 09.09.12 104 0
147495 C++ If문 질문인데요.. [6] ㅇㅇ(211.202) 09.09.12 96 0
147494 내가 여기 검색질 하는데 왜케 암울하냐 ㅋㅋㅋ [8] 아오 c8 ㅋㅋ(222.233) 09.09.12 175 0
147492 mysql에서 ms엑서스처럼 여러값을 외래키로 받아올 수 있나요?? 나java바로갤로그로 이동합니다. 09.09.12 47 0
147490 형들 하나만 물어볼게 [9] 성대꼬꼬마갤로그로 이동합니다. 09.09.12 118 0
147488 맥북 노트북 완전 좆간지 나던데... [5] 성대아싸(121.137) 09.09.12 226 0
147487 녹십자 주가 [4] Vita500갤로그로 이동합니다. 09.09.12 179 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2