//=============================================================================
// OYS_gamePlayerOpacity.js
//=============================================================================
/*:
* @plugindesc 实现伪墙体半透明插件
* @author OYS_codePlayerD(缘系列)
* @version 1.0.3
*
* @param opacity
* @text 设置伪半透明精灵的值
* @desc 设置透明度
* @type number
* @min 0
* @max 255
* @default 100
*
* @param enableSwitch
* @text 启用开关
* @desc 控制伪墙体半透明开关
* @type Boolean
* @default true
*
* @help 遇到上方图层半透明功能说明
* 1-这个插件会创建一个与玩家队伍角色外观相同的精灵;
* 2-通过调整不同的透明度和层级,实现伪半透明墙体。
* 可以通过插件参数调整透明度。
*
* 关于更新:
* 1-没有经过兼容测试,单独使用应该没有问题
* 2-优化了伪透明精灵的耗损,减少了重复绘制
* 3-支持全队的伪透明
*/
(function () {
//添加注册F键,测试用或是动态实时调整对应功能(可自行拓展)
Input.keyMapper[70]='f';
// 添加了命名空间,减少命名冲突o(╯□╰)o
var OYS = OYS || {};
OYS.PlayerOpacity = OYS.PlayerOpacity || {};
var parameters = PluginManager.parameters('OYS_gamePlayerOpacity');
OYS.PlayerOpacity.opacity = Number(parameters['opacity'] || 125);
OYS.PlayerOpacity.enableSwitch = parameters['enableSwitch'] || true;
OYS.PlayerOpacity.setCopySpriteOffsetZ = 1; // 用于调节伪透明精灵的层级调整
Scene_Map.prototype.createCopyPlayerSprites = function () {
this._copySprites = [];
var followers = $gamePlayer.followers().visibleFollowers();
followers.unshift($gamePlayer); // 玩家和队员
// 正式使用时,可以删除
// console.log("层级增减:", OYS.PlayerOpacity.setCopySpriteOffsetZ, "影子精灵是否可见:", OYS.PlayerOpacity.enableSwitch)
followers.forEach(function (actor) {
var sprite = new Sprite_Character(actor);
sprite.opacity = OYS.PlayerOpacity.opacity;
const setProperties = {
opacity: OYS.PlayerOpacity.opacity,
z: actor.screenZ() + OYS.PlayerOpacity.setCopySpriteOffsetZ,
visible: OYS.PlayerOpacity.enableSwitch
};
// 通过拦截锁定属性,减少重绘
Object.keys(setProperties).forEach(prop => {
Object.defineProperty(sprite, prop, {
get: () => setProperties[prop],
set: () => { }
});
});
this._spriteset._tilemap.addChild(sprite);
this._copySprites.push(sprite);
}, this);
};
// 更新所有精灵的位置和状态
Scene_Map.prototype.updateCopySprites = function () {
if (!this._copySprites) return;
var followers = $gamePlayer.followers().visibleFollowers();
followers.unshift($gamePlayer);
this._copySprites.forEach(function (sprite, index) {
if (OYS.PlayerOpacity.enableSwitch && followers[index]) {
sprite.x = followers[index].screenX();
sprite.y = followers[index].screenY();
}
});
};
var _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
Scene_Map.prototype.createAllWindows = function () {
_Scene_Map_createAllWindows.call(this);
this.createCopyPlayerSprites();
};
var _Scene_Map_update = Scene_Map.prototype.update;
Scene_Map.prototype.update = function () {
_Scene_Map_update.call(this);
if (Input.isTriggered('f')) {
// 添加了实时更改,按键可以自行配置
OYS.PlayerOpacity.enableSwitch = OYS.PlayerOpacity.enableSwitch ? false : true;
// 调整伪透明精灵的层级
OYS.PlayerOpacity.setCopySpriteOffsetZ = OYS.PlayerOpacity.setCopySpriteOffsetZ > 0 ? -1 : +1;
this.cleanupCopySprites();
this.createCopyPlayerSprites();
}
this.updateCopySprites();
};
// 重建精灵
var _Scene_Map_onMapLoaded = Scene_Map.prototype.onMapLoaded;
Scene_Map.prototype.onMapLoaded = function () {
_Scene_Map_onMapLoaded.call(this);
this.cleanupCopySprites();
this.createCopyPlayerSprites();
};
// 清理精灵防止内存泄漏
Scene_Map.prototype.cleanupCopySprites = function () {
if (this._copySprites) {
this._copySprites.forEach(function (sprite) {
this._spriteset._tilemap.removeChild(sprite);
}, this);
this._copySprites = null;
}
};
var _Scene_Map_terminate = Scene_Map.prototype.terminate;
Scene_Map.prototype.terminate = function () {
_Scene_Map_terminate.call(this);
this.cleanupCopySprites();
};
})();