디시인사이드 갤러리

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

갤러리 본문 영역

DX 2D비행슈팅강좌 21. 다수의 적등장

Vita500갤로그로 이동합니다. 2009.09.02 18:20:18
조회 316 추천 1 댓글 5





===== DX 2D비행슈팅강좌 ======
===== 21. 다수의 적등장 =====
적이 하나였는데, 적의 수를 늘려보겠습니다.
적의 수가 늘어나면, 리스트로 관리 해야하며,
충돌처리도 좀더 유연하게 동작할수있도록
메시지 형태로 바꾸어보겠습니다.





1. 적의 목록을 담기
2. 적의 목록을 추가, Update, Draw, Release
3. Alive상태 추가
4. 메시지 받기
5. 충돌체크 함수
6. 100개의 총알과 2개의 적 충돌체크
7. 충돌메시지를 처리할 함수
8. 적과 총알의 충돌처리
9. 죽은 적처리









1. 적의 목록을 담기
typedef std::list <Character*> CharacterList;

CharacterList                _listEnemy;
CharacterList                _listEnemy_delete;

적의 목록을 담을수있도록 CharacterList를 만듭니다.
그리고, 그 인스턴스를 Application에 포함시킵니다.





2. 적의 목록을 추가, Update, Draw, Release
_listEnemy.push_back( pEnemy );

CharacterList::iterator itE;
for (itE = _listEnemy.begin(); itE != _listEnemy.end(); ++itE)
{
        (*itE)->Update();
}


적의 이미지정보, 텍스쳐등을 초기화 했다면, 적리스트에 넣습니다.
그리고 List의 적모두를 Update, Draw, Release시킵니다.
동작방식은 같습니다.






3. Alive상태 추가
struct Property
{
        BOOL ALive;                        // 살아있는 상태
};

VOID Character::setProperty(Property* pProperty)
{
        _Property = *pProperty;

        //if (_Property.HP <= .0f)
        //{
        //        _bVisible = FALSE;
        //}
}

BulletProperty.ALive                = TRUE;

살아있는 상태를 판별하기 위해서 Alive상태를 추가합니다.
그리고, setProperty값을 받을때, _bVisible은 수정하지 않습니다.
외부에서 Alive값으로 살아있음을 표현하기 때문입니다.
_bVisible과 Alive는 비슷하지만, 다르게 사용하기 때문에 수정하였습니다.
그리고, 모든 객체는 속성값을 넣을때 Alive값을 TRUE로 넣습니다.






4. 메시지 받기
enum GameMessageID
{
        GameMessage = 0,
        COL_BulletToEnemy,
};

EventReceiver(this);

충돌메시지를 받기 위해 COL_BulletToEnemy를 정의합니다.
그리고, 이벤트가 생겼을때 메시지를 받을 오브젝트를 자신으로 설정합니다.








5. 충돌체크 함수
VOID Application::Collision(UINT uMsg, Character* pBullet, Character* pTarget)
{
        const BoundBoxVec& vBullet = pBullet->getBoundingBox();
        const BoundBoxVec& vTarget = pTarget->getBoundingBox();


        for (UINT i=0; i<vBullet.size(); ++i)
        {
                for (UINT k=0; k<vTarget.size(); ++k)
                {
                        if ( vTarget[k]->LT.x < vBullet[i]->RB.x
                                &&vBullet[i]->LT.x < vTarget[k]->RB.x
                                &&vTarget[k]->LT.y < vBullet[i]->RB.y
                                &&vBullet[i]->LT.y < vTarget[k]->RB.y)
                        {

                                // 충돌메시지 발생
                                Event(uMsg, (WPARAM)pBullet, (LPARAM)pTarget);
                                return;
                        }
                }
        }
}

기존의 충돌체크부분을 함수로 따로 빼내었습니다.
충돌체크는 적과 아군총알외에도 다수 사용하기 때문입니다.
충돌이 확인되면, 메시지를 발생시키고, return합니다.

충돌체크함수에서 BOOL을 리턴하지 않고,
메시지를 호출해서, 결국 메시지에 대한함수를
호출하는 구조는 Update를 단순하게 할수있습니다.

Update에서 돌아가는 전체흐름은 단순하게 하고,
어떤 상황이 되었을때, 무엇을 하라
이런식으로 위의 코드가 진행됩니다.

Update에서 "움직여라, 애니메이션해라, 체크해라..."
등이 있으며, 그에 대한 처리를 Update에 해주지 않고,
모든 이벤트 상황을 뺍니다.

그렇게 되면, 코드에 문제가 생겼을때, 
이벤트 체크가 잘못되었는지, 아니면, 
이벤트에 대한 처리가 잘못되었는지,
게임진행만 봐도, 그것을 알수가 있습니다.

결국 문제의 범위를 축소할수있는 결과를 얻게 됩니다.








