조회 수 1226 추천 수 5 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
# Why?

2K로 SRPG를 만드는 이유는 SRPG 만들기로는 표현할 수 없는 다양한 변수의 조작과 반영이 가능하기 때문입니다. 굳이 SRPG 만들기로 가능한 시스템을 괜히 2k로 구현해봤자 그건 어리석은 행동에 불과하겠죠. 그냥 SRPG 만들기 툴을 사용하면 되니까요.
물론 XP를 이용한다면야 그럴듯한 SRPG가 가능할테지만 저와 같이 스크립트만 봐도 경끼를 일으키시는 분들은 힘들겠죠.

혹시 도움이 되실분이 있을까..싶어 엄청나게 삽질을 한 흔적들을 한번 올려봅니다.

내용은 초보스럽지만 변수의 활용등에 대한 기본적인 사항은 숙지하고 있음을 전제로 합니다.


1. 아군의 행동

1.1 이동영역
턴제 SRPG의 이동방식은 여러 종류가 있지만 크게 보아 2종류라고 볼 수 있습니다.

첫번째는 로봇대전이나 파이어엠블램, 프론트미션과 같은 방식이고
두번째는 아크더래드, 어스토시니시아 등과 같은 이동방식입니다.

전자의 경우 이동영역이 표시되고 플레이어가 지정한 위치까지 유니트가 이동하게 됩니다.
이를 앞으로 A방식이라 부르겠습니다.

후자의 경우 이동영역이 표시되고 플레이어는 그 영역내에서 자유롭게 돌아다니며 행동을 결정하게 됩니다. 이를 앞으로 B방식이라 부르겠습니다.

B방식에는 이동영역이 표시되지 않고 이동할때마다 행동포인트가 감산되어 행동을 끝내는 경우도 있습니다. 이를 앞으로 C방식이라 부르겠습니다.

우선 기본적으로 알아야 할 이동영역의 표시부터 설명드리겠습니다.


1.1.1 이동가능 영역의 표시
1) 먼저 쉽게 생각할 수 있는 이동영역의 표시는 이벤트를 이용한 노가다 방법이 있습니다. 유니트의 행동 특성을 정해두고 그 종류에 따라서 유니트를 중심으로 이동가능한 영역을 이벤트로 막아서 제한하는 방법이죠.

이 방법은 노가다가 심하긴 하지만 유니트마다 다양한 이동방식을 부여할 수 있다는 장점이 있습니다. 도저히 계산으로는 표한하기 힘든 기하학적인 이동영역도 만들수 있죠. B방식의 경우 이용하면 편리합니다.

턴제 SRPG라도 이 방법을 이용하면 액션과 유사한 자유로움을 느끼게 만들 수 있습니다.(ex:아크더래드)


2) 또다른 방법은 픽처에 의해 이동영역을 표시하는 방법입니다.
이 경우는 유니트를 중심으로 이동영역을 나타내는 픽쳐를 뿌려주고 이동영역의 제한은 이벤트로 처리하는 것이죠. 이동영역의 표현은 간단하지만 이동영역이 장애물에 막혀 다르게 표현되어야 할 경우에는 픽쳐의 표시가 애매해집니다.

그렇다고 이동영역의 생김새에 따라서 모든 픽쳐를 만들기에는... 너무 노가다입니다.
타일1개당 1개의 픽쳐를 사용해서 표현하는 방법도 있겠지만 이 방법은 이벤트 노가다보다 못한 방법이죠. 픽쳐수도 금방 모자라게 되구요. 지형같은거 필요없다!! 라는 분은 모르겠지만... SRPG에 지형이 없다면 게임이 너무 단조로워집니다.

따라서 픽쳐에 의한 표시방법은 그다지 권해드리지 않습니다.


3) 마지막으로 이동영역을 표시하지 않는 경우도 있습니다.
바로 C방식의 경우인데요, 이 경우는 행동력 감산을 통해 영역이 결정되므로 별다른 이동영역의 표시가 필요하지 않습니다. 이상한 던전 시리즈의 게임(풍렌의시렌,톨네코의대모험)의 경우가 바로 이러한 경우를 응용한 리얼타임 SRPG라고 볼 수 있습니다.


1.1.2 이동가능 영역의 계산

A방식과 같은 이동영역 계산의 경우 [기본행동력 + 지형정보 + 유니트성능 + 장비 + 기타] 등등등 많은 변수가 반영됩니다. 하지만 그 많은 변수가 어찌되었든간에 단지 계산에 불과할 뿐, "이동가능영역은 행동력에 의해 결정된다" 고 보면 바른 답입니다.

