查看: 21085|回复: 54

[有事请教] 如何实现《废都物语》式地图探索?(4月20日最终版)

[复制链接]
梦石
0
星屑
624
在线时间
189 小时
注册时间
2011-4-15
回帖
60

开拓者

发表于 2019-3-17 21:44:15 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 yuxuan1177 于 2019-4-20 18:27 编辑

4月20日已更新最终效果
……
新人正在做游戏,画师和脚本都就绪了。
准备用废都物语式的地图探索机制,但是《废都物语》之中的地图探索,是使用图块直接替换的命令,而在RMMV里面并不存在这种设计。
试过用全事件覆盖地图的方式,但平铺事件让地图变得很卡
也试过把地图拆成图片,但是角色图层在图片下面,而且图多也卡
请问,有没有简单便捷的实现方式呢?




……
第一次更新
……
感谢6Lwabcmcc大大和26Ltseyik大大的插件
目前已经半成功实现
方法:
利用MrTS_DarkRoomCovers.js将区域涂色成战争迷雾
利用TMRegionColor.js实现功能:区域替换(例如将区域1替换成区域2)
利用TMRegionPassable.js实现功能:区域通行限制
实现过程:
在插件MrTS_DarkRoomCovers.js中,将区域1设置为不涂色,区域2设置为迷雾,这样,区域1就是透明,而区域2则是黑色
利用TMRegionPassable.js,设置区域1为通行状态,区域2为不通行状态
利用TMRegionColor.js的指令,设置并行事件:唤出插件将区域2替换成区域1

不过有一个问题,就是区域替换之后,需要走一步黑色区域才会变化,效果有些不太理想……而且每一次变化都是临时的,所以必须要设置成并行事件……
但除此之外,功能倒是完全实现了
插件位置:
MrTS_DarkRoomCovers.js
https://github.com/Trivel/RMMV/blob/master/MrTS_DarkRoomCovers.js
TMRegionColor.js+TMRegionPassable.js
https://hikimoki.sakura.ne.jp/plugin/plugin_map.html



实现方法2:
在MrTS_DarkRoomCovers.js的基础上
利用RED_SetRegionID.js实现https://github.com/Hikitsune-Red ... /RED_SetRegionID.js
这个插件可以更改指定图块的区域,(X,Y,regionId),实现效果最直接,但需要一个个在地图上设置命令,小地图还好,大地图就需要一长串的指令,可以说是需要多少个图块,就需要多少个指令,当然,可以设置成区域,但也很繁琐……而且调整区域之后,同样需要走一步才能实现效果
这个方法的优点是,只需要设置一次,不需要用并行事件再度调整
问题都是一样
综合而言,方法1最简单
目前在想为啥需要走一步才会启动区域替换……

……
再度更新
……
现在已经完全实现效果
采用的是方法2调整
插件:
MrTS_DarkRoomCovers.js
TMRegionPassable.js
RED_SetRegionID.js

实现步骤:
1、使用脚本(非插件命令)$gameMap.setTileId(x,y),可以去除当前脚本的区域图块,变更为区域0,或者(X,Y,regID)调整为任意区域,不过这里实现效果用区域显示
2、在脚本下面加上一行插件命令RegionReveal [regID],从而将当前区域更变为透明的效果
3、在事件结束之后,当前区域图块立刻显示为透明,在行动了一步之后,$gameMap.setTileId(x,y)命令生效,将已经变成透明的区域变更为区域0
4、在地图出入口执行RegionReset命令,也就是将所有透明图块复位成迷雾,而之前的那些区域已经被修改为了区域0,所以并不会变成黑色
效果实现。
略有繁琐,但目前效果最好,而且没有多图层,只有单纯的几个命令,资源占用应该也不大,目前最完美效果
黑色区域为限制通行区域,看不到下层的地图,并且也无法通行,第二张图为触发了第一张的事件点之后开放,区域可以进入
第一张图比较暗,是因为顺便测试了一下手电筒效果
QQ图片20190406152234.png
QQ图片20190406152238.png
……
继续更新,失败了
如果前一张地图的大小和后一张一样,区域替换会被继承导致地图提前开放,无法解决……Orz
……