6. 100개의 총알과 2개의 적 충돌체크
Character* pEnemy = NULL;
CharacterList::iterator itE;
for ( INT i=0; i<100; ++i)
{
        if ( _Bullet[i].getVisible() == TRUE )
        {
                for (itE = _listEnemy.begin(); itE != _listEnemy.end(); ++itE)
                {
                        if ( (*itE)->getProperty()->ALive == TRUE)
                                Collision( COL_BulletToEnemy, &_Bullet[i], *itE );
                }

        }

}

총알이 보이는 상태이면, 적의 리스트와 비교를 하며 충돌체크를합니다.
단, 적은 살아 있을때 충돌체크를 합니다.
다수의 총알에 의해서 이미 죽어있는데, 다시 충돌체크할 필요가 없기 때문입니다.
충돌체크 부분은 만들어둔 충돌체크 함수를 사용하고, 충돌이 되었을경우
COL_BulletToEnemy메시지를 발생하라고 인자값을 넣어줍니다.








7. 충돌메시지를 처리할 함수
VOID Application::OnEvent(GameBase* pObj, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch (uMsg)
        {
        case COL_BulletToEnemy:
                OnCOL_BulletToEnemy((Character*)wParam, (Character*)lParam);
                break;
        }
}

OnEvent에 메시지가 발생됩니다.
코드를 단순하게 하기위해, 작은 처리라도 메시지를 처리할 함수를 만듭니다.
COL_BulletToEnemy메시지를 OnCOL_BulletToEnemy함수가 처리합니다.







8. 적과 총알의 충돌처리
VOID Application::OnCOL_BulletToEnemy(Character* pBullet, Character* pEnemy)
{
        // 충돌에 났을때 처리를 한다.
        // 충돌한 총알은 안보이고, 게이지 감소
        pBullet->setVisible(FALSE);

        Property proEnemy = *pEnemy->getProperty();
        proEnemy.HP -= pBullet->getProperty()->AttackDamage;


        if ( proEnemy.HP <= .0f )
        {
                proEnemy.ALive = FALSE;
                _listEnemy_delete.push_back( pEnemy );
        }

        pEnemy->setProperty( &proEnemy );
}

총알은 보이지 않게 하고, 적의 HP를 줄입니다.
그리고, 적의 HP가 0이하가 되면, Alive상태를 FALSE로 설정하고
삭제리스트에 넣습니다.
여기에서 pEnemy를 바로 삭제하면, _listEnemy가 엉키게 됩니다.










9. 죽은 적처리
Character* pEnemy_delete = NULL;
CharacterList::iterator itED;
CharacterList::iterator itD;
for (itD=_listEnemy_delete.begin(); itD!=_listEnemy_delete.end(); ++itD)
{
        for (itED=_listEnemy.begin(); itED!=_listEnemy.end();++itED)
        {
                if ( *itED == *itD)
                {
                        (*itED)->Release();
                        delete *itED;
                        _listEnemy.erase(itED);
                        break;
                }

        }
}

_listEnemy_delete.clear();

죽은 적이 있다면, 메모리에서 제거 합니다.

추천 비추천