단지 그 행동력이 어떤 유형인가가 문제가 되기는 하겠지만요.
여기서는 그 행동력을 유니트가 이동가능한 범위라고 정의하겠습니다.

계산의 기본은
1) 이동가능영역을 상정하고
2) 영역에 대한 정보를 읽어 행동력에 반영,
3) 모든 변수를 반영한 계산이 끝난 후
4) 결과에 따라 유니트가 이동가능한 범위를 표시하는 것입니다.

하지만 일련의 행동들을 2k에서 구현하는것은... 제머리로는 무리가 따랐습니다.
(방법을 아시는분의 제보를... 부탁드립니다.)


1.1.3 캐릭터의 이동 방법
캐릭터를 이동시키는 방법은 여러가지가 있습니다만..

1) 지형에 대한 고려가 없을시에는 [주인공에게 다가간다]를 활용하면 간단합니다.
행동을 원하는 유니트를 클릭했을시 그 캐릭터가 이동가능한 영역이 표시되고
다시 커서를 움직여 원하는 지점을 클릭하면 선택된 캐릭터가 "커서인 주인공"에 닿을때까지 이동후 정지하는 것이죠.

하지만 좀 더 SRPG 다운 게임을 위해서는 좀 더 현명하게 캐릭터를 움직이게 하는 방법이 필요합니다만.. 장애물을 피해서 최적의 패턴으로 지정한 위치까지 행동하게 만드는 방법은... 제 머리로는 2k에서는 불가능이었습니다.


2) B방식의 경우는 간단합니다.
주인공을 커서로 표시해서 사용하고 있겠죠?
행동을 원하는 유니트를 클릭했을시에 해당 유니트는 투명상태가 되고 주인공이 커서에서 해당 유니트로 모습을 바꾸면 됩니다. 물론 행동이 끝나면 다시 원상태로 돌아와야 하겠죠.

구체적인 순서를 보자면
유니트를 클릭하면
[주인공 칩치환 & 해당 유니트 투명 & 이동가능 영역의 표시] 의 행동이 이루어져야 합니다.
이동을 원하는 좌표를 지정하면
[좌표점을 기억 & 기억된 좌표로 유니트의 이동 & 유니트와 주인공 칩의 변환] 의 행동이 이루어집니다.


3) C방식의 경우는 B방식과 마찬가지로 칩을 치환하고 키 입력을 조건분기로 받아들여 행동에 대해서 일정 변수를 가산시킨 후 정지시키면 됩니다.

이 쪽이 2k에서 구현하기에는 가장 편하다고 볼 수 있습니다.



1.2 공격방법

1) 가장 쉬운 공격 방법은 적유니트에 닿았을 경우 혹은 결정키가 눌러졌을 경우 데미지 계산을 설정하는 것입니다. 하지만 이 방법은 여러가지 행동에서 제약을 받습니다. 상당히 불편합니다.

2) 따라서 공격은 좌표점을 이용한 방법이 적절합니다.
유니트의 공격에 대한 범위를 좌표로 설정하고
해당 적유니트의 좌표가 그 무기 범위 좌표와 겹쳐졌을때 데미지를 발생시키면 됩니다.
액알을 구현하는 방법과 똑같은 방법입니다.



2. 적의 행동

적의 행동은 SRPG의 핵심입니다. 이것이 제대로 구현되지 않으면 SRPG를 할 이유가 없습니다.
적의 행동은 다음과 같은 순서에 따라 이루어집니다.

1) 공격대상의 선택(타겟의 선정)
2) 행동종류의 결정(이동 & 공격 & 이동공격 & 공격이동)
3) 실제 이동 & 공격
4) 턴의 종료 or 소멸

혹시 로봇대전을 즐기신 분들은 적의 유니트 행동시에 커서가 어느 위치에 가 있는지 기억하십니까? 커서는 적이 목표로 삼은 타겟에 위치하게 됩니다.
여기서도 적이 타겟으로 하는 유니트의 좌표가 결정되면 커서(주인공)를 해당유니트의 위치로 이동시키는 것이 행동을 제어하기에 편리합니다.


2.1 공격대상의 선택
타겟의 선택은 변수의 비교를 통해 이루어 집니다.
SRPG에서 자주 쓰이는 공격대상 선택방법은 다음과 같습니다.

