//=============================================================================
// OYS_gamePlayerOpacity.js
//=============================================================================
/*:
* @plugindesc 实现伪墙体半透明插件
* @author OYS_codePlayerD(缘系列)
* @version 1.0.1
*
* @param opacity
* @text 设置伪半透明精灵的值
* @desc 设置透明度
* @type number
* @min 0
* @max 255
* @default 100
*
* @param enableSwitch
* @text 启用开关
* @desc 控制伪墙体半透明开关
* @type Boolean
* @default true
*
* @help 遇到上方图层半透明功能说明
* 1-这个插件会创建一个与玩家角色外观相同的精灵,
* 2-通过调整不同的透明度和层级,始终显示在玩家上方。
* 可以通过插件参数调整透明度。
*
* 关于性能优化:
* 1-没有经过兼容测试,单独使用应该没有问题
*/
(function () {
var parameters = PluginManager.parameters('OYS_gamePlayerOpacity');
var opacity = Number(parameters['opacity'] || 125);
var enableSwitch = parameters['enableSwitch']||true;
var _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
Scene_Map.prototype.createAllWindows = function () {
_Scene_Map_createAllWindows.call(this);
this.createCopyPlayerSprite();
};
// 复制玩家精灵
Scene_Map.prototype.createCopyPlayerSprite = function () {
if (!this._copySprite) {
this._copySprite = new Sprite_Character($gamePlayer);
this.addChild(this._copySprite);
} else {
this._copySprite.setCharacter($gamePlayer);
}
};
// 通过帧更新复制精灵数据
var _Scene_Map_update = Scene_Map.prototype.update;
Scene_Map.prototype.update = function () {
_Scene_Map_update.call(this);
if (this._copySprite && $gamePlayer) {
if (enableSwitch) {
//用这种方法减少重复绘制
if (!this.OYscondition) {
console.log("只设置一次的参数")
this._copySprite.visible = true;
this._copySprite.opacity = opacity;
this._copySprite.z = $gamePlayer.screenZ() + 1;
// 重写opacity属性,确保始终返回目标
Object.defineProperty(this._copySprite, 'opacity', {
get: function () {
return opacity; // 仅针对this._copySprite的 固定透明度
},
set: function (value) { }// 忽略任何修改
});
this.OYscondition = true;
}
this._copySprite.x = $gamePlayer.screenX();
this._copySprite.y = $gamePlayer.screenY();
} else {
if (!this.OYsconditionF) {//只会刷新一次,减少重复绘制
this._copySprite.visible = false;
this.OYsconditionF = true;
}
}
}
};
// 图像同步
var _Game_Player_setCharacterImage = Game_Player.prototype.setCharacterImage;
Game_Player.prototype.setCharacterImage = function (characterName, characterIndex) {
_Game_Player_setCharacterImage.call(this, characterName, characterIndex);
// 安全检查场景和精灵是否存在
if (SceneManager._scene instanceof Scene_Map && SceneManager._scene._copySprite) {
SceneManager._scene._copySprite.setCharacter(this);
}
};
// 切图重建
var _Scene_Map_onMapLoaded = Scene_Map.prototype.onMapLoaded;
Scene_Map.prototype.onMapLoaded = function () {
_Scene_Map_onMapLoaded.call(this);
this.createCopyPlayerSprite();
};
// 场景销毁时清理,防止内存泄漏
var _Scene_Map_terminate = Scene_Map.prototype.terminate;
Scene_Map.prototype.terminate = function () {
_Scene_Map_terminate.call(this);
this.OYscondition = false; // 场景销毁时重置标记
if (this._copySprite) {
this.removeChild(this._copySprite);
this._copySprite = null;
}
};
// 玩家重置时同步更新
var _Game_Player_performTransfer = Game_Player.prototype.performTransfer;
Game_Player.prototype.performTransfer = function () {
_Game_Player_performTransfer.call(this);
if (SceneManager._scene instanceof Scene_Map && SceneManager._scene._copySprite) {
SceneManager._scene.createCopyPlayerSprite();
}
};
})();