본문 바로가기
Tips

RPG Maker MV에서 NPC들이 서로 충돌했을 때 캐릭터를 아래로 밀어보자 - RPG Maker MV

by biud436 2018. 11. 7.



병렬 처리 이벤트를 만들고 스크립트로 로직을 만듭니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 이 이벤트 (이 메서드는 이벤트 편집 에디터에서만 사용할 수 있습니다)
var __this = this.character(0); 
 
// 맵 좌표
// .x는 이동을 멈추었을 떄의 최종 좌표로 정수입니다.
// ._realX는 실제 맵의 좌표로 소수점까지 표시됩니다.
// .screenX는 스프라이트가 표시되는 화면 좌표입니다.
var x = __this.x; 
var y = __this.y;
 
// 방향을 변수에 저장합니다 (2, 4, 6, 8 중 하나가 저장됩니다)
var d = __this.direction(); 
 
// 현재 보고 있는 방향에서 한 칸 앞의 좌표를 얻는 함수입니다. (매우 유용함)
var x2 = $gameMap.roundXWithDirection(x, d); 
var y2 = $gameMap.roundYWithDirection(y, d); 
 
// 타겟 좌표에 이벤트가 있는 지 확인하고 ID 값을 반환 받습니다.
var id = $gameMap.eventIdXy(x2, y2);
 
// 0보다 크면 어떤 이벤트가 있다는 뜻입니다.
// 대부분 이벤트가 0보다 크므로 모든 이벤트를 밀어 버리게 됩니다.
// 노트 태그를 정규표현식으로 확인하는 방법이 세련됐지만, 
// 이런 병렬 이벤트에선 쓰기 적절하지 않습니다.
if(id > 0) {
  var target = $gameMap.event(id); 
  // 방향 고정 여부를 가져옵니다.
  var prevDirFix = target.isDirectionFixed();
  // 방향 고정으로 설정합니다.
  target.setDirectionFix(true);
  // 이동 중이지 않다면, 밀려야 하는 방향으로 전진합니다.
  if(!target.isMoving()) target.moveStraight(d); 
  // 이전 상태로 복구합니다.
  target.setDirectionFix(prevDirFix);
  // 사실 이건 필요 없는 구문입니다.
  target._waitCount = target.animationWait();
}
cs


스크립트 커맨드는 행 수에 제한이 있기 때문에 최대한 붙여서 작성합니다. (줄바꿈과 주석도 제거)


1
2
3
4
5
6
7
8
var __this = this.character(0); var x = __this.x; var y = __this.y;
var d = __this.direction(); var x2 = $gameMap.roundXWithDirection(x, d); var y2 = $gameMap.roundYWithDirection(y, d); var id = $gameMap.eventIdXy(x2, y2);
if(id > 0) {
  var target = $gameMap.event(id); var prevDirFix = target.isDirectionFixed();
  target.setDirectionFix(true);
  if(!target.isMoving()) target.moveStraight(d); target.setDirectionFix(prevDirFix);
  target._waitCount = target.animationWait();
}
cs


이동 주기와 맞아야 제대로 동작하기 때문에, 스크립트 커맨드 전에 이동 경로의 설정을 추가했습니다.