/*: * @target MZ * @plugindesc 8方向移動プラグイン(斜め移動用画像対応、自律移動対応) * * @help * このプラグインは、プレイヤーキャラクターおよびイベントに * 8方向移動(斜め移動)を追加します。 * 斜め移動用の画像は、通常のスプライトシートの * 下半分を使用することで実装されます。 * * 使い方: * キャラクターのスプライトシートには、通常の4方向用に8体、 * 斜め用に8体のドットが縦2キャラクター分配置されている必要があります。 * 例えば、上段に通常の上、右、下、左の4方向、 * 下段に左上、右上、左下、右下の4方向の画像を配置します。 */ (() => { // 斜め方向の定義 const DIAGONAL_DIRECTIONS = { UP_LEFT: 7, UP_RIGHT: 9, DOWN_LEFT: 1, DOWN_RIGHT: 3 }; // プレイヤーとイベントの向きを変化ごとに更新 Game_Character.prototype.updateDirectionOnChange = function() { const direction = this.getInputDirection ? this.getInputDirection() : this.findDirectionTo($gamePlayer.x, $gamePlayer.y); if (direction && direction !== this._lastDirection) { this.setDirection(direction); this._lastDirection = direction; } }; // プレイヤーの更新処理をオーバーライド const _Game_Player_update = Game_Player.prototype.update; Game_Player.prototype.update = function(sceneActive) { _Game_Player_update.call(this, sceneActive); this.updateDirectionOnChange(); }; // イベントの更新処理をオーバーライド const _Game_Event_update = Game_Event.prototype.update; Game_Event.prototype.update = function() { _Game_Event_update.call(this); this.updateDirectionOnChange(); }; // キャラクターのスプライト表示を調整 Sprite_Character.prototype.characterPatternY = function() { const character = this._character; const direction = character.direction(); // 斜め方向の場合はスプライトシートの下半分を使用 switch (direction) { case DIAGONAL_DIRECTIONS.UP_LEFT: return 7; // 左上 case DIAGONAL_DIRECTIONS.UP_RIGHT: return 6; // 右上 case DIAGONAL_DIRECTIONS.DOWN_LEFT: return 4; // 左下 case DIAGONAL_DIRECTIONS.DOWN_RIGHT: return 5; // 右下 default: return (direction / 2) - 1; // 通常の上下左右 } }; // キー入力で8方向の判定を追加 Game_Player.prototype.getInputDirection = function() { const diagonalDirection = this.getDiagonalInput(); return diagonalDirection || Input.dir4; }; // 斜め入力の判定 Game_Player.prototype.getDiagonalInput = function() { const up = Input.isPressed('up'); const down = Input.isPressed('down'); const left = Input.isPressed('left'); const right = Input.isPressed('right'); if (up && left) return DIAGONAL_DIRECTIONS.UP_LEFT; if (up && right) return DIAGONAL_DIRECTIONS.UP_RIGHT; if (down && left) return DIAGONAL_DIRECTIONS.DOWN_LEFT; if (down && right) return DIAGONAL_DIRECTIONS.DOWN_RIGHT; return 0; }; // 8方向移動時のキャラクターの移動処理を追加 const _Game_Character_moveStraight = Game_Character.prototype.moveStraight; Game_Character.prototype.moveStraight = function(d) { if ([DIAGONAL_DIRECTIONS.UP_LEFT, DIAGONAL_DIRECTIONS.UP_RIGHT, DIAGONAL_DIRECTIONS.DOWN_LEFT, DIAGONAL_DIRECTIONS.DOWN_RIGHT].includes(d)) { const xDir = (d === DIAGONAL_DIRECTIONS.UP_LEFT || d === DIAGONAL_DIRECTIONS.DOWN_LEFT) ? 4 : 6; const yDir = (d === DIAGONAL_DIRECTIONS.UP_LEFT || d === DIAGONAL_DIRECTIONS.UP_RIGHT) ? 8 : 2; this.moveDiagonally(xDir, yDir); } else { _Game_Character_moveStraight.call(this, d); } }; // イベントの自律移動にも斜め方向を対応させる const _Game_Character_processMoveCommand = Game_Character.prototype.processMoveCommand; Game_Character.prototype.processMoveCommand = function(command) { if (command.code === Game_Character.ROUTE_MOVE_RANDOM) { this.moveRandom8(); } else if (command.code === Game_Character.ROUTE_MOVE_TOWARD) { this.moveTowardCharacter8($gamePlayer); } else if (command.code === Game_Character.ROUTE_TURN_TOWARD) { this.turnTowardCharacter8($gamePlayer); } else if (command.code === Game_Character.ROUTE_MOVE_FORWARD) { this.moveForward8(); } else { _Game_Character_processMoveCommand.call(this, command); } }; // 斜めを含めたランダム移動 Game_Character.prototype.moveRandom8 = function() { const directions = [2, 4, 6, 8, 1, 3, 7, 9]; const index = Math.randomInt(directions.length); this.moveStraight(directions[index]); }; // 斜めを含めたプレイヤーに近づく移動 Game_Character.prototype.moveTowardCharacter8 = function(character) { const sx = this.deltaXFrom(character.x); const sy = this.deltaYFrom(character.y); if (sx !== 0 && sy !== 0) { const xDir = sx > 0 ? 4 : 6; const yDir = sy > 0 ? 8 : 2; this.moveDiagonally(xDir, yDir); } else if (sx !== 0) { this.moveStraight(sx > 0 ? 4 : 6); } else if (sy !== 0) { this.moveStraight(sy > 0 ? 8 : 2); } }; // 斜めを含めたプレイヤーに向く処理 Game_Character.prototype.turnTowardCharacter8 = function(character) { const sx = this.deltaXFrom(character.x); const sy = this.deltaYFrom(character.y); if (sx !== 0 && sy !== 0) { const direction = (sx > 0 ? (sy > 0 ? DIAGONAL_DIRECTIONS.DOWN_LEFT : DIAGONAL_DIRECTIONS.UP_LEFT) : (sy > 0 ? DIAGONAL_DIRECTIONS.DOWN_RIGHT : DIAGONAL_DIRECTIONS.UP_RIGHT)); this.setDirection(direction); } else if (sx !== 0) { this.setDirection(sx > 0 ? 4 : 6); } else if (sy !== 0) { this.setDirection(sy > 0 ? 8 : 2); } }; // 斜め方向を含めた一歩前進処理 Game_Character.prototype.moveForward8 = function() { const direction = this.direction(); this.moveStraight(direction); }; })();