……
4月20日更新
……
找到最终解决方案了。
那就是设立一个并行事件。
并行事件设立RegionReveal 和changeRegion [指定区域] 0
这两个命令
然后在地图跳转口设立RegionReset命令
这样就解决
效果最好,就是害怕事件导致运行效率下降……
……
20日再度更新
……
区域替换对效率影响不大,现在可以安心使用了
QQ图片20190420182143.png
这是实现临时清除迷雾效果
QQ图片20190420182134.png
这是在特定地点使用道具挖开新路的效果
QQ图片20190420182148.png
QQ图片20190420182148.png

评分

参与人数 1赞 +1 收起 理由
白嫩白嫩的 + 1 精品文章

查看全部评分

梦石
0
星屑
538
在线时间
37 小时
注册时间
2017-12-16
回帖
29
发表于 2019-3-18 01:22:23 | 显示全部楼层
捕获.PNG

方框:实际上是长得跟方框似的主角
闪烁的点:实际上是个“原地踏步”的点状生物,迈左脚时暗,迈右脚时亮,在人物下方,确定键触发
地图是一副画:是个狠人就把整张画分割成一格格小拼图,再重新拼起来;不是狠人就找找插件
爆ぜろリアル!弾けろシナプス!パニッシュメント......ディス、ワールド!
回复

使用道具 举报

梦石
0
星屑
624
在线时间
189 小时
注册时间
2011-4-15
回帖
60

开拓者

 楼主| 发表于 2019-3-18 02:16:16 | 显示全部楼层
blue_ku 发表于 2019-3-18 01:22
方框:实际上是长得跟方框似的主角
闪烁的点:实际上是个“原地踏步”的点状生物,迈左脚时暗,迈右脚时 ...


这个我都知道,我就是在把图拆分,但是拆分之后,如何实现战争迷雾的消去很麻烦,现在想到的方法是用图片遮罩,虽然可以实现,但是需要很多图片分别遮挡,而且还要用事件拦住迷雾的地图,让主角(方框)没办法去迷雾地区
现在就是想要一个简单的视线方法
不然的话,一个地图二十多张图很麻烦,而且小地图还好,大地图的话,图片布置布局很容易乱……

点评

等插件大佬出现  发表于 2019-3-18 04:39
回复

使用道具 举报

梦石
0
星屑
3922
在线时间
1198 小时
注册时间
2016-8-9
回帖
2355

开拓者

发表于 2019-3-18 13:49:14 | 显示全部楼层
我有个思路,虽然不能完全像废都那样探索,但也许能做出个大概吧【未实验,纯属拍脑门想出来的】

灯光系统不是可以让角色周围一圈可以看见,远处看不见吗,通过事件设置事件灯光,就像路灯一样排布在地图里面,事件灯光可以设置灯光覆盖范围有多大,事件灯光之间的距离根据需要调整,然后设置角色经过“路灯”的时候,路灯自动打开,可以利用mog插件或者yep插件设定距离路灯多少格开启该路灯,这样探索地图基本上能做出来吧。

但是也有个问题,探索完地图可能会有未被灯光覆盖的边角残留

点评

似乎可以配合楼下使用,我看看如何实现  发表于 2019-3-19 13:45
酸酸甜甜就④哇噢
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2019-3-18 17:36:54 | 显示全部楼层
本帖最后由 tseyik 于 2019-3-18 17:47 编辑

