디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.07.21 23:02:31
조회 315 추천 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/06/17 - -
공지 프로그래밍 갤러리 이용 안내 [71] 운영자 20.09.28 35696 62
2715135 자바스크립트 열심히 하면 해외기업에 취업도 가능하다 [1] 프갤러(14.39) 14:05 1 0
2715134 요즘 왜 다 고기가 숯불이냐? [4] 헬마스터갤로그로 이동합니다. 13:52 21 0
2715133 브라우저 <- 이새끼 신 아니냐 [2] 타입스크립트갤로그로 이동합니다. 13:52 17 0
2715132 아 옛날 생각난다- 프갤러(121.172) 13:51 15 1
2715131 타입스크립트는 신이구나 ㅇㅇ(211.36) 13:48 14 0
2715130 지구에 더이상 새로운 먹을게없구나 [2] 헬마스터갤로그로 이동합니다. 13:46 18 0
2715129 코드 이쁘게 만드는 강의도 있냐? [1] 프갤러(14.39) 13:46 12 0
2715128 강사가 현직 경험많은게 좋은거 같음 [1] 프갤러(14.39) 13:44 17 0
2715127 코딩할때 적어도 이정도 눈빛이어야하지 않냐? [1] 헬마스터갤로그로 이동합니다. 13:41 35 0
2715126 중국 게임 루트킷이 있지만 넷플릭스, 소니도 루트킷이 있습니다 발명도둑잡기갤로그로 이동합니다. 13:41 8 0
2715125 폴라리스 vs 리브레 vs MS오피스 차이 심해? 프갤러(14.39) 13:38 6 0
2715124 cs 하나도 몰라서 자바 왜까는지 이해못함 [1] 타입스크립트갤로그로 이동합니다. 13:37 22 0
2715123 orm 안쓰고 쌩쿼리로 짜면 [2] 타입스크립트갤로그로 이동합니다. 13:36 24 0
2715122 요즘 oooo 유튜브보는데 css로 별걸 다하네 타입스크립트갤로그로 이동합니다. 13:29 15 0
2715121 노트북 램 8기가인데 프갤러(223.38) 13:26 18 0
2715120 리액트보다 jsp가 편하네 [2] 타입스크립트갤로그로 이동합니다. 13:25 28 0
2715119 서버 복구 했겟다- 프갤러(121.172) 13:19 28 1
2715118 스트링 특징 투척한다 [4] 키비갤로그로 이동합니다. 13:17 33 0
2715117 aws 요금 청구가 늘고 있다- [1] 프갤러(121.172) 13:16 43 1
2715116 모든 조건을 만족하는 언어: 파이썬 [4] 프갤러(183.101) 13:14 37 0
2715115 Si 전사인데 넥사크로 찍먹해보려는데 1년만 다녀볼까? [3] ㅇㅇ(106.102) 13:13 25 0
2715114 와 나도 메밀국수먹었는데 프갤러(223.38) 13:13 13 0
2715113 스프링 시큐리티 생각보다 별거없음 피에로가르뎅갤로그로 이동합니다. 13:06 26 0
2715112 스프링 시큐리티랑 oauth2 구현은 했는데 [3] ㅇㅇ(223.39) 12:50 47 0
2715111 갈배가 진짜 좋네 프갤러(60.253) 12:46 17 0
2715110 자바 기본 정리 올리면 보냐? [4] 키비갤로그로 이동합니다. 12:46 48 0
2715109 양치하러 가야지 [2] carpe갤로그로 이동합니다. 12:44 22 0
2715108 한동훈씨 아직도 자기가 뭐든 잘할수있다고 착각하는것 같다 헬마스터갤로그로 이동합니다. 12:44 30 1
2715107 백종원씨보고 많은 것을 느꼈다 [4] 헬마스터갤로그로 이동합니다. 12:41 46 0
2715106 지금까지의 날보면 코딩은 못하는거같은데 [1] ㅇㅇ갤로그로 이동합니다. 12:39 27 0
2715105 난 아직 인턴따리지만 프론트랑 좋은 관계를 유지하려고 노력함 ㅇㅇ [3] ㅇㅇ(223.38) 12:38 53 0
2715104 날이 더워 실내온도가 올라가니 ☆단비☆갤로그로 이동합니다. 12:37 11 0
2715103 오늘 나만 혼밥이야?? [1] carpe갤로그로 이동합니다. 12:34 24 0
2715102 점심 [3] 발명도둑잡기갤로그로 이동합니다. 12:29 22 0
2715100 3년전 일인데 [9] carpe갤로그로 이동합니다. 12:24 68 0
2715099 챗지피티가 잘짜냐 코파일럿이 잘짜냐 타입스크립트갤로그로 이동합니다. 12:20 21 0
2715097 자바 타입 String은 대문자 쓰는 이유 머임? [6] 타입스크립트갤로그로 이동합니다. 12:14 65 0
2715096 눈감가 발가락으로 게시판 짜면 취업 한다니까 그러네 [1] 류류(118.235) 12:09 32 0
2715095 이걸로 2D 게임이나 만들어야겠다. [3] 프갤러(183.101) 12:07 35 1
2715094 챗지피티 이새끼 좀 무섭네 프갤러(150.249) 12:04 35 0
2715093 코시국에나 "성장하고 싶은~ 성장하는~" 통했지 [1] 류류(118.235) 12:03 47 0
2715092 언제 사용할지도 모르는데 재사용성 고려하는게 [2] 타입스크립트갤로그로 이동합니다. 12:01 34 0
2715091 회사가 구로 가산 여기있다는것 만으로 기피함 ? [5] 프갤러(112.150) 11:57 65 0
2715090 2년동안 기존 서비스 유지보수나 했는데 ㅇㅇ(223.38) 11:55 23 0
2715089 팩트) 프론트는 테크 리더로 못올라감 [4] 프갤러(14.34) 11:54 57 0
2715088 프론트 할빠에 si감 ㅅㄱ [3] 프갤러(14.34) 11:50 77 0
2715087 안녕하세요. 성장하는 개발자, 프갤러입니다 [1] 프갤러(211.234) 11:49 32 0
2715086 게임 만들어보니까 oop 어느정도 이해가네 [2] 타입스크립트갤로그로 이동합니다. 11:46 43 0
2715085 고졸백수 AI ㅈ됐다 [1] ㅇㅇㅇ(1.237) 11:41 32 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2