디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.07.21 23:02:31
조회 321 추천 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/07 - -
AD 디지털 액세서리 기간한정 세일! 운영자 25/07/11 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 45425 65
2871316 강아지 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:34 4 0
2871314 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:26 4 0
2871312 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:23 4 0
2871310 ❤✨☀⭐⚡☘♥+나님 시작합니당♥+☘⚡⭐☀✨❤ ♥로스트미디어냥덩이♥갤로그로 이동합니다. 08:16 9 0
2871308 자바 입문 떼려는데 자바의 정석 vs 자바의 신 [3] ㅇㅇ갤로그로 이동합니다. 08:02 21 0
2871306 격투기 할 때 한명이 아무리 챔피언이라도 아마추어 두명이 대들면 [1] 발명도둑잡기(118.235) 07:56 13 0
2871304 촘스키 "미국은 부자에게는 사회주의, 가난한 사람에게는 자본주의" 발명도둑잡기(118.235) 07:11 18 0
2871303 코딩 입문자 자바 위주로 하려는데 [3] 프갤러(49.167) 07:11 40 0
2871301 영업기밀은 열린사회의 적인가 발명도둑잡기(118.235) 07:03 18 0
2871300 부가가치를 높이기 위해 영업기밀을 숨겨서 정보비대칭을 만들며 독과점을 만 발명도둑잡기(118.235) 07:01 14 0
2871298 소니가 고장없는 제품 만들기를 목표로 하다가 고장 잘 나도 AS 수리로 [2] 발명도둑잡기(118.235) 06:55 22 0
2871297 소니가 고장없는 제품 만들기를 목표로 하다가 고장 잘 나도 AS 수리로 [1] 발명도둑잡기(118.235) 06:55 20 0
2871295 사회주의 기술 장인과 자본주의 기술 장인 차이점 [1] 발명도둑잡기(118.235) 06:50 15 0
2871293 제이콥 닐슨의 10가지 사용성 평가 기준 [1] 발명도둑잡기(118.235) 06:33 21 0
2871291 음기 충전 발명도둑잡기(118.235) 06:28 14 0
2871289 C 메모리 실수 발명도둑잡기(118.235) 06:18 16 0
2871286 vala 메모리 실수 발명도둑잡기(118.235) 06:10 18 0
2871284 carbon 메모리 실수 [1] 발명도둑잡기(118.235) 06:07 22 0
2871282 C++ 20 이상 메모리 실수 [1] 발명도둑잡기(118.235) 06:05 33 0
2871281 rust 메모리 실수 [1] 발명도둑잡기(118.235) 06:03 21 0
2871280 vale 언어 메모리 실수 [1] 발명도둑잡기(118.235) 06:02 24 0
2871279 nim 언어 메모리 실수 [1] 발명도둑잡기(118.235) 06:01 22 0
2871277 D 언어 메모리 실수 [1] 발명도둑잡기(118.235) 06:00 20 0
2871276 odin 메모리 관리 실수 줄이기 [1] 발명도둑잡기(118.235) 05:58 25 0
2871274 zig 언어 메모리 수동관리 c보다 실수 적게 만들었나 [3] 발명도둑잡기(118.235) 05:54 26 0
2871272 디씨 극우 등신새끼들은 assembl-y를 차단어로 설정해 국회 청원을 [2] 발명도둑잡기(118.235) 05:39 29 0
2871270 si 이상으로 에이전시는 더 별루야 [1] 피치피(183.101) 05:37 27 0
2871269 인터프리터 아니고 컴파일 되는 자바스크립트나 타입스크립트 문법 언어 [2] 발명도둑잡기(118.235) 05:37 29 0
2871267 git이 SVN을 능가하는 최고 장점이 수익화하기 편하다는거 [8] ㅆㅇㅆ(124.216) 05:33 54 0
2871266 그놈이 느려진 이유가 자바스크립트 많이 써서인가 [5] 발명도둑잡기(118.235) 05:31 29 0
2871264 난 정말 뭐할까 ㅠ [3] 피치피(183.101) 05:22 41 0
2871263 git이 표준이 된 이유는 github 소셜이 큰거 같음 [8] ㅆㅇㅆ(124.216) 05:21 58 0
2871262 나는 암만 생각해도 SVN이 더 편한거 같은데 [2] ㅆㅇㅆ(124.216) 05:13 32 1
2871261 svn에서 깃 전환하고 느낀것인데 [7] ㅆㅇㅆ(124.216) 05:10 41 0
2871260 환자가 천천히 나을수록 의사는 돈을 더 번다는 역설 [1] 발명도둑잡기(118.235) 05:06 21 0
2871258 근데 삼촌 빡고수라던데 왜 프갤 탈퇴한거냐 [4] ㅆㅇㅆ(124.216) 04:49 41 0
2871256 computer란 사라진 직업 [1] 발명도둑잡기(118.235) 04:40 30 0
2871254 문화계 만난 이 대통령 “예술인 기본소득 필요” 발명도둑잡기(118.235) 04:21 14 0
2871252 방금 전 뜬 9GAG 릴스 혼자 하는 테니스 릴스 영상 보니 발명도둑잡기(118.235) 04:02 17 0
2871251 삼촌이 100% 자동화 백엔드 도구 만들었던데 [1] 프갤러(183.101) 03:59 41 0
2871250 동양철학:남에게 받은건 바위에 새기고, 도운것은 모래에 새겨라 ㅇㅇ(183.101) 03:57 13 0
2871249 오늘의 소설, 영화 실마리: 일제와 나치의 동맹과 몰락 이야기 발명도둑잡기(118.235) 03:45 20 0
2871247 '노동존중' 이재명 정부와 최저임금법 제1조[노동TALK] 발명도둑잡기(118.216) 03:29 20 0
2871246 히틀러에게 훈장을 받은 일본 해군장교 발명도둑잡기(118.216) 03:27 13 0
2871243 오늘의 영상 기획 실마리: 컴퓨터 팬으로 드론 발명도둑잡기(118.235) 02:51 19 0
2871242 탑골공원은 일제의 압제를 뚫고 기미독립선언을 했던 장소임 발명도둑잡기(118.235) 02:28 19 0
2871240 냥덩이 똥구멍 찢길 예정 발명도둑잡기(118.235) 02:22 25 0
2871239 세상에 대한 원망과 슬픔이 느껴지는 글이 있다 발명도둑잡기(118.235) 02:14 17 0
2871238 전광훈 자유마을 업드려뻗쳐와 에스파-더티 워크 풍자 발명도둑잡기(118.235) 02:11 16 0
뉴스 손담비♥이규혁, 딩크족 계획했지만 남편의 아기 욕심에 출산 결심...딩크보다 행복한 일상 디시트렌드 07.10
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2