디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.07.21 23:02:31
조회 323 추천 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/14 - -
AD 휴대폰 액세서리 SALE 운영자 25/07/15 - -
272977 내 생각이긴 하지만 파인애플사갤로그로 이동합니다. 11.09.17 40 0
272976 미쿡 앱스토어에서 게임 다운할 수 있으면 봐봐. 밥먹어(183.1) 11.09.17 38 0
272975 이철판에 손가락넣어보실분모집 [7] Light search갤로그로 이동합니다. 11.09.17 140 0
272971 난 요즘 소셜게임 만들고 싶은데 [2] monoless갤로그로 이동합니다. 11.09.17 70 0
272970 IT 업계중에 제일 희망있는건? [9] 파인애플사갤로그로 이동합니다. 11.09.17 211 0
272969 뻘짓하다 깜방갈려면 40대 후반에 가라. [3] 포스형기획자(219.251) 11.09.17 74 0
272968 웹디자인은 한국에서 별로 희망이없지? [3] 파인애플사갤로그로 이동합니다. 11.09.17 104 0
272966 여기 아트릭스쓰는사람손! [2] Light search갤로그로 이동합니다. 11.09.17 57 0
272965 프로그래밍,디자인 모두 기술에 불과한것이다. [1] 포스형기획자(219.251) 11.09.17 81 0
272964 목적이라는게 중요한거 같아 monoless갤로그로 이동합니다. 11.09.17 56 0
272963 근데존나궁금한게있는데 [2] Light search갤로그로 이동합니다. 11.09.17 82 0
272962 횽들은 구글 언제부터 쓰기 시작했엉? [1] 생물학(125.248) 11.09.17 60 0
272960 스프링좀 하는쉑이 쳐봐라. [5] 쵸쵸(219.251) 11.09.17 100 0
272959 나 존나 멍청한듯 [3] 로하로하알로하갤로그로 이동합니다. 11.09.17 76 0
272957 C언어 주석 공부하고있는데 햇갈린다 [8] 힙꼬맹갤로그로 이동합니다. 11.09.17 180 0
272955 학력이랑, 하청업체...[필독 떡밥, 와서 물어줘요. 횽들] [27] 생물학(125.248) 11.09.17 322 0
272954 알고리즘 공부하려고책샀는데. [10] stdlib.h갤로그로 이동합니다. 11.09.17 206 0
272953 구구싱 ♥♡정수정♡♥갤로그로 이동합니다. 11.09.17 57 0
272951 나 학원 컨설팅 갓을떄 정보보안 할려면 이런거 배우라고 하드라 [8] 힙꼬맹갤로그로 이동합니다. 11.09.17 225 0
272950 오늘 책 3궈삼요 뿌잉잉 Adelposs갤로그로 이동합니다. 11.09.17 69 0
272948 보통 클래스하나 만들때 [5] laoshanlong갤로그로 이동합니다. 11.09.17 109 0
272946 Don't pretend your not an ugly fat x [7] lol(110.174) 11.09.17 92 0
272944 스킬트리 찍고 싶어도 직업 몰라서 안찍는 애들도 있냐? [8] 힙꼬맹갤로그로 이동합니다. 11.09.17 123 0
272942 프로그래머의 대우가 좆같은 이유 [1] ㅁㄴㄻㄹ갤로그로 이동합니다. 11.09.17 169 0
272940 내가 지금 공부 헛했다고 느낀게 [4] 메리프갤로그로 이동합니다. 11.09.17 127 0
272939 C 라이브러리 직접 만들때.... [4] LazyDok갤로그로 이동합니다. 11.09.17 114 0
272938 루빅스큐브 구현 [3] ㅁㅁㅁ(203.241) 11.09.17 614 0
272937 아니아니 Java님앙 그렇게 말구요 [4] SPlCA갤로그로 이동합니다. 11.09.17 92 0
272936 전자/컴공 공도리 취업 순위 [2] 시불라미갤로그로 이동합니다. 11.09.17 456 0
272934 프갤횽들이 보기엔 nhn sw아카데미 어때 ? 낚시는 아니겠지? [2] ㅇㅇ(222.112) 11.09.17 183 0
272933 생각놀이갤로그로 이동합니다. 11.09.17 56 0
272931 걍 대기업 전산실 가라. [9] 걍 그냥(115.139) 11.09.17 567 0
272928 그래도 개발자라는 직군이 그나마 학벌보다는 실력 위주이지 않냐? [4] monoless갤로그로 이동합니다. 11.09.17 192 0
272926 이제 일과표를 만들어서 그대로 생활해야겠ㅇ... [1] SODMaster갤로그로 이동합니다. 11.09.17 59 0
272925 이 분야에서 학벌이 어느정도를 차지한다고 생각해 형들? [5] ㅁㅁ(121.160) 11.09.17 244 0
272924 자바 아는형 이거 어떻게 해야하는거지.. SPlCA갤로그로 이동합니다. 11.09.17 61 0
272922 프로그래머 인력이 아무리 줄어도 대우가 개선되지는 않을거야 [4] 생각놀이갤로그로 이동합니다. 11.09.17 213 0
272920 우리가 등록하는 도메인 말야...등록하는데 그럼 원주인은 누구야? [2] 도메인(121.155) 11.09.17 99 0
272919 웹이라는게 일반응용프로그램에 비해 깊이가 마니 떨어지나 [2] 서전트페퍼갤로그로 이동합니다. 11.09.17 93 0
272918 Glen 님아 보세여 [12] monoless갤로그로 이동합니다. 11.09.17 82 0
272917 그런데 웹개발할꺼면 맥북이라도 상관없지 않나? monoless갤로그로 이동합니다. 11.09.17 93 0
272916 유동닉 급 불어나네 생물학(125.248) 11.09.17 41 0
272915 c언어 배우기가 쉽나요? [9] GlennGould갤로그로 이동합니다. 11.09.17 239 0
272914 한국 IT 사장들의 마인드 [1] 거칠게갤로그로 이동합니다. 11.09.17 183 0
272912 횽들 골드웨이브 싱크로율 어떻게잘맞춤? 오늘첨이라;; [1] 내내낸1갤로그로 이동합니다. 11.09.17 51 0
272911 신입 개발자의 연봉을 2천이하로 잡는 회사가 많다. 거칠게갤로그로 이동합니다. 11.09.17 172 0
272910 NHN 지원 했다. [3] (211.177) 11.09.17 196 0
272909 C언어 랑 web연습하고 싶은데 저가형 노트북 상관없을까요? [5] GlennGould갤로그로 이동합니다. 11.09.17 162 0
272908 ㅍ..프갤이 주것슴가 [3] 로하로하알로하갤로그로 이동합니다. 11.09.17 67 0
272907 요세 보안취업 루트 ( 경험담 ) [1] SUBbel(122.46) 11.09.17 270 1
뉴스 ‘85세’ 전원주 “아직도 연하남에 설렌다” 고백 왜? 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2