자, 강좌가 너무 오랫동안 없었다.(보는사람도 없지만)
이번편 몬스터 만들기는 들어가는 깊이에 따라 필요한 지식수준이 상당히 달라진다.
예를 들어 기본적인 이동과 피격이벤트만을 만든다면, 초보들도 손쉽게 만들 수 있겠지만
필자의 게임 Monster World처럼 상대방 몬스터가 공격을 하거나 플레이어가 일정 범위 안에 들어오면 따라오도록 하는 것은
약간의 실력이 필요하며, 이런저런 패턴 또는 PvP를 방불케 하는 AI를 만들기 위해서는 상당한 숙련자이어야 한다.
이 강좌는 중급 강좌.이라고는 하나 초보들이 쉽게 따라 하는 것이 우선이기 때문에 간단한 이동과 피격만을 다루겠다.
--------------------------------------------------------------------------------------------------------------------------------------
몬스터를 만들기 전에 여러분의 귀차니즘을 덜어줄 사전작업을 시작하자.
이전 강좌에서 우리는 공격범위 오브젝트를 만들었었다.
이 오브젝트를 조금 손봐야 한다.여기서 필요한 것이 '패런츠오브젝트'라는 개념이다.
-----------------------------------------------------------------------------------------------------------------------
패런츠?부모? 너님들이 생각하는 그 부모가 맞다.
왜 그런말들 하지 않는가? 부전자전. 모전녀전. ㅇㅇ
그 아버지에 그 아들 ㅇㅇ 그러니까 자세히 설명 하자면
오브젝트를 하나 만든다.생성될 때 이벤트에 알람0을 10으로 놓자.
그리고 오브젝트를 하나 더 만든다.거기에는 알람0 이벤트에 인스턴스 제거를 놓자.
그리고 처음 만든 오브젝트의 패런츠를 알람0을 놓은 오브젝트로 놓자.
그리고 처음 만든 오브젝트를 룸에 배치하고 실행시켜 보면, 10스텝(1/3초)후에 인스턴스가 삭제되는 것을 볼 수 있다.
즉, 패런츠 오브젝트를 설정해 놓으면 딱히 그 이벤트를 설정하지 않아도 패런츠 오브젝트의 이벤트가 자동적으로 실행된다는 말이다.
그리고 또 알아야 할 중요한게 있다.집안에 보면 돌연변이 한두명 씩은 꼭 있다.
땅딸보 집안에 키 180cm인 사람이 나오거나 뚱보 집안에 다 커서 몸무게가 50kg 나가는 사람이 나오거나.
오브젝트도 패런츠 오브젝트에 이벤트를 설정 해 놓아도 그 패런츠를 설정한 오브젝트(자녀오브젝트)에 같은 이벤트가 있다면
자녀오브젝트의 이벤트만 처리된다.간단히 말하면 부모오브젝트는 씹힌다 ㅋ
또 자녀인스턴스는 부모인스턴스로 취급되기도 한다.
자녀인스턴스 = 부모 인스턴스. ㅇㅇ
부모인스턴스와 충돌시 = 자녀인스턴스와 충돌시 ㅇㅇ
부모인스턴스 삭제 = 자녀인스턴스 삭제 ㅇㅇ
-----------------------------------------------------------------------------------------------------------------------
부모오브젝트를 알고 있다면 이 선 사이의 부분은 볼 필요가 없다.
자 다시 가던길을 가자. ㅇㅇ 공격범위 오브젝트의 부모가 될 오브젝트를 하나 만들자.
그리고 이벤트는 알람[0]에서 인스턴스 삭제.
그리고 다시 공격범위 오브젝트로 와서 방금 만든 오브젝트를 패런츠로 설정하자.
오브젝트 편집창 좌측 하단에 패런츠설정 탭이 있다.
자아 이제 사전작업은 끝이다.어렵나?어려우면 살포시 뒤로가기를 누르고 기본부터 다시 떼는 것을 추천한다.
여기부터 코드를 쪼끔 다룰 생각이다 ㅋㅎ
겁먹지 말고 따라와라.코드를 전부 뜯어주면서 설명 해 줄 테니.
일단 몬스터 스프라이트를 그리자.
그리고 몬스터 오브젝트를 만들고 스프라이트를 설정하자.
생성될 시 이벤트에
HP = 10
speed = 0
hit = false
이런 코드를 넣자.
HP를 10으로 설정하고 speed말그대로 속도이다.지금은 정지상태이니까 0으로 놓았다. 그리고 hit이건 무엇이냐, 피격중인지를 판별 해 주는 변수이다.조금 깊게 들어가면 이 변수 말고도 피격판별 변수를 많이 놓아줘야 한다.하지만 이것은 간단한 단계이기 때문에 hit하나면 된다.
여기서 true는 참, false는 거짓.0 또는 1로도 대체 할 수 있지만, 그러면 약간 헷갈리니, 이렇게 놓아두자.hit = false라는 것은 피격중이 아니라는 것이다.
그리고 알람[0] = 1
이벤트 알람[0]에서 image_xscale = choose(-1,1) image_xscale은 스프라이트의 가로크기.-1이면 좌우 반전이 된다.
choose함수는 ()안에 있는 수들 중 하나를 랜덤으로 선택한다.
그리고 speed = 원하는 수 * image_xscale
이건 뭐냐, 속도를 원하는 수 * 가로크기로 놓는다.
원하는 수가 1이면 1*가로크기.
가로크기가 -1이면 속도는 -1이 된다.-1이 되면? 후진한다.1이면?전진한다.
전진은 오른쪽으로 가는것을 전진이라고 하겠다.
그리고 알람[0] = 원하는 수
이렇게 놓아두면 다시 또 좌우중 랜덤 방향으로 이동한다.
이렇게 대강의 이동 AI는 완성이다.
이제 피격이다.
공격범위 오브젝트의 패런츠 오브젝트와 충돌했을시이벤트를 놓자.
공격범위를 또 만들었을 때 일일이 충돌이벤트를 만들수는 없지 않은가.
아 참 여기서 캐릭터 오브젝트의 생성이벤트에 delay = false로 놓자.이 역시 공격중이 아니라는 뜻.
공격할 때 컨트롤탭의 변수체크 액션을 이용해서 delay가 false일때만 공격하고, 공격 할때엔 delay = true, 알람[0]에 delay = false로 놓고 알람
을 적당히 설정 해 주자.그리고 공격판정 오브젝트의 생성이벤트에 dmg = 1로 놓자.
그리고 if hit = false{HP -= other.dmg} 이래 보자.
if hit = false 이건 hit변수가 false라면 이란 뜻이다.그리고 {}이 중괄호는 앞의 if문이 참일 경우 실행하는 내용들을 묶어 주는 것이다.
-= 이 부분은 감산이다.other.dmg는 충돌했을 때 충돌한 인스턴스의 dmg변수를 말하는 것이다.
즉 HP변수에서 충돌한 인스턴스의 dmg변수를 뺀다는 것이다.그리고 hit = true, 알람[1]에 hit = false로 놓고 알람[1]을 적당히 놓자.
이젠 공격을 당해서 HP가 다 닳았으면 죽게 해야겠지?
스텝이벤트에 가 보자.
if HP < 0{instance_destroy()}이래보자.
만약 HP변수보다 0이 크다면 instance_destroy() <- 인스턴스를 삭제한다.
완성이다!!
이제 몬스터를 룸에 배치 해 보고 실험 해 보자.
아 그리고 공격범위 오브젝트는 투명체크를 풀어주자.
공격범위가 보이면 뭐랄까 살짝 거치적 거린달까.
뭐 어쨋든 이런건 너님들 맘이다.
그럼 다음 강좌는 레벨업 강좌가 되겠다.
다음강좌 리젠 예정일은 지구가 멸망하는날.
데헷 미안하다 필자도 모른다 내키는 대로 쓰는 거지 뭐 ㅋ
제발 덧글 좀 답시다 허허허