- HP가 가장 적은 적을 노린다 & HP가 가장 많은 적을 노린다.
- 레벨이 가장 높은 적을 노린다 & 레벨이 가장 낮은 적을 노린다.
- 특정 아이템을 가지고 있는 적을 노린다. & 특정 아이템이 없는 적을 노린다.
- 특정 능력치가 가장 높은 적은 노린다. & 가장 낮은 적을 노린다.
- 가장 거리가 가까운 적을 노린다. & 가장 거리가 먼적을 노린다.

따라서 여러가지 공격대상 선택조건에 대한 커먼이벤트를 만들어두고 캐릭터의 특성에 맞게 불러오기를 통하여 활용하는 것이 좋습니다. 이 공격대상의 선택 방법이 유니트의 상태에 따라 여러가지로 변하게 한다면 좀 더 똑똑한 적을 만들 수 있습니다.


2.2 행동종류의 결정
적의 행동 종류 결정 방법에 따라 게임의 난이도가 결정됩니다.
적의 방어력과 체력을 높게 하여 난이도를 올리는 것은 시뮬레이션 RPG에서는 최악의 설계입니다.   따라서 이 행동을 잘 조작하여 최대한 얍삽한 적AI를 구현해야 합니다.

목표타겟을 선정하고 나면  공격할 것인가, 이동할 것인가, 특수행동을 취할 것인가의 3종류의 분기가 생기게 됩니다.

1) 가장 먼저 판단의 기준이 되는 것은 "공격인가 특수행동인가" 입니다.
여기서 특수행동은 자신의 체력 회복, 버프마법의 시전 등 공격과 이동이 아닌 모든 행동을 말합니다. HP가 적다면 회복, 버프마법이 걸려있지 않다면 마법 시전 등으로 행동을 결정하면 됩니다.

특수행동의 조건을 만족하지 않으면 공격이 가능한가를 판단하게 됩니다.
적 유니트 공격 범위의 좌표가 타겟 유니트의 좌표와 겹쳐질 경우 공격이 이루어지게 하면 됩니다.
물론 이러한 행동을 한 후에는 턴이 종료되거나 행동력이 감산되어야겠죠.


2) 공격 범위에 유니트가 없을시에는 이동을 하게 됩니다.
이동방식은 2가지 정도로 볼 수 있습니다.

첫번째는
이동범위를 상정한 후 이동범위 내에서 타겟과 가장 가까운 좌표를 구한 후 그 좌표점으로의 최적이동패턴을 구해서 이동하는 것입니다. 여기서 문제가 되는 것은 지형변수를 고려한 이동범위의 상정과 그 거리에서 좌표점까지의 최적이동패턴입니다.

제 머리로는... 불가능이었습니다. 지형과 장애물을 설정하지 않으면 주인공에게 다가간다나 해당 좌표점까지의 이동을 통해서 제어할 수 있지만 그게 아닌 경우는 좀 더 복잡한 제어가 필요합니다.

원리는 대충 알것 같은데 2k에서 구현하는 방법은 모르겠습니다.
프로그램을 전공하시는 분들은 아마도 다른 방법을 아시겠지만 제가 생각한 것은 이렇습니다.

먼저 지형을 무시한 이동 가능 영역을 다음 그림과 같이 표시합니다.



분홍색이 A라는 유니트가 이동 가능한 영역이고 검은색은 이동을 제한하는 스퀘어 입니다.

이동이 가능한 영역내에서 플레이어와 좌표간의 거리를 적어줍니다.
이동은 좌표간의 거리에 의해서 1 - 2 - 3 의 순으로 이동하면 어떻게 가던지간에 최적 이동이 될 수 있겠죠.

이 범위내에서 이동이 불가능한 지형이 생긴다면 이동 불가능한 지형에 해당하는 번호에 인접해있는 스퀘어 중 더 큰번호의 영역을 삭제하면 이동가능한 영역이 구해집니다.

이동력을 감산시키는 지형이 포함되어 있는 경우는 어떤 번호의 스퀘어에 장애물 지형이 포함되어 있는가에 따라 가능영역이 달라집니다. 1번 스퀘어에 이동력을 1 감산시키는 장애물이 있다면 그 방향의 모든 영역을 1씩 줄이면 되지만 2번에 장애물이 있다면 그 스퀘어에 유일하게 접해있는 다음 번호의 이동영역만을 감산시키면 됩니다.

즉, 최종 이동을 위해서는 이와 같은 행동을 끝낸 후 이동가능한 범위내에서 거리에 따라 매겨진 번호를 타고 이동하면 됩니다. 타겟에 가장 가까운 이동가능한 좌표점의 경우는 이동 거리에서 가장 먼 거리의(위의 그림과 같은 경우는 3번 스퀘어)스퀘어 중 하나로 결정되겠죠.

