设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 67|回复: 0
打印 上一主题 下一主题

[原创发布] 实现伪墙体透明插件1.0.3

[复制链接]

Lv1.梦旅人

梦石
0
星屑
76
在线时间
3 小时
注册时间
2025-6-14
帖子
5
跳转到指定楼层
1
发表于 前天 15:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 codePlayerD 于 2025-7-24 00:16 编辑

实现为玩家和队友绘制一个置于更高于上层图块的精灵,当玩家队伍处于高层图块时(屋顶一类,设置了上层通行属性的那些),
实现了伪墙体半透明,原本是想写给即时战斗用的,发现用处还挺广,思路主要来自我的另一篇求助帖的巨佬
可以通过按F键实时开关透明精灵的显示,效果如图:



JAVASCRIPT 代码复制下载
  1. //=============================================================================
  2. // OYS_gamePlayerOpacity.js
  3. //=============================================================================
  4. /*:
  5.  * @plugindesc 实现伪墙体半透明插件
  6.  * @author OYS_codePlayerD(缘系列)
  7.  * @version 1.0.3
  8.  *
  9.  * @param opacity
  10.  * @text 设置伪半透明精灵的值
  11.  * @desc 设置透明度
  12.  * @type number
  13.  * @min 0
  14.  * @max 255
  15.  * @default 100
  16.  *
  17.  * @param enableSwitch
  18.  * @text 启用开关
  19.  * @desc 控制伪墙体半透明开关
  20.  * @type Boolean
  21.  * @default true
  22.  *
  23.  * @help 遇到上方图层半透明功能说明
  24.  * 1-这个插件会创建一个与玩家队伍角色外观相同的精灵;
  25.  * 2-通过调整不同的透明度和层级,实现伪半透明墙体。
  26.  * 可以通过插件参数调整透明度。
  27.  *
  28.  * 关于更新:
  29.  *  1-没有经过兼容测试,单独使用应该没有问题
  30.  *  2-优化了伪透明精灵的耗损,减少了重复绘制
  31.  *  3-支持全队的伪透明
  32.  */
  33. (function () {
  34.     //添加注册F键,测试用或是动态实时调整对应功能(可自行拓展)
  35.     Input.keyMapper[70]='f';
  36.     // 添加了命名空间,减少命名冲突o(╯□╰)o
  37.     var OYS = OYS || {};
  38.     OYS.PlayerOpacity = OYS.PlayerOpacity || {};
  39.     var parameters = PluginManager.parameters('OYS_gamePlayerOpacity');
  40.     OYS.PlayerOpacity.opacity = Number(parameters['opacity'] || 125);
  41.     OYS.PlayerOpacity.enableSwitch = parameters['enableSwitch'] || true;
  42.     OYS.PlayerOpacity.setCopySpriteOffsetZ = 1; // 用于调节伪透明精灵的层级调整
  43.  
  44.     Scene_Map.prototype.createCopyPlayerSprites = function () {
  45.         this._copySprites = [];
  46.         var followers = $gamePlayer.followers().visibleFollowers();
  47.         followers.unshift($gamePlayer); // 玩家和队员
  48.         // 正式使用时,可以删除
  49.         // console.log("层级增减:", OYS.PlayerOpacity.setCopySpriteOffsetZ, "影子精灵是否可见:", OYS.PlayerOpacity.enableSwitch)
  50.  
  51.         followers.forEach(function (actor) {
  52.             var sprite = new Sprite_Character(actor);
  53.             sprite.opacity = OYS.PlayerOpacity.opacity;
  54.             const setProperties = {
  55.                 opacity: OYS.PlayerOpacity.opacity,
  56.                 z: actor.screenZ() + OYS.PlayerOpacity.setCopySpriteOffsetZ,
  57.                 visible: OYS.PlayerOpacity.enableSwitch
  58.             };
  59.             // 通过拦截锁定属性,减少重绘
  60.             Object.keys(setProperties).forEach(prop => {
  61.                 Object.defineProperty(sprite, prop, {
  62.                     get: () => setProperties[prop],
  63.                     set: () => { }
  64.                 });
  65.             });
  66.             this._spriteset._tilemap.addChild(sprite);
  67.             this._copySprites.push(sprite);
  68.         }, this);
  69.     };
  70.  
  71.     // 更新所有精灵的位置和状态
  72.     Scene_Map.prototype.updateCopySprites = function () {
  73.         if (!this._copySprites) return;
  74.         var followers = $gamePlayer.followers().visibleFollowers();
  75.         followers.unshift($gamePlayer);
  76.         this._copySprites.forEach(function (sprite, index) {
  77.             if (OYS.PlayerOpacity.enableSwitch && followers[index]) {
  78.                 sprite.x = followers[index].screenX();
  79.                 sprite.y = followers[index].screenY();
  80.             }
  81.         });
  82.     };
  83.     var _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
  84.     Scene_Map.prototype.createAllWindows = function () {
  85.         _Scene_Map_createAllWindows.call(this);
  86.         this.createCopyPlayerSprites();
  87.     };
  88.  
  89.     var _Scene_Map_update = Scene_Map.prototype.update;
  90.     Scene_Map.prototype.update = function () {
  91.         _Scene_Map_update.call(this);
  92.         if (Input.isTriggered('f')) {
  93.             // 添加了实时更改,按键可以自行配置
  94.             OYS.PlayerOpacity.enableSwitch = OYS.PlayerOpacity.enableSwitch ? false : true;
  95.             // 调整伪透明精灵的层级
  96.             OYS.PlayerOpacity.setCopySpriteOffsetZ = OYS.PlayerOpacity.setCopySpriteOffsetZ > 0 ? -1 : +1;
  97.             this.cleanupCopySprites();
  98.             this.createCopyPlayerSprites();
  99.         }
  100.         this.updateCopySprites();
  101.     };
  102.  
  103.     // 重建精灵
  104.     var _Scene_Map_onMapLoaded = Scene_Map.prototype.onMapLoaded;
  105.     Scene_Map.prototype.onMapLoaded = function () {
  106.         _Scene_Map_onMapLoaded.call(this);
  107.         this.cleanupCopySprites();
  108.         this.createCopyPlayerSprites();
  109.     };
  110.  
  111.     // 清理精灵防止内存泄漏
  112.     Scene_Map.prototype.cleanupCopySprites = function () {
  113.         if (this._copySprites) {
  114.             this._copySprites.forEach(function (sprite) {
  115.                 this._spriteset._tilemap.removeChild(sprite);
  116.             }, this);
  117.             this._copySprites = null;
  118.         }
  119.     };
  120.  
  121.     var _Scene_Map_terminate = Scene_Map.prototype.terminate;
  122.     Scene_Map.prototype.terminate = function () {
  123.         _Scene_Map_terminate.call(this);
  124.         this.cleanupCopySprites();
  125.     };
  126. })();


码区难民做游戏好难啊,ui什么的做得好丑。。。


您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-7-25 14:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表