디시인사이드 갤러리

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

갤러리 본문 영역

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

Vita500갤로그로 이동합니다. 2009.09.02 18:20:18
조회 314 추천 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/03 - -
157573 어제 여자사람을 만났습니다 [6] algo갤로그로 이동합니다. 09.11.16 136 0
157572 너님들 적분은 배워다가 어디쓸려고 그러나요 ? [6] Only.갤로그로 이동합니다. 09.11.16 153 0
157570 케로로 보구 잘라구 그랬는데..... [7] DMW(125.138) 09.11.16 86 0
157569 모던워페어 2 에서 진짜 이런거 됢?ㄷㄷㄷㄷ.swf [2] 숙신갤로그로 이동합니다. 09.11.16 129 0
157568 이때쯤_적절한_위꼴사.jpg [4] 숙신갤로그로 이동합니다. 09.11.16 117 0
157566 지금 위키백과 나만 안 들어가지는거야? [4] ∫ 2t dt=t²+c갤로그로 이동합니다. 09.11.16 64 0
157565 프갤은 치킨인증따위나 올리는 곳이 아닙니다. [8] algo갤로그로 이동합니다. 09.11.16 123 0
157564 오늘 치킨 인증 [8] Vita500갤로그로 이동합니다. 09.11.16 134 0
157563 치킨 좋지... [8] 아주아슬갤로그로 이동합니다. 09.11.16 86 0
157562 나는 진짜 세금이랑 보험료 아까워서 차 못사겠더라. [3] 소코(211.223) 09.11.16 57 0
157561 c#에서 equals를 *.*과 같이 쓸 수 있나요? [5] ㅇㅇ(121.133) 09.11.16 77 0
157560 김나스 님은 봅니다. [2] 숙신갤로그로 이동합니다. 09.11.16 63 0
157559 갤에 자바게이 있냐 [1] ㅇㅍㅅ(118.32) 09.11.16 53 0
157558 힘세고 좆흔 아침! [21] algo갤로그로 이동합니다. 09.11.16 113 0
157557 매주 닭을 2~3마리 시켜먹는법 [9] Vita500갤로그로 이동합니다. 09.11.16 113 0
157556 Vita500 횽이 매주 치킨을 2~3 마리 시켜먹는다는게 사실 임? [4] 숙신갤로그로 이동합니다. 09.11.16 82 0
157555 아르신빈 님은 봅니다. 숙신갤로그로 이동합니다. 09.11.16 21 0
157554 잠이 안온다.... [4] 물속의다이아갤로그로 이동합니다. 09.11.16 38 0
157553 이 단어 읽는 법좀 알려줄 형아?? [4] 허허벌판갤로그로 이동합니다. 09.11.16 93 0
157552 오늘 좀 무리했다능 [4] 오사카(221.153) 09.11.16 82 0
157550 잠깐 선덕좀 보려고했더니.. [1] 혼아갤로그로 이동합니다. 09.11.16 36 0
157549 플랫폼의 정의가 너무 추상적입니다. 저한테.. 명확히 이거다 라고 좀.. [3] 플랫폼질문(58.79) 09.11.16 75 0
157548 Db 개념적모델링을 못하겠습니다 [1] er다이어그램(112.149) 09.11.16 80 0
157547 형들 네트워크 패킷에 관해서.. [1] 허허벌판갤로그로 이동합니다. 09.11.16 40 0
157546 요즘 임베디드 장비(엠포스 2)에 대해 배우고 있는데요. [1] 밥오(218.155) 09.11.16 55 0
157544 야이 씨발..ㅠㅠ [1] 그래멍(211.45) 09.11.16 26 0
157543 밑에 질문한 C언어공부중인학생인데요..ㅠㅠ 수정해써염...ㅠㅠㅠㅠㅠㅠ [4] 김나스갤로그로 이동합니다. 09.11.16 92 0
157542 위엄쩌는프갤형님들...ㅠㅠㅠㅠㅠㅠㅠ 도와주세여 조공받침 [9] 김나스갤로그로 이동합니다. 09.11.16 143 0
157541 형님들 도와주세요 돌아버리겟어요 ㅜㅜ str1, str2 관련 ㅜㅡ [5] 아르신빈갤로그로 이동합니다. 09.11.16 51 0
157540 혹시 paros쓰는 형있어? [1] 니네집부자(210.110) 09.11.16 56 0
157539 루저의_난.swf [2] 숙신갤로그로 이동합니다. 09.11.16 102 0
157538 DMW와쪄염 뿌우 'ㅅ' [3] DMW(125.138) 09.11.16 80 0
157537 hwp 같은 파일 문서뷰어 만드는 거 가능한가요? [2] 문서뷰어질문(58.79) 09.11.16 61 0
157536 횽들 C를 서버로 소켓 통신해서 웹의 jsp의 결과를 받아오려는데 [1] 2(124.56) 09.11.16 233 0
157535 해결했습니다! 허허벌판님 감사합니다! [2] 프로그래밍초(58.120) 09.11.16 68 0
157534 형들님 C언어 질문좀ㅠㅠ [6] 늅늅!(119.82) 09.11.16 66 0
157533 C로 짠 간단한 좌석관리 프로그램 막힌 부분 질문 있습니다! [8] 눈팅족갤로그로 이동합니다. 09.11.16 101 0
157532 물속의다야횽을 위한 조공입니다. 딴사람 클릭하지마삼.. [8] rntjr갤로그로 이동합니다. 09.11.16 187 0
157531 이거 간단한건대.. 이해가 안감 [1] 이모군(116.127) 09.11.16 95 0
157530 만약 사랑하는 사람에게 프로그래밍적으로 고백을 한다면? [7] Triple3갤로그로 이동합니다. 09.11.16 136 0
157529 진짜 모르겠습니다. 제발 가르쳐주세요 [5] 프로그래밍초(58.120) 09.11.16 76 0
157528 또 질문이 있어... 답해주는분에게 조공예정.. [5] rntjr갤로그로 이동합니다. 09.11.16 117 0
157527 발코딩 인증 [2] 물속의다이아갤로그로 이동합니다. 09.11.16 150 0
157526 힙 vs 피보나치 힙?? ... 어떤게 다른..? [1] 날개달린호랭갤로그로 이동합니다. 09.11.16 1993 0
157525 역시 물속의댜야횽밖에 없내요.. 조공을 바칩니다. [5] rntjr갤로그로 이동합니다. 09.11.16 125 0
157523 1부터 시작안하려면 [3] 프로그래밍초(58.120) 09.11.16 77 0
157522 나도 문제 하나 낸다 ㅎㅎㅎ 졸라 어려운거.. [8] rntjr갤로그로 이동합니다. 09.11.16 128 0
157520 C언어 시간에...ㅠㅠㅠ 조느라 [14] 김나스갤로그로 이동합니다. 09.11.16 140 0
157519 chichi횽 있음? [3] prismatic갤로그로 이동합니다. 09.11.16 43 0
157518 오늘의 퀴즈 [3] 물속의다이아갤로그로 이동합니다. 09.11.16 53 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2