/*: * @plugindesc Allows developers to preform various camera motions including focusing and zooming. * @author SumRndmDde * * @param Default Zoom * @desc The default zoom used by your RPG Maker game. * @default 1 * * @param Zoom Pictures? * @desc If 'true', then Pictures created with the "Show Pictures" event will zoom with the camera. * @default true * * @param Margin Formula * @desc The formula used to determine the rendering margin when zooming out. * @default (Graphics.width / scale) - Graphics.width * * @param Fix Black Lines * @desc Yanfly's Core Engine may cause black lines to appear when zooming. Set this to 'true' to fix. * @default false * * @help * * Camera Core * Version 1.05 * SumRndmDde * * * This plugin allows developers to preform various camera motions including * focusing and zooming. * * * ============================================================================== * Camera Focusing * ============================================================================== * * If you wish for the camera to focus on something, use the following * Plugin Commands: * * * FocusCamera [x] [y] [duration] * * Insert an X and Y coordinate on the map to have the camera focus on it. * The duration determines how many frames it takes the camera to transition. * * * FocusCamera event [id] [duration] * * Replace "id" with an Event's ID on the current map to have the camera focus * on that specific event. The duration determines how many frames it takes the * camera to transition. * * * FocusCamera follower [id] [duration] * * Replace "id" with a Follower's index in the current party to have the camera * focus on that specific follower. The duration determines how many frames it * takes the camera to transition. * * * FocusCamera player [duration] * * Focues the camera onto the player. * The duration determines how many frames it takes the camera to transition. * * * ResetFocus [duration] * * Resets the focus on the camera back to the player. * The duration determines how many frames it takes the camera to transition. * * * ============================================================================== * Zooming * ============================================================================== * * In order to zoom the camera in and out, use the following commands: * * * ZoomIn [scale] [duration] * * Set "scale" to the scale you wish the camera to zoom in. * Setting scale to 1 would be the normal scale, greater than 1 would zoom in. * The duration determines how many frames it takes the camera to transition. * * * ZoomOut [scale] [duration] * * Set "scale" to the scale you wish the camera to zoom in. * Setting scale to 1 would be the normal scale, greater than 1 would zoom out. * The duration determines how many frames it takes the camera to transition. * * * ResetZoom [duration] * * Resets the zoom back to its default. * The duration determines how many frames it takes the camera to transition. * * * ============================================================================== * Camera Shifting * ============================================================================== * * If you wish to shift the camera, use the following Plugin Command: * * ShiftCamera [x-shift] [y-shift] [duration] * * This shifts the camera a certain x and/or y blocks. * This does NOT change the camera's focus. If the camera's focused on the * player, for example, and the camera is shifted upward 2 squares, the camera * will continue to follow the player, only it will be shifted up two squares. * * * ============================================================================== * Camera Waiting * ============================================================================== * * If you wish to have an event "wait" before a camera is done moving, use the * following Plugin Commands: * * * WaitForCamera * * This will stop the event processing until the camera has completed its focus * and zooming. * * * WaitForCameraFocus * * This will wait for the camera to complete its movement to a new focus. * * * WaitForCameraZoom * * This will wait for the camera to finish its zoom motion. * * * ============================================================================== * Examples * ============================================================================== * * Here are some examples of the Plugin Commands: * * * ============================================================================== * * FocusCamera 5 7 60 * * FocusCamera event 2 60 * * FocusCamera follower 1 60 * * FocusCamera player 60 * * ResetFocus 60 * * * ============================================================================== * * ZoomIn 1.2 60 * * ZoomOut 1.2 60 * * ResetZoom 60 * * * ============================================================================== * End of Help File * ============================================================================== * * Welcome to the bottom of the Help file. * * * Thanks for reading! * If you have questions, or if you enjoyed this Plugin, please check * out my YouTube channel! * * https://www.youtube.com/c/SumRndmDde * * * Until next time, * ~ SumRndmDde * */ /*:ja * @plugindesc フォーカスやズーム等の様々なカメラの動きを事前設定できます。 * @author SumRndmDde * * @param Default Zoom * @text デフォルトのズーム * @desc デフォルトのズーム * @default 1 * * @param Zoom Pictures? * @text ピクチャをズーム * @type boolean * @on 有効 * @off 無効 * @desc "ピクチャの表示"で作成されたピクチャをカメラでズーム * 有効:true / 無効:false * @default true * * @param Margin Formula * @text マージン式 * @desc ズームアウト時のレンダリングマージンを決定する式 * @default (Graphics.width / scale) - Graphics.width * * @param Fix Black Lines * @text 黒線の修正 * @type boolean * @on 有効 * @off 無効 * @desc YEP_CoreEngine使用時、黒線が表示される不具合を修正 * 有効:true / 無効:false * @default false * * @help * 翻訳:ムノクラ * https://fungamemake.com/ * https://twitter.com/munokura/ * * 元プラグイン: http://sumrndm.site/camera-core/ * * * Camera Core * Version 1.05 * SumRndmDde * * * フォーカスやズーム等の様々なカメラの動きを事前設定できます。 * * ========================================================================== * カメラのフォーカス * ========================================================================== * * カメラを何かにフォーカスさせたい場合、 * 以下のプラグインコマンドを使用します。 * * FocusCamera [x] [y] [duration] * * マップ上にXとYの座標を挿入して、 * カメラがその座標にフォーカスします。 * durationは、カメラが遷移するのにかかるフレーム数を決定します。 * * * FocusCamera event [id] [duration] * * idを現在のマップ上のイベントのIDに置き換えて、 * カメラを特定のイベントにフォーカスします。 * durationは、カメラが遷移するのにかかるフレーム数を決定します。 * * * FocusCamera follower [id] [duration] * * idを現在のパーティ内のフォロワーのインデックスに置き換えて、 * カメラが特定のフォロワーにフォーカスします。 * durationは、カメラが遷移するのにかかるフレーム数を決定します。 * * * FocusCamera player [duration] * * カメラをプレイヤーにフォーカスします。 * durationは、カメラが遷移するのにかかるフレーム数を決定します。 * * * ResetFocus [duration] * * カメラのフォーカスをプレーヤーに戻します。 * durationは、カメラが遷移するのにかかるフレーム数を決定します。 * * * ========================================================================== * ズーム * ========================================================================== * * カメラを拡大・縮小するには、以下のコマンドを使用します。 * * * ZoomIn [scale] [duration] * * scaleは、カメラをズームさせたい拡縮率を設定します。 * scaleを1に設定すると通常の拡縮率になり、 * 1より大きくすると拡大します。 * durationは、カメラが遷移するのにかかるフレーム数を決定します。 * * * ZoomOut [scale] [duration] * * scaleは、カメラをズームさせたい拡縮率を設定します。 * scaleを1に設定すると通常の拡縮率になり、 * 1より大きくすると縮小します。 * durationは、カメラが遷移するのにかかるフレーム数を決定します。 * * * ResetZoom [duration] * * ズームをデフォルトに戻します。 * durationは、カメラが遷移するのにかかるフレーム数を決定します。 * * * ========================================================================== * カメラの移動 * ========================================================================== * * カメラをずらしたい場合、以下のプラグインコマンドを使用します。 * * ShiftCamera [x-shift] [y-shift] [duration] * * カメラを指定のx/yブロック移動します。カメラのフォーカスは変わりません。 * 例えば、カメラがプレイヤーにフォーカスを合わせていて、 * カメラを2マス上に移動させた場合、カメラはプレイヤーを追い続けますが、 * 2マス上に移動します。 * * * ========================================================================== * カメラ待機 * ========================================================================== * * カメラの移動が終わる前にイベントを'待機'させたい場合、 * 以下のプラグインコマンドを使用します。 * * WaitForCamera * * カメラのフォーカスとズームが完了するまでイベント処理を停止します。 * * * WaitForCameraFocus * * カメラが新しいフォーカスに移動を完了するのを待ちます。 * * * WaitForCameraZoom * * カメラのズーム動作が終了するのを待ちます。 * * * ========================================================================== * 例 * ========================================================================== * * プラグインコマンドの例を紹介します。 * * * ========================================================================== * * FocusCamera 5 7 60 * * FocusCamera event 2 60 * * FocusCamera follower 1 60 * * FocusCamera player 60 * * ResetFocus 60 * * * ========================================================================== * * ZoomIn 1.2 60 * * ZoomOut 1.2 60 * * ResetZoom 60 * * * ========================================================================== * ヘルプファイルの終わり * ========================================================================== * * ヘルプファイルの終わりへようこそ。 * * 読んでくれてありがとう! * 質問があったり、このプラグインを楽しめたら、 * 私のYouTubeチャンネルを登録してください!! * * https://www.youtube.com/c/SumRndmDde * * * 次の機会まで * ~ SumRndmDde * */ var SRD = SRD || {}; SRD.CameraCore = SRD.CameraCore || {}; var Imported = Imported || {}; Imported["SumRndmDde Camera Core"] = 1.05; (function (_) { "use strict"; //----------------------------------------------------------------------------- // SRD.CameraCore //----------------------------------------------------------------------------- const params = PluginManager.parameters('SRD_CameraCore'); _.zoom = parseFloat(params['Default Zoom']); _.pics = String(params['Zoom Pictures?']).trim().toLowerCase() === 'true'; _.margin = String(params['Margin Formula']); _.fixYan1 = String(params['Fix Black Lines']).trim().toLowerCase() === 'true'; //----------------------------------------------------------------------------- // Game_Screen //----------------------------------------------------------------------------- const _Game_Screen_clear = Game_Screen.prototype.clear; Game_Screen.prototype.clear = function () { _Game_Screen_clear.apply(this, arguments); this._playerRegionId = 0; this._playerZoomInfo = null; this._completeZoomIn = 0; this._zoomXTarget = this._zoomX; this._zoomYTarget = this._zoomY; this._zoomXSpeed = 0; this._zoomYSpeed = 0; this.focusEvent = 0; }; const _Game_Screen_updateZoom = Game_Screen.prototype.updateZoom; Game_Screen.prototype.updateZoom = function () { _Game_Screen_updateZoom.apply(this, arguments); this.updateTilemapMargin(); }; //NO ONE ELSE BETTER OVERWRITE THIS!!!! >:D Game_Screen.prototype.clearZoom = function () { //Overwrite this._zoomX = Graphics.boxWidth / 2; this._zoomY = Graphics.boxHeight / 2; this._zoomScale = _.zoom; this._zoomScaleTarget = _.zoom; this._zoomDuration = 0; //Overwrite this.refreshZoomInfo(); this.refreshTilemapMargin(this._zoomScale); if (SceneManager.isNextScene(Scene_Battle)) { this.ultraClearZoom(); } }; Game_Screen.prototype.refreshZoomInfo = function () { if (this._playerZoomInfo) { this._zoomX = this._playerZoomInfo.x; this._zoomY = this._playerZoomInfo.y; this._zoomScale = this._playerZoomInfo.scale; this._zoomScaleTarget = this._playerZoomInfo.scale; this._zoomDuration = this._playerZoomInfo.duration; } }; Game_Screen.prototype.ultraClearZoom = function () { this._zoomX = 0; this._zoomY = 0; this._zoomScale = 1; this._zoomScaleTarget = 1; this._zoomDuration = 0; }; const _Game_Screen_onBattleStart = Game_Screen.prototype.onBattleStart; Game_Screen.prototype.onBattleStart = function () { _Game_Screen_onBattleStart.apply(this, arguments); this.ultraClearZoom(); }; Game_Screen.prototype.setCameraFocus = function (scale, duration, nullify) { this.setupZoomInfo(scale, duration); this.setupZoomStuff(); if (duration === 0) { this._zoomScale = this._zoomScaleTarget; this._zoomDuration = 0; } if (nullify) this._playerZoomInfo = null; this.setupTilemapMargin(); }; Game_Screen.prototype.setupZoomInfo = function (scale, duration) { this._playerZoomInfo = {}; this._playerZoomInfo.x = Graphics.boxWidth / 2; this._playerZoomInfo.y = Graphics.boxHeight / 2; this._playerZoomInfo.scale = eval(scale) * _.zoom; this._playerZoomInfo.duration = eval(duration); }; Game_Screen.prototype.setupZoomStuff = function () { this._zoomX = this._playerZoomInfo.x; this._zoomY = this._playerZoomInfo.y; this._zoomScaleTarget = this._playerZoomInfo.scale; this._zoomDuration = this._playerZoomInfo.duration; }; Game_Screen.prototype.resetCameraFocus = function (duration) { this.setCameraFocus(_.zoom, duration, true); }; Game_Screen.prototype.setupTilemapMargin = function () { if (this._zoomScaleTarget < this._zoomScale) { this.refreshTilemapMargin(this._zoomScaleTarget); this._completeZoomIn = 2; } else { this._completeZoomIn = 1; } }; Game_Screen.prototype.updateTilemapMargin = function () { if (this._zoomDuration === 0 && this._completeZoomIn) { this.refreshTilemapMargin(this._zoomScale); this._completeZoomIn = 0; } else if (this._zoomDuration === 0 && this._completeZoomIn) { this.refreshTilemapMargin(this._zoomScaleTarget); this._completeZoomIn = 0; } }; Game_Screen.prototype.refreshTilemapMargin = function (scale) { if (SceneManager._scene.constructor === Scene_Map) { const margin = (this._zoomScaleTarget < 1) ? eval(_.margin) : 1; const tilemap = SceneManager._scene._spriteset._tilemap; tilemap._margin = margin; tilemap.width = Graphics.width + (margin * 2); tilemap.height = Graphics.height + (margin * 2); } }; Game_Screen.prototype.isCameraZooming = function () { return Boolean(this._zoomDuration > 0); }; //----------------------------------------------------------------------------- // Game_CharacterBase //----------------------------------------------------------------------------- Game_CharacterBase.prototype.centerX = function () { return (Graphics.width / $gameMap.tileWidth() - 1) / 2.0; }; Game_CharacterBase.prototype.centerY = function () { return (Graphics.height / $gameMap.tileHeight() - 1) / 2.0; }; Game_CharacterBase.prototype.centerCamera = function (dur) { return $gameMap.setDisplayPosStart(this.x - this.centerX(), this.y - this.centerY(), dur); }; Game_CharacterBase.prototype.centerCameraOnPos = function (x, y, dur) { return $gameMap.setDisplayPosStart(x - this.centerX(), y - this.centerY(), dur); }; //----------------------------------------------------------------------------- // Game_Character //----------------------------------------------------------------------------- Game_Character.prototype.updateScroll = Game_Player.prototype.updateScroll; //----------------------------------------------------------------------------- // Game_Player //----------------------------------------------------------------------------- Game_Player.prototype.updateScroll = function (lastScrolledX, lastScrolledY) { if ($gameScreen.focusEvent === 0) { Game_Character.prototype.updateScroll.apply(this, arguments); } }; //----------------------------------------------------------------------------- // Game_Event //----------------------------------------------------------------------------- const _Game_Event_update = Game_Event.prototype.update; Game_Event.prototype.update = function () { var lastScrolledX = this.scrolledX(); var lastScrolledY = this.scrolledY(); _Game_Event_update.apply(this, arguments); this.updateScroll(lastScrolledX, lastScrolledY); }; Game_Event.prototype.updateScroll = function (lastScrolledX, lastScrolledY) { if ($gameScreen.focusEvent === this._eventId) { Game_Character.prototype.updateScroll.apply(this, arguments); } }; //----------------------------------------------------------------------------- // Game_Event //----------------------------------------------------------------------------- const _Game_Follower_update = Game_Follower.prototype.update; Game_Follower.prototype.update = function () { var lastScrolledX = this.scrolledX(); var lastScrolledY = this.scrolledY(); _Game_Follower_update.apply(this, arguments); this.updateScroll(lastScrolledX, lastScrolledY); }; Game_Follower.prototype.updateScroll = function (lastScrolledX, lastScrolledY) { if ($gameScreen.focusEvent === this._memberIndex * (-1)) { Game_Character.prototype.updateScroll.apply(this, arguments); } }; //----------------------------------------------------------------------------- // Game_Map //----------------------------------------------------------------------------- const _Game_Map_initialize = Game_Map.prototype.initialize; Game_Map.prototype.initialize = function () { _Game_Map_initialize.apply(this, arguments); this._newDisplayX = 0; this._newDisplayY = 0; this._newParallaxX = 0; this._newParallaxY = 0; this._scrollDuration = 0; this._displayXSpeed = 0; this._displayYSpeed = 0; this._parallaxXSpeed = 0; this._parallaxYSpeed = 0; }; const _Game_Map_setup = Game_Map.prototype.setup; Game_Map.prototype.setup = function (mapId) { this._newDisplayX = 0; this._newDisplayY = 0; this._scrollDuration = 0; $gameScreen.focusEvent = 0; $gameScreen.resetCameraFocus(0); _Game_Map_setup.apply(this, arguments); }; Game_Map.prototype.setDisplayPosStart = function (x, y, dur) { if (dur === 0) { this.setDisplayPos.call(this, x, y); } else { this.setDisplayPosInfo(x, y); this.setDisplayPosSpeeds(dur); } }; Game_Map.prototype.shiftCameraPosition = function (x, y, dur) { this.setDisplayPosStart(this._displayX + x, this._displayY + y, dur); }; Game_Map.prototype.setDisplayPosInfo = function (x, y) { if (this.isLoopHorizontal()) { this._newDisplayX = x.mod(this.width()); this._newParallaxX = x; } else { var endX = this.width() - this.screenTileX(); this._newDisplayX = endX < 0 ? endX / 2 : x.clamp(0, endX); this._newParallaxX = this._newDisplayX; } if (this.isLoopVertical()) { this._newDisplayY = y.mod(this.height()); this._newParallaxY = y; } else { var endY = this.height() - this.screenTileY(); this._newDisplayY = endY < 0 ? endY / 2 : y.clamp(0, endY); this._newParallaxY = this._newDisplayY; } }; Game_Map.prototype.setDisplayPosSpeeds = function (dur) { this._scrollDuration = dur; this._displayXSpeed = (this._newDisplayX - this._displayX) / this._scrollDuration; this._displayYSpeed = (this._newDisplayY - this._displayY) / this._scrollDuration; this._parallaxXSpeed = (this._newParallaxX - this._parallaxX) / this._scrollDuration; this._parallaxYSpeed = (this._newParallaxY - this._parallaxY) / this._scrollDuration; }; const _Game_Map_updateScroll = Game_Map.prototype.updateScroll; Game_Map.prototype.updateScroll = function () { _Game_Map_updateScroll.apply(this, arguments); this.updateCameraScroll(); }; Game_Map.prototype.updateCameraScroll = function () { if (this._scrollDuration > 0) { this._scrollDuration--; this._displayX += this._displayXSpeed; this._displayY += this._displayYSpeed; this._parallaxX += this._parallaxXSpeed; this._parallaxY += this._parallaxYSpeed; } }; Game_Map.prototype.isCameraScrolling = function () { return Boolean(this._scrollDuration > 0); }; //----------------------------------------------------------------------------- // Game_Interpreter //----------------------------------------------------------------------------- const _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand; Game_Interpreter.prototype.pluginCommand = function (command, args) { _Game_Interpreter_pluginCommand.apply(this, arguments); const com = command.trim().toLowerCase(); const checkDur = function (i) { return (args[i]) ? eval(args[i]) : 0; }; if (com === 'zoomin') { $gameScreen.setCameraFocus(String(args[0]), checkDur(1)); } else if (com === 'zoomout') { $gameScreen.setCameraFocus("1/(" + String(args[0]) + ")", checkDur(1)); } else if (com === 'focuscamera') { const com2 = String(args[0]).trim().toLowerCase(); if (com2 === 'event') { const eventId = eval(args[1]); if ($gameMap.event(eventId)) { $gameScreen.focusEvent = eventId; $gameMap.event(eventId).centerCamera(checkDur(2)); } } else if (com2 === 'follower') { const followerId = eval(args[1]); if ($gamePlayer.followers().follower(followerId - 1)) { $gameScreen.focusEvent = (followerId * (-1)); $gamePlayer.followers().follower(followerId - 1).centerCamera(checkDur(2)); } } else if (com2 === 'player') { $gameScreen.focusEvent = 0; $gamePlayer.centerCamera(checkDur(1)); } else { $gameScreen.focusEvent = null; $gamePlayer.centerCameraOnPos(eval(args[0]), eval(args[1]), checkDur(2)); } } else if (com === 'resetfocus') { $gameScreen.focusEvent = 0; $gamePlayer.centerCamera(checkDur(0)); } else if (com === 'resetzoom') { $gameScreen.resetCameraFocus(checkDur(0)); } else if (com === 'setdefaultzoom') { _.zoom = eval(args[0]); } else if (com === 'shiftcamera') { $gameMap.shiftCameraPosition(eval(args[0]), eval(args[1]), checkDur(2)); } else if (com === 'waitforcamera') { this.setWaitMode('camera') } else if (com === 'waitforcamerafocus') { this.setWaitMode('camera-focus') } else if (com === 'waitforcamerazoom') { this.setWaitMode('camera-zoom') } }; const _Game_Interpreter_updateWaitMode = Game_Interpreter.prototype.updateWaitMode; Game_Interpreter.prototype.updateWaitMode = function () { let waiting = null; if (this._waitMode === 'camera') { waiting = ($gameMap.isCameraScrolling() || $gameScreen.isCameraZooming()); } else if (this._waitMode === 'camera-focus') { waiting = $gameMap.isCameraScrolling(); } else if (this._waitMode === 'camera-zoom') { waiting = $gameScreen.isCameraZooming(); } if (waiting) { return true; } else if (waiting === false) { this._waitMode = ''; return false; } return _Game_Interpreter_updateWaitMode.apply(this, arguments); }; //----------------------------------------------------------------------------- // Scene_Map //----------------------------------------------------------------------------- const _Scene_Map_start = Scene_Map.prototype.start; Scene_Map.prototype.start = function () { _Scene_Map_start.apply(this, arguments); $gameScreen.clearZoom(); }; //----------------------------------------------------------------------------- // SRD.CameraCore.pics Compatibility //----------------------------------------------------------------------------- if (_.pics) { Scene_Base.prototype.createPicturesForCameraCore = Spriteset_Base.prototype.createPictures; const _Scene_Map_createSpriteset = Scene_Map.prototype.createSpriteset; Scene_Map.prototype.createSpriteset = function () { _Scene_Map_createSpriteset.apply(this, arguments); this.createPicturesForCameraCore(); }; const _Scene_Battle_createSpriteset = Scene_Battle.prototype.createSpriteset; Scene_Battle.prototype.createSpriteset = function () { _Scene_Battle_createSpriteset.apply(this, arguments); this.createPicturesForCameraCore(); }; Spriteset_Base.prototype.createPictures = function () { }; } //----------------------------------------------------------------------------- // Yanfly Engine Core Compatibility //----------------------------------------------------------------------------- if (Imported.YEP_CoreEngine && _.fixYan1) { Sprite.prototype.updateTransform = function () { PIXI.Sprite.prototype.updateTransform.call(this); this.worldTransform.tx += this._offset.x; this.worldTransform.ty += this._offset.y; }; } })(SRD.CameraCore);