设置玩家透明度实现伪墙体透明
感谢巨佬的思路,有思路很快就解决了 ,新人插件,一切都是缘插件很简单,只要配置参数就行了,只能给玩家使用,事件的话,感觉又得换一种思路
因为要实现ARPG战斗,所以boss事件和精英怪事件中的行走图都非常大,出现上层图层时且类似城市场景时,会出现墙体一部分遮挡住事件,另一部分却被事件遮挡。。。。。
如果使用插件的思路虽然也可以使用这个插件的思路去实现,但是怪物多了德华可能比较卡顿,顺便看看有没有其他思路
抛砖引玉ing
JAVASCRIPT 代码下载
//=============================================================================
// 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();
}
};
})();
本帖来自P1论坛作者codePlayerD,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=497768若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]