じ☆ve冰风 发表于 2025-7-23 15:32:40

设置玩家透明度实现伪墙体透明

感谢巨佬的思路,有思路很快就解决了 ,新人插件,一切都是缘
插件很简单,只要配置参数就行了,只能给玩家使用,事件的话,感觉又得换一种思路
因为要实现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]
查看完整版本: 设置玩家透明度实现伪墙体透明