117 lines
4.7 KiB
JavaScript
117 lines
4.7 KiB
JavaScript
// Copyright (c) 2015-2016 Triacontane
|
||
// http://opensource.org/licenses/mit-license.php
|
||
// [Blog] : http://triacontane.blogspot.jp/
|
||
// [Twitter]: https://twitter.com/triacontane/
|
||
// [GitHub] : https://github.com/triacontane/
|
||
/*:
|
||
* @plugindesc
|
||
* @author triacontane
|
||
*
|
||
* @help
|
||
*/
|
||
/*:ja
|
||
* @plugindesc
|
||
* @author トリアコンタン
|
||
*
|
||
* @help
|
||
*/
|
||
(function() {
|
||
'use strict';
|
||
var metaTagPrefix = 'DS_';
|
||
var getCommandName = function(command) {
|
||
return (command || '').toUpperCase();
|
||
};
|
||
var getArgNumber = function(arg, min, max) {
|
||
if (arguments.length < 2) min = -Infinity;
|
||
if (arguments.length < 3) max = Infinity;
|
||
return (parseInt(convertEscapeCharacters(arg), 10) || 0).clamp(min, max);
|
||
};
|
||
var convertEscapeCharacters = function(text) {
|
||
if (text == null) text = '';
|
||
var windowLayer = SceneManager._scene._windowLayer;
|
||
return windowLayer ? windowLayer.children[0].convertEscapeCharacters(text) : text;
|
||
};
|
||
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
|
||
Game_Interpreter.prototype.pluginCommand = function(command, args) {
|
||
_Game_Interpreter_pluginCommand.apply(this, arguments);
|
||
var commandPrefix = new RegExp('^' + metaTagPrefix);
|
||
if (!command.match(commandPrefix)) return;
|
||
try {
|
||
this.pluginCommandDirectivityShake(command.replace(commandPrefix, ''), args);
|
||
} catch (e) {
|
||
if ($gameTemp.isPlaytest() && Utils.isNwjs()) {
|
||
var window = require('nw.gui').Window.get();
|
||
if (!window.isDevToolsOpen()) {
|
||
var devTool = window.showDevTools();
|
||
devTool.moveTo(0, 0);
|
||
devTool.resizeTo(window.screenX + window.outerWidth, window.screenY + window.outerHeight);
|
||
window.focus();
|
||
}
|
||
}
|
||
console.log('プラグインコマンドの実行中にエラーが発生しました。');
|
||
console.log('- コマンド名 : ' + command);
|
||
console.log('- コマンド引数 : ' + args);
|
||
console.log('- エラー原因 : ' + e.stack || e.toString());
|
||
}
|
||
};
|
||
Game_Interpreter.prototype.pluginCommandDirectivityShake = function(command, args) {
|
||
switch (getCommandName(command)) {
|
||
case '方向設定' :
|
||
case 'SET_ROTATION' :
|
||
$gameScreen.setShakeRotation(getArgNumber(args[0]));
|
||
break;
|
||
case 'SIN振動' :
|
||
case 'SIN_WAVE' :
|
||
$gameScreen.setShakeSinWave();
|
||
break;
|
||
}
|
||
};
|
||
Game_Screen.prototype.getShakeRotation = function() {
|
||
return this._shakeRotation;
|
||
};
|
||
Game_Screen.prototype.setShakeRotation = function(value) {
|
||
this._shakeRotation = value * Math.PI / 180;
|
||
};
|
||
Game_Screen.prototype.setShakeSinWave = function() {
|
||
this._shakeSinWave = true;
|
||
};
|
||
var _Game_Screen_clearShake = Game_Screen.prototype.clearShake;
|
||
Game_Screen.prototype.clearShake = function() {
|
||
_Game_Screen_clearShake.apply(this, arguments);
|
||
this.clearDirectivityShake();
|
||
};
|
||
Game_Screen.prototype.clearDirectivityShake = function() {
|
||
this._shakeRotation = 0;
|
||
this._shakeSinWave = false;
|
||
};
|
||
var _Game_Screen_updateShake = Game_Screen.prototype.updateShake;
|
||
Game_Screen.prototype.updateShake = function() {
|
||
var wasShake = this.isNeedShakeUpdate();
|
||
if (this._shakeSinWave && wasShake) {
|
||
this.updateSinShake();
|
||
} else {
|
||
_Game_Screen_updateShake.apply(this, arguments);
|
||
}
|
||
if (wasShake && !this.isNeedShakeUpdate()) {
|
||
this.clearDirectivityShake();
|
||
}
|
||
};
|
||
Game_Screen.prototype.updateSinShake = function() {
|
||
this._shake = Math.sin(3 * this._shakeDuration * this._shakeSpeed * Math.PI / 180) * this._shakePower * 3;
|
||
this._shakeDuration--;
|
||
};
|
||
Game_Screen.prototype.isNeedShakeUpdate = function() {
|
||
return this._shakeDuration > 0 || this._shake !== 0;
|
||
};
|
||
var _Spriteset_Base_updatePosition = Spriteset_Base.prototype.updatePosition;
|
||
Spriteset_Base.prototype.updatePosition = function() {
|
||
_Spriteset_Base_updatePosition.apply(this, arguments);
|
||
var shakeRotation = $gameScreen.getShakeRotation();
|
||
if (shakeRotation) {
|
||
var shakeDistance = Math.round($gameScreen.shake());
|
||
this.x -= shakeDistance;
|
||
this.x += Math.cos(shakeRotation) * shakeDistance;
|
||
this.y += Math.sin(shakeRotation) * shakeDistance;
|
||
}
|
||
};
|
||
})();
|