264 lines
No EOL
9.5 KiB
JavaScript
264 lines
No EOL
9.5 KiB
JavaScript
//-----------------------------------------------------------------------------
|
|
// Galv's Cam Control
|
|
//-----------------------------------------------------------------------------
|
|
// For: RPGMAKER MV
|
|
// GALV_CamControl.js
|
|
// With some fixes by Anisoft
|
|
//-----------------------------------------------------------------------------
|
|
// 2016-05-02 - Version 2.0 - compatibilty with zooming and offset fixes
|
|
// - by Anisoft
|
|
// 2016-04-18 - Version 1.9 - fixed a bug with saving while cam disabled
|
|
// 2016-03-16 - Version 1.8 - transferring player to same map no longer moves
|
|
// - the camera if it has a different target.
|
|
// 2015-12-30 - Version 1.7 - another fix for shuttering issue
|
|
// 2015-12-17 - Version 1.6 - put in code to fix potential shuttering issue
|
|
// 2015-12-17 - Version 1.5 - fixed an issue that enabled the disabled cam
|
|
// 2015-12-01 - Version 1.4 - minor code changes
|
|
// 2015-12-01 - Version 1.3 - missed part of the last bug. Fixed now.
|
|
// 2015-11-30 - Version 1.2 - fixed bug with loading game and target breaking
|
|
// 2015-11-27 - Version 1.1 - added tile size option
|
|
// 2015-11-27 - Version 1.0 - release
|
|
//-----------------------------------------------------------------------------
|
|
// Terms can be found at:
|
|
// galvs-scripts.com
|
|
//-----------------------------------------------------------------------------
|
|
|
|
var Imported = Imported || {};
|
|
Imported.Galv_CamControl = true;
|
|
|
|
var Galv = Galv || {}; // Galv's main object
|
|
Galv.pCmd = Galv.pCmd || {}; // Plugin Command manager
|
|
Galv.CC = Galv.CC || {}; // Galv's stuff
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/*:
|
|
* @plugindesc Allows greater control over where the game camera is focused. View HELP for plugin commands.
|
|
*
|
|
* @author Galv - galvs-scripts.com
|
|
*
|
|
* @param Tile Size
|
|
* @desc Default 48. Only change if you change tile size in your game
|
|
* @default 48
|
|
*
|
|
* @help
|
|
* Galv's Cam Control
|
|
* ----------------------------------------------------------------------------
|
|
* This plugin creates a sliding movement for the camera as well as allows you
|
|
* to set the target position of it to wherever required. (Player, event, xy)
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
* PLUGIN COMMANDS
|
|
* ----------------------------------------------------------------------------
|
|
* CAM PLAYER SPD // Set camera focus to player.
|
|
* // CAM - the plugin command word
|
|
* // PLAYER - command word to choose player
|
|
* // SPD - speed camera scrolls to target
|
|
* // v# to use a variable
|
|
* // default scroll speed is 800
|
|
* // leave speed blank for default
|
|
*
|
|
* CAM EVENT ID SPD // Set camera focus to an event.
|
|
* // CAM - the plugin command word
|
|
* // EVENT - command word to choose event
|
|
* // ID - the event's id
|
|
* // v# to use a variable
|
|
* // SPD - speed camera scrolls to target
|
|
* // v# to use a variable
|
|
* // default scroll speed is 800
|
|
* // leave speed blank for default
|
|
*
|
|
* CAM X Y SPD // Set camera focus to an x,y position.
|
|
* // CAM - the plugin command word
|
|
* // X - the position on the map
|
|
* // Y - the position on the map
|
|
* // v# to use variables
|
|
* // SPD - speed camera scrolls to target
|
|
* // v# to use a variable
|
|
* // default scroll speed is 800
|
|
* // leave speed blank for default
|
|
*
|
|
* CAM DISABLE // Sets the focus on player and disables the
|
|
* // sliding motion. (RPGMaker default);
|
|
* // Using any command above will enable again
|
|
*
|
|
* NOTE: The higher the SPD value for these commands, the slower the movement.
|
|
* Not recommended to use speeds that are too fast.
|
|
*
|
|
* EXAMPLES
|
|
* CAM PLAYER // Camera focuses on player at speed 800
|
|
* CAM PLAYER 1600 // Camera focuses on player at speed 1600 (slower)
|
|
* CAM EVENT 3 // Camera focuses on event 3 at speed 800
|
|
* CAM EVENT 12 400 // Camera focuses on event 12 at speed 400 (faster)
|
|
* CAM 23 18 // Camera focuses on x23, y18 position on the map
|
|
*/
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CODE STUFFS
|
|
//-----------------------------------------------------------------------------
|
|
|
|
(function() {
|
|
|
|
Galv.CC.size = Number(PluginManager.parameters('Galv_CamControl')["Tile Size"]);
|
|
|
|
// OVERWRITE - BECAUSE OF JITTER
|
|
Game_Map.prototype.displayX = function() {return Math.round(this._displayX * Galv.CC.size) / Galv.CC.size};
|
|
Game_Map.prototype.displayY = function() {return Math.round(this._displayY * Galv.CC.size) / Galv.CC.size};
|
|
|
|
|
|
// GALV'S PLUGIN MANAGEMENT. INCLUDED IN ALL GALV PLUGINS THAT HAVE PLUGIN COMMAND CALLS, BUT ONLY RUN ONCE.
|
|
if (!Galv.aliased) {
|
|
var Galv_Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
|
|
Game_Interpreter.prototype.pluginCommand = function(command, args) {
|
|
if (Galv.pCmd[command]) {
|
|
Galv.pCmd[command](args);
|
|
return;
|
|
};
|
|
Galv_Game_Interpreter_pluginCommand.call(this, command, args);
|
|
};
|
|
Galv.aliased = true; // Don't keep aliasing for other Galv scripts.
|
|
};
|
|
|
|
// Direct to Plugin Object
|
|
Galv.pCmd.CAM = function(arguments) {
|
|
Galv.CC.camControl(arguments);
|
|
};
|
|
// END GALV'S PLUGIN MANAGEMENT
|
|
|
|
|
|
Galv.CC.camControl = function(args) {
|
|
|
|
var key = args[0].toLowerCase();
|
|
var speed = 100;
|
|
switch (key) {
|
|
case "player":
|
|
var target = $gamePlayer;
|
|
if (args[1]) speed = Galv.CC.getValue(args[1]);
|
|
break;
|
|
case "event":
|
|
var eId = Galv.CC.getValue(args[1]);
|
|
var target = $gameMap.event(eId);
|
|
if (args[2]) speed = Galv.CC.getValue(args[2]);
|
|
break;
|
|
case "disable":
|
|
$gameMap.camTarget = $gamePlayer;
|
|
$gameMap.camNorm = true;
|
|
$gameMap.savedCamTarget = null;
|
|
return;
|
|
default:
|
|
var px = Galv.CC.getValue(args[0]);
|
|
var py = Galv.CC.getValue(args[1]);
|
|
if (args[2]) speed = Galv.CC.getValue(args[2]);
|
|
var target = {
|
|
x: px,
|
|
y: py,
|
|
_realX: px,
|
|
_realY: py,
|
|
screenX: Game_CharacterBase.prototype.screenX,
|
|
screenY: function() {
|
|
var th = $gameMap.tileHeight();
|
|
return Math.round(this.scrolledY() * th + th);
|
|
},
|
|
scrolledX: Game_CharacterBase.prototype.scrolledX,
|
|
scrolledY: Game_CharacterBase.prototype.scrolledY
|
|
};
|
|
};
|
|
$gameMap.camTargetSet(target,speed);
|
|
$gameMap.savedCamTarget = args;
|
|
};
|
|
|
|
Galv.CC.getValue = function(string) {
|
|
if (string[0].toLowerCase() === "v") {
|
|
// Use variable
|
|
var varId = Number(string.replace("v",""));
|
|
return $gameVariables.value(varId);
|
|
} else {
|
|
return Number(string);
|
|
};
|
|
};
|
|
|
|
|
|
// GAME PLAYER
|
|
|
|
Galv.CC.Game_Player_updateScroll = Game_Player.prototype.updateScroll;
|
|
Game_Player.prototype.updateScroll = function(lastScrolledX, lastScrolledY) {
|
|
if ($gameMap.camNorm) return Galv.CC.Game_Player_updateScroll.call(this,lastScrolledX, lastScrolledY);
|
|
};
|
|
|
|
|
|
// GAME MAP
|
|
|
|
Galv.CC.Scene_Map_onMapLoaded = Scene_Map.prototype.onMapLoaded;
|
|
Scene_Map.prototype.onMapLoaded = function() {
|
|
Galv.CC.Scene_Map_onMapLoaded.call(this);
|
|
if (!$gameMap.camNorm) {
|
|
$gameMap.savedCamTarget = $gameMap.savedCamTarget || ["PLAYER"];
|
|
Galv.CC.camControl($gameMap.savedCamTarget);
|
|
};
|
|
};
|
|
|
|
Galv.CC.Game_Map_setup = Game_Map.prototype.setup;
|
|
Game_Map.prototype.setup = function(mapId) {
|
|
this.zoom = this.zoom || new PIXI.Point(1,1);
|
|
if (!this.camNorm) {
|
|
this.camTargetSet($gamePlayer,800);
|
|
this.savedCamTarget = ["PLAYER"];
|
|
};
|
|
Galv.CC.Game_Map_setup.call(this,mapId);
|
|
};
|
|
|
|
Game_Map.prototype.camTargetSet = function(target,speed) {
|
|
this.camTarget = target;
|
|
this.camNorm = false;
|
|
this.camSpeed = speed || 800;
|
|
};
|
|
|
|
Galv.CC.Game_Map_updateScroll = Game_Map.prototype.updateScroll;
|
|
Game_Map.prototype.updateScroll = function() {
|
|
if (this.camNorm) return Galv.CC.Game_Map_updateScroll.call(this);
|
|
|
|
this._scrollRest = 0;
|
|
|
|
var cw = (Graphics.boxWidth / 2);
|
|
var ch = (Graphics.boxHeight / 2);
|
|
|
|
var screenX = this.camTarget.screenX()*this.zoom.x;
|
|
var screenY = this.camTarget.screenY()*this.zoom.y;
|
|
|
|
var sx = Math.abs(screenX - cw) / this.camSpeed;
|
|
var sy = Math.abs(screenY - ch) / this.camSpeed;
|
|
if (sx < 0.005) (sx = 0);
|
|
if (sy < 0.005) (sy = 0);
|
|
|
|
var x_pos = screenX;
|
|
var y_pos = screenY;
|
|
|
|
if (y_pos < ch) {
|
|
this.scrollUp(sy);
|
|
} else if (y_pos > ch) {
|
|
this.scrollDown(sy);
|
|
};
|
|
|
|
if (x_pos < cw) {
|
|
this.scrollLeft(sx);
|
|
} else if (x_pos > cw) {
|
|
this.scrollRight(sx);
|
|
};
|
|
};
|
|
|
|
Galv.CC.Game_Player_center = Game_Player.prototype.center;
|
|
Game_Player.prototype.center = function(x, y) {
|
|
if ($gameMap.camTarget == $gamePlayer || $gameMap.camNorm) {
|
|
return Galv.CC.Game_Player_center.call(this,x,y);
|
|
};
|
|
};
|
|
|
|
Game_Player.prototype.centerX = function() {
|
|
return ((Graphics.width / $gameMap.tileWidth() - (1*$gameMap.zoom.x)) / 2.0)/$gameMap.zoom.x;
|
|
};
|
|
|
|
Game_Player.prototype.centerY = function() {
|
|
return ((Graphics.height / $gameMap.tileHeight() - 1.75*$gameMap.zoom.y) / 2.0)/$gameMap.zoom.y;
|
|
};
|
|
})(); |