디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.09.02 18:20:18
조회 317 추천 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/24 - -
162964 아 시험공부 짜증나 ㅜㅜ [1] JuEUS-U갤로그로 이동합니다. 09.12.17 93 0
162963 근데요 자바로 채팅 만들려는데 방목록 그건 뭘로 만드는게좋을까요? 리스트 [4] ㄴㅇㄹㅇㄴ(121.138) 09.12.17 107 0
162962 횽들 공학인증에 대해 어떻게 생각해? [8] nAdAviLLe갤로그로 이동합니다. 09.12.17 121 0
162961 혹시... 프로그램 관련 교수님이 계신다면... [3] 엽기토깽이갤로그로 이동합니다. 09.12.17 128 0
162960 STL vector의 erase 제대로 작동 합니까? [3] 비교연산자(124.49) 09.12.17 128 0
162959 양심적으로 살자. [2] 유리한갤로그로 이동합니다. 09.12.17 157 0
162958 Wisestar 갤러리에 오신것을 환영합ㄴ디ㅏ [4] Wisestar갤로그로 이동합니다. 09.12.17 156 0
162957 신입인데요 Wisestar님의 안타까운 소식을 듣고 111(121.138) 09.12.17 85 0
162956 Wisestar 를 그만 놀려라. 숙제 해놨다. 어서 가져가라. [1] 씬입사원갤로그로 이동합니다. 09.12.17 113 0
162955 Wisestar횽이라면 답을 알려줘도 괜찮겠다 [5] 아주아슬갤로그로 이동합니다. 09.12.17 153 0
162954 아 다들 진짜 너무한거 아님? Wisestar 내가 도와줄게!! [15] LightEach갤로그로 이동합니다. 09.12.17 155 0
162952 Wisestar횽은 숙제 봄.니.다. [7] 물속의다이아갤로그로 이동합니다. 09.12.17 143 0
162951 저를 정보통신부 장관으로 만들어주십시오! [4] nRST갤로그로 이동합니다. 09.12.17 89 0
162950 자바 TItledBorder 좀 알려주십쇼 GUI 같은데 ㅜ [3] ㅁㄴㅇㄹ(121.138) 09.12.17 75 0
162948 씨샵 리스트박스 왤케 느려??ㅠㅠ [3] 씼쌰ㅃ(123.142) 09.12.17 70 0
162947 젊어보이고싶다 [4] 유리한갤로그로 이동합니다. 09.12.17 142 0
162946 다시 정리한 레알친절한 개쉛기 [6] 개쉛기갤로그로 이동합니다. 09.12.17 160 0
162945 저기 님들아 무작위숫자에 대한 갯수를 세야 하는데여 [7] 고리(210.104) 09.12.17 80 0
162943 테스트 고리(210.104) 09.12.17 34 0
162941 저 진짜 급박해요 ㅠㅠ [4] Wisestar갤로그로 이동합니다. 09.12.17 131 0
162940 컴퓨터 프로그래밍 시험문젠데 도와주세욤 ㅠㅠㅠ 풀이도있어야함 ㅠㅠ [8] Wisestar갤로그로 이동합니다. 09.12.17 178 0
162939 안드로이드폰 한국 출심 임박! [22] 그런데갤로그로 이동합니다. 09.12.17 217 0
162938 리눅스인데 요 문제 정답 아는 횽아~ [1] 닷넷(117.16) 09.12.17 85 0
162936 [100분 + a 토론] 프로그래밍의 진입 장벽이 문제인가? [7] 천재플머(121.139) 09.12.17 221 0
162935 아이폰 무료앱'서울버스1.0' 차단-? [30] 개쉛기갤로그로 이동합니다. 09.12.17 259 0
162934 이거 어찌해야할지모르겠다.. 아는사람?.jpg [6] 고리(210.104) 09.12.17 141 0
162933 영화 예매권이 2장 생길 것 같다 [6] ㅇㅇㅃ갤로그로 이동합니다. 09.12.17 116 0
162932 지하철 예절 ㅅ-ㅅ [4] 이웃집또테러갤로그로 이동합니다. 09.12.17 123 0
162931 jsp 간단한 질문! 왜 여기서 빨간줄이 그어지죠? [13] (211.238) 09.12.17 128 0
162930 횽들 밑에 코드 올려래서올려볼꼐요 [4] adsf(122.34) 09.12.17 66 0
162929 알바가 글을 삭제했군요ㅋ 3v(211.117) 09.12.17 39 0
162928 형들이것좀바바.. C--파일입출력에뭐가문젤까 [6] adsf(122.34) 09.12.17 104 0
162927 C# 에서 Closing 에 대해서 아는 분 계신가요? [2] (210.94) 09.12.17 85 0
162926 위대한 아이폰,, 아이폰 자전거도 있다능 [3] cp(118.219) 09.12.17 126 0
162924 핸드폰은 나에게 그저 알람시계일뿐 [3] 유리한갤로그로 이동합니다. 09.12.17 99 0
162922 5만원어치 지른것이 자랑~ [14] Vita500갤로그로 이동합니다. 09.12.17 229 0
162921 젖절하게 아이폰 신봉자 까는 글 [2] JuEUS-U갤로그로 이동합니다. 09.12.17 144 0
162920 어디서부터 누가 알바인가 [8] 유리한갤로그로 이동합니다. 09.12.17 140 0
162919 c언어 코딩좀 해주실분.ㅠㅠ [6] 이힝(222.99) 09.12.17 160 0
162918 프겔횽들 운동 열심히 하심? [12] as(124.61) 09.12.17 129 0
162917 ㅈㅅ [4] 빵꾸똥꾸(211.216) 09.12.17 81 0
162916 tmax에서 필드구조....전송데이타값좀알려주세요 ㅠㅠ tmax(116.40) 09.12.17 276 0
162915 내가 예전에 했던 프로젝트 중에 [7] Gromit갤로그로 이동합니다. 09.12.17 171 0
162912 여자들은 어그부츠에 왜 신음을? [7] algo갤로그로 이동합니다. 09.12.17 220 0
162911 왠지 늘보횽 통장엔 1억쯤 [13] algo갤로그로 이동합니다. 09.12.17 148 0
162910 어그녀 [12] 유리한갤로그로 이동합니다. 09.12.17 352 0
162909 여자들은 어그부츠 왜 신음? [1] 초밥술사갤로그로 이동합니다. 09.12.17 157 0
162908 아 졸립다는 [5] algo갤로그로 이동합니다. 09.12.17 81 0
162907 사실 어제 난리가 났었엉... [2] 아주아슬갤로그로 이동합니다. 09.12.17 99 0
162905 결정자/종속자로 1NF,2NF,BCNF 구별하는법점 알려주실분 ㅠㅠ [8] as(124.61) 09.12.17 283 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2