본문 바로가기
Tips

RPG Maker MV에서 귀환서(Teleport Scroll)를 만들어보자 - RPG Maker MV

by biud436 2018. 11. 7.


먼저, MV가 설치된 폴더에서 DLC 폴더로 갑니다. 


KadokawaPlugins 폴더에서 LastUsedItem 플러그인을 만들고 있는 게임의 js/plugins 폴더로 복사해서 붙여 넣습니다.



귀환서 아이템을 만들고 공통 이벤트를 설정합니다.



귀환서 아이템의 메모(comment) 란에는 다음과 같은 모든 귀환서에서 공통으로 처리할 노트 태그를 설정해둡니다.


1
2
3
<귀환서:true>
<불가능:[1,2]>
<가능:[{baseMapId:3, mapId: 4, x:14,y:24}, {baseMapId:4, mapId: 3, x:9,y:10}]>
cs


'귀환서' 공통 이벤트에서 이 정보를 가져와 처리해야 합니다.



텍스트로 보면 다음과 같습니다.


Script:// 마지막으로 사용한 아이템 ID
Scriptvar _lastItemIdx = $gameVariables.value(8);
Script// 아이템 객체 획득
Script$gameTemp._teleportItem = $dataItems[_lastItemIdx];
If:Script:$gameTemp._teleportItem.meta["귀환서"] === "true"
Script:$gameTemp._teleportDisableMap = eval($gameTemp._teleportItem.meta["불가능"]);
Script$gameTemp._teleportMovableMap = eval($gameTemp._teleportItem.meta["가능"]);
Comment:현재 맵이 귀환서 사용 불가능 지역인가?
If:Script:$gameTemp._teleportDisableMap.contains($gameMap.mapId())
Text:None, Window, Bottom
Text사용 불가능 지역입니다.
Change Items:귀환서 + 1

End
Comment:현재 맵이 귀환서 사용 가능 지역인가?
If:Script:$gameTemp._teleportMovableMap
Control Variables:#0001 인덱스 = 0
Loop
Script:var idx = $gameVariables.value(1);
Script$gameTemp._myTempItem = $gameTemp._teleportMovableMap[idx];
If:Script:!!$gameTemp._myTempItem
Control Variables:#0002 이동할 맵 ID = parseInt($gameTemp._myTempItem.mapId)
Control Variables:#0003 이동할 맵 X = parseInt($gameTemp._myTempItem.x)
Control Variables:#0004 이동할 맵 Y = parseInt($gameTemp._myTempItem.y)
Control Variables:#0005 현재 맵 ID = parseInt($gameTemp._myTempItem.baseMapId)
Comment:새로 추가한 5번 변수와 비교
If:Script:$gameVariables.value(5) === $gameMap.mapId()
Transfer Player:{이동할 맵 ID} ({이동할 맵 X},{이동할 맵 Y})
Break Loop

Else
Control Variables:#0001 인덱스 += 1

End

Else
Break Loop

End

Repeat Above

End

End


차례대로 살펴봅시다.


LastUsedItem 플러그인을 사용하면 마지막으로 사용한 아이템의 ID 값을 변수에 저장할 수 있습니다.


이 ID 값을 _lastItemIdx 변수에 담고, 세이브 파일에 저장되지 않는 임시 전역 변수 안에 저장합니다. 


이렇게 하면 노트 태그 값을 가져올 수 있는 아이템 객체를 얻게 됩니다.


1
2
3
4
// 마지막으로 사용한 아이템 ID
var _lastItemIdx = $gameVariables.value(8);
// 아이템 객체 획득
$gameTemp._teleportItem = $dataItems[_lastItemIdx];
cs


플러그인이 없어도 노트 태그 값이 자동으로 만들어지는데요. 


이점을 활용하면 다음과 같이 귀환서 아이템인지 확인하는 용도의 조건문을 만들 수 있습니다.


1
◆If:Script:$gameTemp._teleportItem.meta["귀환서"=== "true"
cs


귀환서 아이템의 노트 태그 값을 가져와 배열로 만듭니다. 


노트 태그 값에 있는 배열은 그냥 문자열이기 때문에 자바스크립트 배열로 만들어야 합니다.


JSON.parse나 JsonEx.parse를 쓸 수도 있지만, 그냥 eval을 사용하여 처리하겠습니다.


1
2
$gameTemp._teleportDisableMap = eval($gameTemp._teleportItem.meta["불가능"]);
$gameTemp._teleportMovableMap = eval($gameTemp._teleportItem.meta["가능"]);
cs


이 데이터를 스크립트로 처리하면 아래와 같이 불가능 지역을 수 많은 조건 분기 문이 없이 체크할 수 있습니다. 


If:Script:$gameTemp._teleportDisableMap.contains($gameMap.mapId())
Text:None, Window, Bottom
Text사용 불가능 지역입니다.
Change Items:귀환서 + 1

End


지역 이동 처리도 구현해야 합니다.


배열에 있는 값을 차례대로 나열하려면 반복문으로 인덱스 0부터 끝까지 읽어야 합니다.


또한 해당 원소에는 mapId, x, y 값이 있을 것으로 예상됩니다. 


그러나 해당 값은 문자열 값이므로 자바스크립트 정수 값으로 바꾸는 처리를 해야 합니다.


mapId가 현재 맵의 ID와 같으면 노트 태그에 적어둔 특정 맵 좌표로 이동 됩니다


Comment:현재 맵이 귀환서 사용 가능 지역인가?
If:Script:$gameTemp._teleportMovableMap
Control Variables:#0001 인덱스 = 0
Loop
Script:var idx = $gameVariables.value(1);
Script$gameTemp._myTempItem = $gameTemp._teleportMovableMap[idx];
If:Script:!!$gameTemp._myTempItem
Control Variables:#0002 이동할 맵 ID = parseInt($gameTemp._myTempItem.mapId)
Control Variables:#0003 이동할 맵 X = parseInt($gameTemp._myTempItem.x)
Control Variables:#0004 이동할 맵 Y = parseInt($gameTemp._myTempItem.y)
Control Variables:#0005 현재 맵 ID = parseInt($gameTemp._myTempItem.baseMapId)
Comment:새로 추가한 5번 변수와 비교
If:Script:$gameVariables.value(5) === $gameMap.mapId()
Transfer Player:{이동할 맵 ID} ({이동할 맵 X},{이동할 맵 Y})
Break Loop

Else
Control Variables:#0001 인덱스 += 1

End

Else
Break Loop

End

Repeat Above

End


※ 주의 : 변수의 조작에서 이 글의 변수 ID 값과는 다른 변수 ID 값을 설정하신 경우, 


스크립트 실행 구문에 있는 변수의 ID 값도 바꿔줘야 합니다. 


그렇지 않으면 반복문을 탈출할 수 없게 되면서 게임이 멈추게 됩니다.