有個近似的
雖沒战争迷雾
但可以使用true,false或$ gameSwitch值啟用/禁用每個路徑
狀態窗口使用您選擇的任何變量顯示每個節點的狀態(例如,推薦級別,箱子數量等)
每個節點盡可能使用事件,節點可以動畫。(用事件1/2頁,用不同動畫就可做出你要的効果
World Map Plugin 2.00b
https://forums.rpgmakerweb.com/i ... plugin-2-00b.56133/
worldMapSysComplete.png
worldMapPluginScreenA.png
允許可定制的,功能齊全的世界地圖系統。每個世界地圖位置都是一個“節點”,節點之間的路徑可以鎖定/解鎖(即發生滑坡,切斷兩個城鎮之間的通道),內置箭頭支持(可以啟用/禁用自定義圖片),這可以識別未鎖定路徑和鎖定路徑(鎖​​定路徑使用禁用箭頭)。附帶可自定義的窗口顯示節點狀態。


特徵
- 靈活的世界地圖系統(節點可能只有一個瓦片,可以菊花鏈連接多個世界地圖等)


- 每個節點盡可能使用事件,節點可以動畫。


- 每個節點可以有1-4個路徑通向其他節點。


- 無需手動尋路!這一切都由Shaz的Path Finder處理。


- 狀態窗口使用您選擇的任何變量顯示每個節點的狀態(例如,推薦級別,箱子數量等)


- 如果播放器距離太近,狀態窗口將移動。玩家應該無法進入狀態窗口。


- 遊戲變量搭配以記住上一張地圖(如果用戶決定取消世界地圖)。


- 可以使用true,false或$ gameSwitch值啟用/禁用每個路徑。


- 可選箭頭按鈕組支持(熱/冷/禁用)。


- 清理腳本,因此不會進行冗餘的交換機檢查。

点评

感谢,配合楼下的方案似乎可以实现,我研究一下  发表于 2019-3-19 13:43

评分

参与人数 2赞 +2 收起 理由
yuxuan1177 + 1 塞糖
KB.Driver + 1 我很赞同

查看全部评分

回复 2 0

使用道具 举报

梦石
0
星屑
16261
在线时间
4014 小时
注册时间
2015-9-14
回帖
1322

开拓者

发表于 2019-3-18 22:29:04 | 显示全部楼层
Mr. Trivel:MrTS_DarkRoomCovers.js
用區域ID顯示特定區域的圖塊,或隱藏特定區域的圖塊.
MrTS_DarkRoomCovers.js//=============================================================================
// MrTS_DarkRoomCovers.js
//=============================================================================

/*:
* @plugindesc Hides or reveals regions.
* @author Mr. Trivel
*
* @param Tile Size
* @desc How big are map tiles? X Y
* Default: 48 48
* @default 48 48
*
* @help
* --------------------------------------------------------------------------------
* Terms of Use
* --------------------------------------------------------------------------------
* Don't remove the header or claim that you wrote this plugin.
* Credit Mr. Trivel if using this plugin in your project.
* Free for commercial and non-commercial projects.
* --------------------------------------------------------------------------------
* Version 1.1
* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
* Map Property Tags
* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
* Plugin Commands
* --------------------------------------------------------------------------------
* RegionReveal [ID] - Reveals tiles of specific region
* RegionHide [ID] - Hides tiles of specific region
* RegionReset - Resets all open regions
* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
* Version History
* --------------------------------------------------------------------------------
* 1.1 - Performance issues fixed, code cleanup
* 1.0 - Release
*/

(function() {
        var parameters = PluginManager.parameters('MrTS_DarkRoomCovers');
        var paramTileSize = String(parameters['Tile Size'] || "48 48").split(' ');
        var tileSizeX = Number(paramTileSize[0]);
        var tileSizeY = Number(paramTileSize[1]);

        //--------------------------------------------------------------------------
        // Game_Interpreter
        //
       
        var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
        Game_Interpreter.prototype.pluginCommand = function(command, args) {
                _Game_Interpreter_pluginCommand.call(this, command, args);
                if (command.toLowerCase() === "regionreveal") {
                        $gameMap.addToCurrentlyOpenRegions(Number(args[0]));
                } else if (command.toLowerCase() === "regionhide") {
                        $gameMap.removeFromCurrentlyOpenRegions(Number(args[0]));
                } else if (command.toLowerCase() === "regionreset") {
                        $gameMap.resetCurrentlyOpenRegions();
                }
        };

        //----------------------------------------------------------------------------
        // Game_Map
        //
       
        // currentlyOpenRegions
        Game_Map.prototype.currentlyOpenRegions = function() {
                if (!this._openRegionIds) this._openRegionIds = [0];
                return this._openRegionIds;
        };

        Game_Map.prototype.addToCurrentlyOpenRegions = function(id) {
                if (!this._openRegionIds) this._openRegionIds = [0];
                if (!this._openRegionIds.contains(id)) this._openRegionIds.push(id);
        };

        Game_Map.prototype.removeFromCurrentlyOpenRegions = function(id) {
                if (!this._openRegionIds) return;
                this._openRegionIds.splice(this._openRegionIds.indexOf(id), 1);
        };

        Game_Map.prototype.resetCurrentlyOpenRegions = function() {
                this._openRegionIds = [0];
        };

        //----------------------------------------------------------------------------
        // Scene_Map
        //

        var _SceneMap_createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
        Scene_Map.prototype.createDisplayObjects = function() {
                _SceneMap_createDisplayObjects.call(this);
                this.createDarkCover();
        };

        Scene_Map.prototype.createDarkCover = function() {
                this._darkCover = new Spriteset_DarkCover();
                this._spriteset.addChild(this._darkCover);
        };

        //--------------------------------------------------------------------------
        // Spriteset_DarkCover
        //
        // Covers regions with dark dark darkness.
       
        function Spriteset_DarkCover() {
                this.initialize.apply(this, arguments);       
        };
       
        Spriteset_DarkCover.prototype = Object.create(Sprite.prototype);
        Spriteset_DarkCover.prototype.constructor = Spriteset_DarkCover;
       
        Spriteset_DarkCover.prototype.initialize = function() {
                Sprite.prototype.initialize.call(this);
                this.setFrame(0, 0, Graphics.width, Graphics.height);
                this._tone = [0, 0, 0, 0];
                this.opaque = true;
                this._darkCovers = [];
                this._displayX = 0;
                this._displayY = 0;
                this._regions = $gameMap.currentlyOpenRegions().clone();
                this.createDarkCovers();
                this.update();
        };

        Spriteset_DarkCover.prototype.createDarkCovers = function() {
                var bitmap = new Bitmap(tileSizeX, tileSizeY);
                bitmap.fillAll('#000000');
                for (var j = -1; j < Math.ceil(Graphics.boxHeight/tileSizeY)+2; j++) {
                        this._darkCovers.push([]);
                        for (var i = -1; i < Math.ceil(Graphics.boxWidth/tileSizeX)+2; i++) {
                                var cover = new Sprite(bitmap);
                                cover.x = i * tileSizeX;
                                cover.y = j * tileSizeY;
                                var regionId = $gameMap.regionId(i+this._displayX, j+this._displayY);
                                cover.visible = !(this._regions.contains(regionId));
                                this._darkCovers[j+1].push(cover);
                                this.addChild(cover);
                        }
                }
        };

        Spriteset_DarkCover.prototype.update = function() {
                Sprite.prototype.update.call(this);
                this.x = (-$gameMap.displayX() + Math.floor($gameMap.displayX())) * tileSizeX;
                this.y = (-$gameMap.displayY() + Math.floor($gameMap.displayY())) * tileSizeY;
                if (Math.floor($gameMap.displayX()) !== this._displayX ||
                        Math.floor($gameMap.displayY()) !== this._displayY ||
                        !$gameMap.currentlyOpenRegions().equals(this._regions))
                {
                        this._displayX = Math.floor($gameMap.displayX());
                        this._displayY = Math.floor($gameMap.displayY());
                        this._regions = $gameMap.currentlyOpenRegions().clone();
                        for (var j = -1; j < Math.ceil(Graphics.boxHeight/tileSizeY)+2; j++) {
                                for (var i = -1; i < Math.ceil(Graphics.boxWidth/tileSizeX)+2; i++) {
                                        var regionId = $gameMap.regionId(i+this._displayX, j+this._displayY);
                                        this._darkCovers[j+1][i+1].visible = !(this._regions.contains(regionId));
                                }
                        }
                }
        };
})();

00b 3.png
00c 4.png

点评

感谢,这几个方案我研究一下哪样比较好用,主要是方便制作  发表于 2019-3-19 13:42

评分

参与人数 1赞 +1 收起 理由
yuxuan1177 + 1 塞糖

查看全部评分

https://rpg.blue/data/attachment/album/202003/28/021323lltgrsvfytfwuya5.gif
回复 1 0

使用道具 举报

梦石
0
星屑
624
在线时间
189 小时
注册时间
2011-4-15
回帖
60

开拓者

 楼主| 发表于 2019-3-19 14:48:46 | 显示全部楼层
本帖最后由 yuxuan1177 于 2019-3-19 14:51 编辑
wabcmcc 发表于 2019-3-18 22:29
Mr. Trivel:MrTS_DarkRoomCovers.js
用區域ID顯示特定區域的圖塊,或隱藏特定區域的圖塊.
[fold=MrTS_DarkRo ...


比起我原来的方法简单了很多,工作量下降了,感谢。
但现在有一个问题。
那就是在地图进行切换之后,上一张地图的区域显示是保留的。
换句话说,我在第一张第一设置区域2显示的话,到了第二张地图,区域二也是亮的,有没有办法能够将地图上的区域显示独立出来呢?


补充
想到了一个解决方案,那就是把事件全部做并行处理,每一个地图设置区域全暗,然后通过开关将并行事件设置为当前地图打开,这样就可以了

点评

每張地圖用多個不同區域ID隱藏/打開地區,不會有同時隱藏/打開地區,但不知會否同通行度(ID)插件起衝突.  发表于 2019-3-19 16:41
其實有前的方法,用SupponChangeTileId  发表于 2019-3-19 15:15
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2019-3-19 15:20:00 | 显示全部楼层
本帖最后由 tseyik 于 2019-3-19 15:33 编辑

マップタイルのコピー1.07
不過有人説和YEP不和
https://tm.lucky-duet.com/viewtopic.php?t=338

回复

使用道具 举报

梦石
0
星屑
624
在线时间
189 小时
注册时间
2011-4-15
回帖
60

开拓者

 楼主| 发表于 2019-3-19 15:42:03 | 显示全部楼层
tseyik 发表于 2019-3-19 15:20
マップタイルのコピー1.07
不過有人説和YEP不和
https://tm.lucky-duet.com/viewtopic.php?t=338


那个……并不是很懂这是怎么用的……
我是用手绘背景,然后用上面的方法作为遮罩
目前正在研究区域通行的设计,实现战争迷雾地区无法进入,迷雾消失就可以进去的方法
回复

使用道具 举报

梦石
0
星屑
7736
在线时间
1227 小时
注册时间
2008-12-14
回帖
504
发表于 2019-3-19 16:24:04 | 显示全部楼层
本帖最后由 if216 于 2019-3-19 16:28 编辑

其实可以用事件做,每一个事件格对应一个相应的图块。然后通过切换事件开关,打开或关闭。
脚本这一块涉及地图,要做地图的大佬做估计会做。。。水大佬什么的
我做过一个演示,查我帖子,里面有个地图迷雾演示。跟这个不太像。
需要购买本人MV插件必须先加wx好友。加不上wx就是本人忙,没时间卖。原则上太久以前的插件也不想卖,因为我也忘了,维护上会不给力。wx名:alskyif    本人插件地址:
   LCK_SRPG梦幻模拟战、火焰纹章类系统
   究极立绘ADV系统

   究极换装统合系统
   究极! 回想与CG系统
   消息文字的距离调整  
   自动返回上一张地图
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部