查看: 816|回复: 4

[有事请教] rmmv如何在地图上修改瓦片透明度[已解决]

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

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

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

×
本帖最后由 codePlayerD 于 2025-7-23 15:00 编辑

我想修改指定坐标瓦片地图的透明度,比如地图坐标(8,8)的瓦片透明度,目前试过了两种方法。
##第一种:用替换瓦片图片的方法实现。
但我想要的是通过代码直接修改透明度,这样就可以便捷很多(且不用修改素材,毕竟码区难民不会弄素材)。
##第二种修改玩家透明度来伪实现,但是问题巨大。
现在想通过实时绘制来修改,
但我发现修改Tilemap和ShaderTilemap都不生效,有点没有思路了,有木有巨佬捞一下
会写脚本和简单插件,但这个效果试了几天还是没写出来


已解决,感谢巨佬的思路,以下是根据思路制作的插件,伪半透明墙体插件
[pre lang="javascript" line="1" file="OYS_gamePlayerOpacity.js"]//=============================================================================
// 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();
        }
    };

})();
[/pre]
梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2025-7-23 09:56:54 | 显示全部楼层
如果你只是想"角色被遮挡时显示半透明效果",  那第二种更方便, 但不是修改行走图透明度, 而是给行走图再叠上一层, 在第二层设置半透明和最上方显示


然后你说的"问题巨大" 是什么问题?
回复 1 0

使用道具 举报

梦石
0
星屑
86
在线时间
8 小时
注册时间
2025-6-14
回帖
3
 楼主| 发表于 2025-7-23 10:01:00 | 显示全部楼层
灯笼菜刀王 发表于 2025-7-23 09:56
如果你只是想"角色被遮挡时显示半透明效果",  那第二种更方便, 但不是修改行走图透明度, 而是给行走图再叠 ...

当玩不被屋顶一类图块完全挡住露出个小脑瓜子时,头是透明的

点评

你自己看我发的GIF  发表于 2025-7-23 10:10
回复

使用道具 举报

梦石
0
星屑
86
在线时间
8 小时
注册时间
2025-6-14
回帖
3
 楼主| 发表于 2025-7-23 10:21:17 | 显示全部楼层
灯笼菜刀王 发表于 2025-7-23 09:56
如果你只是想"角色被遮挡时显示半透明效果",  那第二种更方便, 但不是修改行走图透明度, 而是给行走图再叠 ...

嗷嗷,我发现了,你的方法比我多了一个步骤,再弄一个玩家,第二个玩家变成半透明,并且置于目标图块上方,
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部