원리는 대충 이럴것이라 생각되지만...
실제는 모르겠습니다. 전 프로그램 지망이 아니라 기획쪽 지망이여서리.. =_=;


두번째는
적 유니트가 이동할때마다 행동력을 감산시켜 행동력이 0 이되면 턴을 종료시키는 방법입니다. 이 경우도 앞의 경우와 순서만 조금 다를뿐이지 원리는 동일합니다.
이 경우 이상한 던전 시리즈와 같은 게임을 구현할 경우 적은 매 행동마다 최적화된 방법을 계산하여 행동하게 됩니다. 하지만 턴제 RPG에서는 궂이 그런 방법을 쓸 필요는 없겠죠.


3) 적의 공격 & 턴의 종료
적의 이동이 끝나면 공격 가능 범위에 유니트가 있는지 없는지를 판단하고 있다면 공격 후 행동 종료, 없다면 행동 종료를 행하게 됩니다. 이에 대한 구현은 그리 어렵지 않지만 로봇대전과 같이 적 유니트의 기술이 여러 종류일 경우 판단에 영향을 주는 변수가 많아서 조금 복잡해집니다.


3. 턴의 제어

턴을 제어하는 방법에는 2종류가 있습니다.

로봇대전과 같이 아군의 턴과 적군의 턴을 나누어 한번에 움직이게 하는 것과
택티스오우거와 같이 각 유니트가 가진 행동력에 의해서 결정되게 하는 방법입니다.

3.1 턴이 구별된 경우
아군과 적군의 턴이 구별되어 있는 경우는 아군의 턴의 순서는 그리 신경쓰지 않아도 되니 편리합니다.

적군의 턴의 경우에는
1) 일단 모든 적 이벤트에 대해서 행동조건을 스위치로 부여합니다.
(몬스터1 행동시작, 몬스터2 행동시작 등과 같이 말이죠.)

2) 그리고 이를 제어하기 위한 이벤트를 만듭니다.
(몬스터의 숫자만큼의 제어이벤트를 만들어야합니다.)

3) 마지막으로 몬스터의 행동 순서를 제어하기 위한 변수를 만듭니다.

몬스터 1의 제어 이벤트는
[출현조건]은
[스위치] 몬스터턴이 ON & [변수]몬스터행동제어변수0 과 같을때.

[이벤트 시작]은
정기적으로 병렬처리

[내용]은
- 조건분기
몬스터1의 HP(변수)가 0보다 클때 몬스터1 행동시작 On로 지정합니다.
아닐경우에 몬스터행동제어변수 1가산.

그리고 몬스터 1의 이벤트 마지막줄에
몬스터1의 행동이 종료되었을시에 몬스터행동제어변수 1가산 을 넣어줍니다.


몬스터 2 제어 이벤트는
[출현조건]은
스위치 몬스터턴이 ON & 몬스터행동제어변수1 과 같을때.

[이벤트 시작]은
정기적으로 병렬처리

[내용]은
- 조건분기
몬스터2의 HP(변수)가 0보다 클때 몬스터2 행동시작 On로 지정합니다.
아닐경우에 몬스터행동제어변수 1가산.

그리고 몬스터 2의 이벤트 마지막줄에
몬스터2의 행동이 종료되었을시에 몬스터행동제어변수 1가산 을 넣어줍니다.


이런식으로 몬스터의 숫자만큼 이벤트를 만들고,
행동제어변수가 최고값으로 지정되는 몬스터와 그 몬스터의 제어 이벤트에는 조건에 맞추어
[행동제어변수 대입0]과 [몬스터턴스위치Off]만 넣어주면 됩니다.


구동순서를 말해보자면...
먼저 적의 몬스터 턴이 ON이면 정기적 병렬처리에 의한 몬스터 1의 제어 이벤트가 시작되게 됩니다. 몬스터 1의 HP가 0보다 클 경우, 즉 살아 있다면 몬스터 1의 제어 스위치가 ON 되게 되고 그에 의해서 몬스터 1은 행동을 하게 됩니다. 몬스터1의 행동이 끝나면 몬스터 행동변수는 1이 가산되고 몬스터 1의 제어 이벤트는 효력을 잃고 중지되고 몬스터 2의 제어이벤트가 시작되게 됩니다.(몬스터 1의 제어 스위치는 행동 끝에 당연히 OFF 시켜야겠죠?)  만약 몬스터 2의 HP가 0보다 크지 않을 경우는 그냥 몬스터 제어 변수가 1 가산되고 다음 몬스터의 턴으로 행동이 넘어갑니다.


