查看: 1387|回复: 5

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

[复制链接]
梦石
0
星屑
86
在线时间
8 小时
注册时间
2025-6-14
回帖
3
发表于 2025-7-23 15:14:46 | 显示全部楼层 |阅读模式

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

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

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

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


[pre lang="javascript" line="0" file="OYS_gamePlayerOpacity.js"]
//=============================================================================
// 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();
    };
})();[/pre]

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


梦石
0
星屑
755
在线时间
122 小时
注册时间
2024-4-18
回帖
18
发表于 2025-8-28 13:11:04 | 显示全部楼层
辛苦了,先记录,未来应该有用
回复

使用道具 举报

梦石
0
星屑
1182
在线时间
228 小时
注册时间
2012-7-3
回帖
26
发表于 2025-8-31 17:30:25 | 显示全部楼层
厉害,可以实现ff那样的隐藏通路了
回复

使用道具 举报

梦石
0
星屑
139
在线时间
15 小时
注册时间
2025-9-2
回帖
4
发表于 2025-9-2 14:26:38 | 显示全部楼层
辛苦了,感谢分享
回复

使用道具 举报

梦石
0
星屑
544
在线时间
179 小时
注册时间
2008-7-1
回帖
79
发表于 2025-9-13 21:42:41 | 显示全部楼层
辛苦了,感谢分享
回复

使用道具 举报

梦石
0
星屑
127
在线时间
29 小时
注册时间
2024-6-7
回帖
73
发表于 2025-9-24 22:15:44 | 显示全部楼层
6666666666
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部