1

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 연예인 안됐으면 어쩔 뻔, 누가 봐도 천상 연예인은? 운영자 24/06/17 - -
160458 터졌군요... [4] ㅇㄴㅣㅏ갤로그로 이동합니다. 09.12.03 99 0
160457 프로그래머는 노조 없냐능? [5] cp(118.221) 09.12.03 144 0
160454 오늘은 직장내 성희롱 예방 교육을 합니다. [5] 유리한갤로그로 이동합니다. 09.12.03 148 0
160453 일영사전이 하는거보니까 생각나는게 [1] SIGSEGV갤로그로 이동합니다. 09.12.03 58 0
160452 네버엔딩 숙신효과 [3] 아주아슬갤로그로 이동합니다. 09.12.03 81 0
160449 달력을 사자 [2] ㅇㅇㅃ갤로그로 이동합니다. 09.12.03 59 0
160448 로봇 물고기 얘기 좀 하지 말자. [3] 피로토스갤로그로 이동합니다. 09.12.03 125 0
160446 간단한 소스 해석좀 해주실분~ [9] 음음음(123.109) 09.12.03 110 0
160445 똥줄타는 스크. [3] 유리한갤로그로 이동합니다. 09.12.03 130 0
160440 로봇 물고기 만든다면서? [5] Gromit갤로그로 이동합니다. 09.12.03 141 0
160439 책 추천좀 해줘 [4] 뉴비(147.46) 09.12.03 109 0
160432 회사가 만만한건 아니지. [3] yundream(211.189) 09.12.03 200 0
160430 글로벌 취미생활 [4] ㅇㅇㅃ갤로그로 이동합니다. 09.12.03 113 0
160429 멍청한 협박범 [6] ㅇㅇㅃ갤로그로 이동합니다. 09.12.03 110 0
160427 지렁이라.... -_- [9] 아주아슬갤로그로 이동합니다. 09.12.03 113 0
160426 게시판 만들때 글내용은 무슨 타입으로 하는게 좋아? [4] 신발라마갤로그로 이동합니다. 09.12.03 72 0
160425 눈이나 내려라 [4] CP(118.221) 09.12.03 66 0
160424 로봇 물고기 [4] 잉여(203.253) 09.12.03 117 0
160423 프갤용어사전 : 개쉛기. [3] 개쉛기갤로그로 이동합니다. 09.12.03 190 0
160422 게시판 만들라네 [3] 신발라마갤로그로 이동합니다. 09.12.03 69 0
160421 드디어 내집마련의 꿈을 이뤘어요 ^0^ [6] CP(118.221) 09.12.03 133 0
160420 형들 나 3시에 면접인데 ㅠㅠ 도움점 ㅠㅠ [5] 맥콜(203.253) 09.12.03 128 0
160419 mfc 로 이런 프로그램 만드는 책 없슴?????? [3] powerid갤로그로 이동합니다. 09.12.03 173 0
160418 요즘 바빠서 웃을일이 없었는대 이놈의 병신은 좀 웃겨주지도 않내. [4] rntjr갤로그로 이동합니다. 09.12.03 122 0
160417 Vita500횽아는 봄.니.다. [2] 물속의다이아갤로그로 이동합니다. 09.12.03 71 0
160416 급여가 고구마로 바뀐다면, [3] 컴공볍진갤로그로 이동합니다. 09.12.03 113 0
160415 원래 오늘 면접이었는데 고추장불고기갤로그로 이동합니다. 09.12.03 38 0
160414 주인의식? [14] 단무지(203.244) 09.12.03 255 0
160411 우리회사 다니던 제네시스 풀옵션 그 횽아는... [7] 물속의다이아갤로그로 이동합니다. 09.12.03 147 0
160410 코드 재사용 [2] ㅇㅇㅃ갤로그로 이동합니다. 09.12.03 81 0
160409 이제부터 개쉛기 무시하지마~~ [2] 물속의다이아갤로그로 이동합니다. 09.12.03 97 0
160404 개발직이 되고 싶지만 뭘 개발하고 싶은지 갈피를 못잡는 늅들에게 [5] 아주아슬갤로그로 이동합니다. 09.12.03 162 0
160403 내가 본 최악의 회사... [7] 물속의다이아갤로그로 이동합니다. 09.12.03 243 0
160401 Empire State of Mind" Jay-Z [2] 츄도크갤로그로 이동합니다. 09.12.03 45 0
160400 회사를 때려쳐야 할 때는 말이지... [5] 물속의다이아갤로그로 이동합니다. 09.12.03 172 0
160397 야 임마! 늬들 윤하까지마라 [2] nRST(114.206) 09.12.03 82 0
160395 나도 사직서쓸준비해야지 [21] 개쉛기갤로그로 이동합니다. 09.12.03 245 0
160391 간만에 적는 나의 주식 비하인드 스토리 [2] 캐꼬꼬닭(112.216) 09.12.03 85 0
160390 오..내 놋북에서 윈7 잘 돌아간당.. [4] 캐꼬꼬닭(112.216) 09.12.03 84 0
160389 숙신횽은 젭알 내 글을 꼭 봄.니.다. [4] 물속의다이아갤로그로 이동합니다. 09.12.03 74 0
160387 출근 하는대.. [6] rntjr갤로그로 이동합니다. 09.12.03 142 0
160386 우리 학교 선생님 명언 [4] ㅁㄴㅇㄹ(122.46) 09.12.03 126 0
160379 형들 넷봇관련 질문점요^^ [11] 짜파개티(61.247) 09.12.03 126 0
160378 구글 “신문기사 접근 하루 5개로 제한” [1] rr(58.141) 09.12.03 110 0
160375 횽들 퇴직금에 대해서 말인데 [4] 목이삐끗갤로그로 이동합니다. 09.12.03 109 0
160374 근데 아이튠즈로 아이폰에 노래 넣을 때 말야... [1] 오사카(221.153) 09.12.03 437 0
160372 WINCE [1] winCE(218.148) 09.12.03 68 0
160370 윈도우 하위버전으로 컴파일 할수있는 방법이 있나요? [8] ㅇㅇㅇ(121.157) 09.12.03 104 0
160369 저기 추천좀부탁들리게요!! [4] 질문(118.32) 09.12.03 50 0
160368 숙신횽 ^^mfc리스트컨트롤 정렬방식좀.......알려주세요 ㅠ_ㅜ [6] 촙늅늅(222.118) 09.12.03 228 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2