메뉴 건너뛰기

창작에 관련된 질문이나 간단한 팁, 예제를 올리는 곳

11편 : 적의 사망판정

일단 대미지를 입었을 때 처리를 바꿔 봅시다.
워프 하듯이 뒤로 날아가는 것은 아닌 듯 싶으니 말입니다.
일단 대미지를 입었을 때의 상태 하나를 추가합니다.

#define STATE_PAIN  5

대미지를 입었을 때는 아무 것도 못하게 컨트롤도 막습니다.

void Unit::Control()
{
     if(state==STATE_PUNCH || state==STATE_KICK || state==STATE_PAIN)return;
     ......

이제 Action 부분에서 새로운 상태를 추가해 줍니다.
상태에 따라 그림을 바꿔야 할 테니 허접하게 고친 제가 그린 그림을 일단 쓰겠습니다.
그림 잘 그리신 분들은 자연스럽게 고쳐 보시고


(밑에 첨부에서 다운 받으십시오.)

일단 이것을 받고 작업 폴더에 넣으신 후,
그림 불러 오는 곳에서 이것을 추가합니다.

jdd->LoadPicture("고통", "pain.gif", &jpi, true);

그럼 이번엔 Action에서 새로운 동작에 대한 처리를 추가합시다.

//대미지
else if(state==STATE_PAIN)
{
      if(aim == AIM_LEFT)jdd->DrawPicture(backbuffer, "고통", x, y-2, NULL);
            else jdd->DrawPictureEx(backbuffer, "고통", x, y-2, NULL, DPX_HFLIP);

      ++delay;
      if(delay >= 20)state=STATE_NORMAL;

      attack.left = -999;
}

대미지를 입은 상태에서는 '고통' 그림을 보여주면서
delay가 20까지 되면 다시 원래 상태로 돌아갑니다.
즉, 0.2초간 고통스러워 하다가 원래대로 돌아가는 겁니다.

이제 마지막으로 Damage 부분을 바꿉니다.
이전 것은 다 지워 버리고...

void Unit::Damage(bool hit_aim)
{
     state = STATE_PAIN;
}

이렇게 상태 변화만 넣어주고 실행시켜 보면...
아니? 이게 왠 일! 적이 맞아도 전혀 반응을 하지 않습니다.
어디가 잘못 된 걸까요?
그건 Control만 고치고 AI는 고치지 않았기 때문입니다.
AI에도 고통 상태에서는 아무것도 못 하게 고쳐줍시다.

void Unit::AI(int hero_x, int hero_y)
{
     if(state==STATE_PAIN)return;
     ......

AI와 주인공 캐릭터의 공통되는 사항은 나중에 하나로 묶어서 따로 분리해야 할 듯 싶습니다.
아무튼 여기까지 했다면 맞을 때마다 얼굴 색이 변하는 적을 볼 수 있습니다.



이젠 불사인 적이 지겨우니 죽도록 해봅시다.
Unit 클래스에 hp를 추가합니다.

class Unit
{
private:
      ......
      int hp;    //체력

public:
      ......
}

그리고 생성할 때 초기값은 8.

Unit::Unit(int x, int y, int speed)
{
      ......
      hp = 8;
}

그리고 맞을 때마다 1씩 깎입니다.

void Unit::Damage(bool hit_aim)
{
      state = STATE_PAIN;
      --hp;
}

hp를 알아낼 수 있는 GetHP도 추가합니다.
이건 알아서 하세요.

마지막으로 hp가 없을 때는 아무것도 처리하지 않게
메인 루프를 바꿉니다.

while(!GetKey(vkey_esc))
{
      if(!ProcessMessage())break;

      jdd->DrawPicture(backbuffer, "배경", 0, 0, NULL);

      hero.Control();
      if(enemy.GetHP()>0)enemy.AI(hero.GetX(), hero.GetY());

      hero.Action();
      if(enemy.GetHP()>0)enemy.Action();

      //충돌 검사
      if(enemy.GetHP()>0)
      {
            RECT attack = hero.GetAttackRect();
            RECT body = enemy.GetBodyRect();

            if(attack.left != -999)      //공격영역이 존재할 때
            {
                  if(attack.right >= body.left && attack.left <= body.right && attack.bottom >= body.top && attack.top <= body.bottom)
                  {
                        enemy.Damage(hero.GetAim());                                         
                  }
            }
      }

      jdd->Render();
}

곧 hp가 1이상이 되지 않으면 AI가 작동하지도 않고
움직이지도 보이지도 않는다는 것이죠.
충돌 검사도 하지 않습니다. 즉, 존재하지 않게 되는 겁니다.

한번 실행해 봅시다.
그런데 이상한 증상을 발견할 수 있습니다.
엥? 2대만 때렸는데 사라져 버리네?
분명히 hp가 8이니 8대를 맞고 사라져야 할 텐데 왜 2대에 사라져 버리는 걸까요?

그것은 중복해서 대미지를 입고 있기 때문입니다.
펀치를 내밀고 있는 동안 지속적으로 대미지를 주기 때문에 2대 정도에 적이 죽어버리고 마는 겁니다.
한번의 펀치에 한번만 대미지를 입도록 Damage 부분을 바꿔 봅시다.

void Unit::Damage(bool hit_aim)
{
      if(state != STATE_PAIN)
      {
            state = STATE_PAIN;
            --hp;
      }
}

이제 대미지 입은 상태에서 또 대미지를 입지 않을 겁니다.
다시 실행해서 테스트 해봅시다. 정확히 8대에... 8대에...
엥? 똑같이 1,2대에 죽습니다.
도대체 뭐가 잘못 된 걸까요? 으아아악!
이런 버그로 이렇게 공황상태에 빠질 수도 있습니다.
그래서 디버깅을 가르쳐 드리고 싶지만 그건 글로 적기엔 힘들 것 같군요.
아무튼 원인은 무엇이냐?
바로 Action 부분에 있습니다.
Action에서는 delay가 20이상 되면 다시 원래 상태로 돌리는데,
바로 이 delay를 대미지 입었을 때 초기화를 안 한게 문제였습니다.
펀치나 킥을 날릴 때는 확실히 초기화하고 있는데 말이죠.

추가합시다.

void Unit::Damage(bool hit_aim)
{
      if(state != STATE_PAIN)
      {
            state = STATE_PAIN;
            --hp;
            delay=0;
      }
}

이렇게 여러 트러블을 겪으면서 고쳐 나가다 보면
드디어 8대에 아름답게 사라지는 적을 볼 수 있습니다.

죽는 애니메이션을 넣고 싶으시면
새로운 STATE_DIE 같은 것을 넣고,
그 상태에서는 조종과 충돌검사가 안 되게 한 뒤
일방적으로 애니메이션을 보여준뒤 사라지게 하면 됩니다.
이건 그래픽 재료도 없고 하니 도전과제로 남기겠습니다.

조회 수 :
4647
등록일 :
2008.05.17
20:20:42 (*.239.144.2)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=study&document_srl=199799
List of Articles
번호 제목 글쓴이 조회 수 추천 수sort 날짜 최근 수정일
25 아아, 그렇다면... 흥크립트에서 [1] 장펭돌 1712   2008-02-02 2008-03-17 04:37
제가 타이틀을 만들고 나서 @마우스지원 해놓고 나니까 선택지에서 키보드로 선택할수 있는 커서가 사라지더라구요? 이건 원래 그런건지... 키보드로 선택해도 되긴 되는데 커서가 없어서 지금 뭘 고르고 있는건지 알수가 없는데.. 원래 이런건가요? 으음, 그...  
24 흥크립트, 이건 답변 안해주신듯... [1] 장펭돌 1669   2008-02-02 2008-03-17 04:37
마우스를 지원하게 하고싶은곳과 지원 안하게 하고싶은곳... 이 두곳을 어떻게 구분하죠? 저같은경우엔 특별한 경우를 제외하곤 마우스가 안나오게 할껀데... 어떻게 해야... 하는지 자세히 설명좀 부탁... ㅈㅅ.. * 똥똥배님에 의해서 게시물 이동되었습니다 ...  
23 흥크립트 질문 [1] 장펭돌 1733   2008-02-01 2008-03-17 04:37
흥크립트에서 if처럼 변수1이 1이면 어떻게되고 변수1이 2면 어떻게되고 이렇게 어떻게하나요? 역전심판에서 1+1 답 얘기할때, 정답을 말하느냐 오답을 말하느냐에 따라서 달라지는것 처럼 말이죠... 봐도 잘 모르겠네요... * 똥똥배님에 의해서 게시물 이동되...  
22 [re] 흥크립트 질문 똥똥배 1782   2008-02-01 2008-03-17 04:37
조금 복잡하지만 이렇습니다... ====================================== [분기] ([레벨]==16)?91:[분기] [분기] ([레벨]==15)?92:[분기] [분기] ([레벨]==14)?93:[분기] [분기] ([레벨]<=13)?94:[분기] @이동 [분기] ^91 당신의 랭크 : S @이동 95 ^92 당신의...  
21 클릭 문제.... ㄱ- [1] 장펭돌 1801   2008-01-31 2008-03-17 04:37
~클릭 100, 123, 0, 276, 186 @계속 ^100 이벤트 발생! 그림판에서 좌표수를 확인하고나서 123,0 부터 276,186의 위치를 위 처럼 정한뒤 흥크립트 실행후 아무리 클릭해봐도 안되네요... 또하나 궁금증은 창모드가 아닌 전체화 모드에선 마우스가 안나오는데.....  
20 흥크립트 궁금한점. [5] 장펭돌 1704   2008-01-31 2008-03-17 04:37
1. AVI 같은 동영상 파일이나, 플래시파일 재생 지원 가능한가여? 가능하다면... 뭐라 쓰면 되는지...? 2. 던전앤 러버처럼 마우스 클릭으로 실행되는 이벤트 만드는 방법 설명좀 부탁... * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:03)  
19 흥크립트 질문! [2] 네모상자 1692   2008-01-28 2008-03-17 04:37
글자변수는 조건분기가 안되나요? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:03)  
18 흥크립트 원인불명 버그 [5] 흑곰 1891   2008-01-23 2008-03-17 04:37
마우스 클릭하다가 게임 자체가 멈춘다. 마우스 인식, 키 인식이 안되며(Alt+F4포함) 걸리면 도리가 없고, 열받아서 컴퓨터를 부숴버리고 싶어진다. 현재까지는 장펭돌, 흑곰이 걸렸다. 원인은 잘 모르겠지만 게임을 새로 시작할 때는 일어나지 않는 것 같고, ...  
17 흥크립트 버그발견 [7] 네모상자 1754   2008-01-22 2008-03-17 04:37
한 줄에서 맨 앞에 {글자변수}를 사용하면 인식하지를 않음 예) {쥔공이름} : 네, 제 이름은 {쥔공이름}입니다(인식안함) 네, 제 이름은 {쥔공이름}입니다(인식함) * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:03)  
16 흥크립트 다루다 보니 알아낸게 있는데... [4] 네모상자 1765   2008-01-18 2008-03-17 04:37
그림이 없으면 대화창이 투명해지지 않는군요. * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:03)  
15 흥크립트 반전 버그 원인발견, 그리고 그 후폭풍 [4] 똥똥배 1691   2008-01-15 2008-03-17 04:37
흥크립트의 반전버그의 원인을 알았지만, 그게 간단한 문제가 아니라 거의 시스템을 다 엎어야 할 버그란 걸 깨달았습니다. 일단 흥크립트는 원본 그림은 그대로 둔 채 DuplicateSurface란 명령으로 그림을 복사해서 씁니다. 그런데 사실 복사라고 해서 그림을...  
14 똥똥배님께 질문 [6] 흑곰 1730   2008-01-09 2008-03-17 04:37
1. 시스템메모리와 비디오메모리의 차이는 무엇입니까? 각각의 장단점은 무엇인지..? 그리고 무엇을 (주로) 사용하시는지? 2. 흥크립트는 txt파일을 한줄 읽고 처리하고, 또 한줄읽고 처리하나요? 아니면 전부 다 읽고 몇줄씩 한꺼번에 처리하나요? 3. 한줄읽...  
13 [re] 똥똥배님께 질문 [1] 똥똥배 1682   2008-01-09 2008-03-17 04:37
1. 시스템메모리와 비디오메모리의 차이는 무엇입니까? 시스템 메모리는 말 그대로 컴퓨터에 달린 RAM이고, 비디오 메모리는 비디오카드에 있는 RAM입니다. 이론적으론 비디오 메모리가 용량이 작은 대신 속도가 빠르긴 한데... 시스템 메모리에 부른 것을 비...  
12 흥크립트 또 질문 [2] A.미스릴 1712   2008-01-02 2008-03-17 04:37
@그림 0, "XX"를 했었는데 그후 나중에 @그림 0, 'YY"를 해서 그림을 바꿔버릴 수 있나요 추가로 다음버전에서 {{사람이름}체력} 형식도 사용할 수 있게 해주세요 * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:00)  
11 흥크립트배경 어떤식으로 넣어야됨? [2] 세균맨 1751   2007-12-10 2008-03-17 04:37
갈쳐주셈 그리고 그림 순서 똑같게 잡으면 뭐나옴? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:00)  
10 흥크립트 질문 [3] A.미스릴 1729   2007-12-07 2008-03-17 04:37
마우스 커서 생겼을때 마우스 커서의 좌표를 취득할순 없나요?-0-; * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:00)  
9 흥크립트 기초 질문. [2] 장펭돌 2430   2007-12-03 2008-03-17 04:37
지금 슬슬 설명서를 읽어나가는중... 기본 원리에서 다른건 대충 전부다 이해가 가지만, 몇가지 이해가 안가는 것이 있어서 질문 합니다. 우선 그림파일은 mlc로, 텍스트 파일은 dlg로 바꾸는것이 맞지요? 그렇다면, '게임 전체적으로 쓸 그림이라면 DATA폴더...  
8 흥크립트로 만든 예제 4 file 대슬 1723   2007-12-02 2008-03-17 04:37
 
7 반복문 예제 [4] file 대슬 1833   2007-12-01 2008-03-17 04:37
 
6 흥크립트에서 반복문 실행하기 (덤추가) [9] 대슬 1790   2007-12-01 2008-03-17 04:37
[엔] 0 ^0:연산하는부분 //원하는 연산 내용을 자유롭게 적으면 됩니다. [엔] [엔]+1 ^1 [체크] ([엔]==10)?2:0 //↑[엔]의 값이 10인지 아닌지를 판별하고 10이면 [체크]에 1이, //10이 아니면 [체크]에 0이 들어갑니다. ([엔]==10)에서 10부분에 다른 수를 //...