本帖最后由 RyanBern 于 2019-8-25 09:38 编辑 我来给一个直观的实现办法。在不改编辑器的条件下我的这个办法还算比较直观。 主要原理就是将需要设置区域的地图额外复制一张,然后在新地图的第三层加铺代表“区域ID”的图块。 然后使用某种办法将原地图和新地图关联起来,使得新地图成为原地图的“区域ID层”。由于设计区域一般来讲只需要地图场景大致轮廓就可以,因此单独拿出来一个图层作为设置区域问题不大。 主要步骤: 1. 首先使用 PS 等工具(或用程序生成)在原图块的基础上创建一个新图块素材,在新图块素材的末尾绘制表示区域 ID 的图块,比方说我 改造的 001-Grassland01 图块就素材是下面这样的: 2. 在数据库中将原图块数据复制一份,新复制的图块数据的素材改为改造后的图块素材。例如在下图中我的新素材命名为 001-Grassland01-r 注:这一步也可以简化成用新图块素材覆盖原图块素材,之后不用在数据库新建。由于表示区域 ID 的图块是在最后面添加的,将素材扩大对原有数据库以及地图是不会造成影响的。 3. 将需要标区域的地图复制一份,然后在地图结构中放入下一层级。例如在下图中,MAP001 是原始地图,Mask 是新复制的地图。注意新复制的地图在原始地图层级下面。这一步实际上是将原始图和区域ID图关联起来了。最后将新地图使用的图块改为含区域ID素材的图块。 4. 在区域 ID 图的第三层进行编辑。 由于区域 ID 图和原始图的前两层完全一样,这样就是相当于可视化编辑了。 5. 接下来就是写脚本来获取区域 ID 了,1-4 的步骤仅仅是设置步。要让游戏真正识别你的区域 ID 还是需要脚本的帮助。比方说我就写了这个脚本: RUBY 代码复制
这个脚本的意思是说,如果一个正常地图的下一级有一个名为 Mask 的地图,那么这个地图就是原始地图的区域图。脚本会根据区域图的图块信息来自动对应出原地图的区域 ID。在游戏其他地方我们马上就可以使用下面的脚本来获取区域 ID 相关信息: RUBY 代码复制
有了这个接口之后就可以利用这个区域 ID 做很多东西了。例如根据区域不同设置敌人等。这里不再赘述。 此实现的缺点: 1. 需要额外使用一张地图来表示区域,如果地图很多是一种浪费。 2. 当原地图发生改动时,无法在其对应区域地图上进行同步。 3. 需要拼接图块等素材方面的操作(但这个操作可以用程序完成) 附一个范例。这个范例除了能实现上述功能以外,还附赠了自动生成图块素材的功能。 RUBY 代码复制
|
参与人数 1 | 赞 +1 | 收起 理由 |
---|---|---|
miantouchi | + 1 | 认可答案 |
本帖最后由 灯笼菜刀王 于 2019-8-24 17:13 编辑 你没理解, 核心为"改变遇敌数组从而实现不同区域遇敌", 而那些方法都是用来改变的手段, 根据各种条件把遇敌列表分歧从而实现不同区域遇敌 然后你要做的就是根据玩家的位置, 把对应的条件满足就行了, 主要是改动变量, 确保它是你要分歧的值 给你个饭粒吧, 没仔细测试过, 应该没BUG 采用 地图ID + 变量 + 地形标志的方式, 这样就足够组合出无数个范围了, 有设置的地图就启动敌群分歧, 没设置的地图就用默认遇敌 用变量来区分区域, 用地形标志来设置不规则范围, 在跨区域的时候改变变量值就行了, 规则的界线就用范围触发, 不规则的就铺事件就行了, 再说大区域方方正正也没什么关系嘛 顺便做个小插件, 设置起来方便些 |
参与人数 2 | 星屑 +100 | 赞 +2 | 收起 理由 |
---|---|---|---|
miantouchi | + 1 | 认可答案 | |
RyanBern | + 100 | + 1 | 认可答案 |
本帖最后由 灯笼菜刀王 于 2019-8-23 11:03 编辑 要栗子啊 1, 明雷法, 用事件当做敌人, 设置为接触启动, 然后事件内容做战斗处理, 之后暂时消失就行了 2, 改遇敌敌群法, game map 里, 这个函数就是获得该地图的敌群数组, 只要这里开分歧就可以了 #-------------------------------------------------------------------------- # ● 获取遇敌列表 #-------------------------------------------------------------------------- def encounter_list if $game_switches[1] #开关1打开的时候, 采用特殊设置敌群 case $game_variables[1] #用变量1来分歧 when 1 return [1,2,3,4,5] when 2 return [6,7,8,9] else return [10,11] end else #开关没开的时候用默认设置 return @map.encounter_list end end 然后, 需要特殊遇敌的时候打开开关, 改变变量就可以从对应的数组里抽敌群ID了 当然变量也可以换成其他判定, 比如地形标志 $game_player.terrain_tag, 比如坐标 $game_player.x > 5 and $game_player.y < 10 and $game_player.y > 5 and $game_player.y < 10, 比如 图块ID $game_map.data[$game_player.x,$game_player.y,0] 如果选择变量分歧的话, 那就要想办法在需要的位置改变它的值, 可以用 方法2: 并行处理, 判断主角坐标来给变量赋值, 达到不同区域改变不同遇敌的目的(不想并行处理可以用我写的小插件范围触发), 这方法容易理解也容易控制, 适合复数地图和各种地形的地图使用, 缺点就是想做不工整的范围比较麻烦 3, 事件铺路法, 像这样在路口铺两个事件, 设置为接触触发, 然后内容是分别改变变量值, 这样就区分出两个区域了, 只要走过去就自然切换成对应的变量, 优点是设置方便, 缺点就是只适合狭小路口用 , 必须保证要通过就要踩中两个事件(设置两个事件是为了防止在事件上"回头"导致变量异常), 当然,如果需要大范围铺, 那还是可以用我的那个范围触发(广告~) 4, 图块ID法, 用图块ID来分歧敌群, 把地板的图块分成N个, 不同的区域用对应的地板图块, 这样就实现不同区域遇敌了,(想知道图块对应的ID, 可以做个NPC, p $game_map.data[$game_player.x,$game_player.y,0] , 这个就是主角脚下的第一层图块的ID)图块可以是透明的不影响判定, 所以如果事先有计划的绘制地图就没影响, 此法的优点就是不需要额外设置, 不会占用资源(除了稍微增加一点图片体积,笑), 缺点就是要十分明白自己在干嘛, 否则就会出错而且很难排查, 如果我这样说你还是不能理解这个方法怎么用,那就别用它 5, 扩展地形标志, 这个有相关插件, 不过只要是魔改就不绿色, 所以想用自重, 其实不扩展也可以, 通过双重判定就可以间接扩展地形标志, 比如 用变量+地形标志的判断, 切换大区域的时候改变变量, 就等于又是8个地形标志, 而小区域用8个地形标志分歧应该就够用了吧 |
本帖最后由 89444640 于 2019-8-22 13:45 编辑 地形标记扩展,8*8种,我用的足音系统就是,你可以替换成暗雷系统,然后再按照地图编号区分。不过足音是魔改的主程序,慎用。 感觉根据地图标号+地形编号一起脚本分歧8种也差不多够用了。 |
本帖最后由 灯笼菜刀王 于 2019-8-22 11:42 编辑 1, 这年头很少做暗雷的了~ 用明雷直接解决, 简单绿色无添加无农药残留 2, 用并行处理, 按坐标判定来决定随机敌群 3, 用变量判断, 在区域和区域的接口处埋事件, 用来在角色移动过去的时候切换变量值, 然后通过变量值来分歧遇敌敌群组 4, 地形标志不够用, 那就用图块来判定, $game_map.data[X,Y,层数0为第一层] 就可以获得这个坐标的图块ID, 透明图块也一样有ID, 第二行左边第一个图块ID是384,以此类推, 你只要把地面的图块做成N个, 然后去铺在第一层, 用这些图块的ID当做地形标志一样使用就可以了, 小技巧: 复制你的tileset图片, 在对应的图块上标上ID数字, 用它来编辑地图, 方便查看, 之后换回没标数字的tileset搞定收工 5, 用地形标志扩展脚本 |
全地图没有遇敌,遭遇战写个并行公共事件手动判断 |
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-11-30 15:16
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.