3.2 리얼타임 턴인 경우
이 경우는 유니트들의 행동순서를 결정해주어야 합니다.

유니트의 행동력에 의한 우선 순위를 위의 경우의 행동제어 변수로 바꾸기만 하면 다른것은 거의 똑같습니다.

먼저 게임이 시작되면 우선순위가 높은 순서대로 0~n 까지의 순위를 결정합니다.
그리고 그 순서를 위의 경우와 같은 행동제어 변수로 놓고 사용하면 됩니다. 단 여기서 모든 유니트의 행동이 끝났을 경우 사용된 행동제어 변수의 리셋이 필요합니다.


* 택티스 오우거의 경우는?
조금 다른 방식을 이용해서 턴을 결정합니다.
택티스 오우거는 장비의 무게와 성능에 따라 WT라는 무게값에 의해서 유니트의 우선순위가 결정됩니다. 무게값을 계속 감산해 나가서 무게값이 0이 되는 유니트에 행동권을 부여합니다. 행동이 끝나면 이 무게값은 캐릭터가 가진 고유의 무게값으로 돌아가고 다시 카운트에 의해 무게값이 감산하기 시작합니다.
무게값 감산량의 결정은 현재 맵에 위치한 유니트 중 가장 작은 무게값을 가진 유니트의 무게값으로 결정됩니다.
(개인적으로 생각하기에 택티스 오우거의 경우가 가장 적합한 리얼턴 방식이라고 생각됩니다.)


전 결국 2k에서의 SRPG 구현을 포기하고 말았습니다.
똑똑하게 이동하는 유니트 만들기에서 진도가 나가지 않더군요.
이 글은 고민했던 과정을 정리한 글입니다.
고수분들께는 쓸모없겠지만 저와 같이 게시판을 뒤적거리며 공부하는 분들에게 도움이 되길 바라며 이만 글을 마칩니다.

Ps. 다 쓰고 보니 이 게시판에서 먹히지 않는 태그가 많군요. 할수 없이 계정에 올렸습니다.
      편하게 보실분은 링크를 클릭해 주세요.

      [알툴 2k 에서의 SRPG 구현에 대한 고민]
?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
744 RPG Maker RPG게임만들때 필요한 [ Tip ] 사토루 2005.08.08 1275
743 언어/기타 원의 방정식 알고리즘 file Spegel 2006.09.17 1272
742 언어/기타 약간의 아이디어.. 닉네임군 2006.10.08 1264
741 언어/기타 비밀번호를 설정해서 다른사람이 못하도록 만들어보자. 야미토츠바사 2005.08.29 1263
740 언어/기타 델파이를 이용한 게임 제작? 리닥터즈 2007.01.26 1262
739 언어/기타 몬스터 성향 괴인X 2007.03.04 1256
738 언어/기타 맵배치? 마스터! [집] -H- 2006.06.19 1254
737 RPG Maker RPG XP 배워보기 <직접제작메뉴예제> file 덩키동크 2005.11.12 1253
736 언어/기타 [DX&C++] 3D를 다루는 프로그램의 개요 Zeprod 2007.03.25 1247
735 언어/기타 [DX&C++] 3D 공간에 대한 이해 Zeprod 2007.03.04 1247
734 언어/기타 인공지능 동료를 만들어보자!! 다크세이버™ 2006.06.07 1240
733 언어/기타 [DX&C++] IndexBuffer를 알아보자! Zeprod 2007.03.31 1240
732 언어/기타 변수(變數)의 기초 바람을 가르는 자 2005.05.19 1235
» RPG Maker 알툴 2k 에서의 SRPG 구현에 대한 고민 1 하로우 2006.03.19 1226
730 언어/기타 [연구] 신개념 액알, 노가다를 최소한으로? SSS 2007.01.29 1225
729 언어/기타 BGM과 ME가 재생이 안될때 View2er 2007.01.16 1223
728 RPG Maker RPG2K 최적화 백과 사전 7 아싸사랑 2010.07.12 1220
727 언어/기타 [이벤트 ID이용의 예]슈팅 게임 file masa 2006.12.16 1215
726 RPG Maker 범위를 구할때 쓸 수 있는 식 둘 메카_탁 2006.12.09 1214
725 언어/기타 스토리아이디어 B HERO 2006.10.22 1212
Board Pagination Prev 1 ... 9 10 11 12 13 14 15 16 17 18 ... 51 Next
/ 51






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)