병렬 처리 이벤트를 만들고 스크립트로 로직을 만듭니다.
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 |
이동 주기와 맞아야 제대로 동작하기 때문에, 스크립트 커맨드 전에 이동 경로의 설정을 추가했습니다.