查看: 3239|回复: 8

[已经解决] 如何修改地图上一个点的通行状况

[复制链接]
梦石
0
星屑
439
在线时间
38 小时
注册时间
2018-5-3
回帖
12
发表于 2019-1-5 16:04:46 | 显示全部楼层 |阅读模式

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

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

×
如题,如何得到和修改地图上一个点的通行状况?
这个点可能是一个不能通行的原件,上面可能还有一个事件。而且,我要能把他改回来。
最好是用脚本的方法,告诉我方法就可以,谢谢!
梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2019-1-5 18:08:13 | 显示全部楼层
在game map 脚本里找到定义通行的方法

def passable?(x, y, d, self_event = nil)

然后,在下面,根据你要的条件, 让它的值返回真就可以了

比如说, 当1号开关打开的时候, X10,Y10的这个格子就必定可以通行

if $game_switches[1] and x == 10 and y == 10
  return true
end

比如说, 1号角色学会 2号技能的时候, 在3号地形标志的地方都可以通行

if $game_actors[1].skill_learn?(2) and $game_player.terrain_tag == 3
  return true
end

只要分歧出条件, 就可以随意改变通行度了

点评

{:4_124:}  发表于 2019-1-8 09:52
回复

使用道具 举报

梦石
0
星屑
19426
在线时间
3082 小时
注册时间
2013-1-11
回帖
1207
发表于 2019-1-5 20:45:00 | 显示全部楼层
本帖最后由 张咚咚 于 2019-1-5 20:48 编辑

1.将下面脚本插到main之前。
  1. class Game_System
  2.   attr_accessor :global
  3.   def pass_set(id, x, y, passable)
  4.     @global ||= {}
  5.     @global[id] ||= {}
  6.     @global[id][[x, y]] = passable
  7.     true # 防止XP事件末尾返回BUG
  8.   end
  9.   def pass_remove(id, x, y)
  10.     @global ||= {}
  11.     @global[id] ||= {}
  12.     @global[id].delete [x, y]
  13.     true # 防止XP事件末尾返回BUG
  14.   end
  15.   def isPassable?(id, x, y)
  16.     return ((@global || {})[id] || {})[[x, y]]
  17.   end
  18. end
复制代码


2.下面脚本插入到【Game_Map】的第212行下面。
  1.     pass = $game_system.isPassable?(@map_id, x, y)
  2.     return pass unless pass.nil?
复制代码


3.事件调用。
$game_system.pass_set(1, 9, 5, true) # 1号地图的9,5位置可通行。
$game_system.pass_set(1, 9, 5, false) # 1号地图的9,5位置不可通行。
$game_system.pass_remove(1, 9, 5) # 删除1号地图的9,5位置的通行设置(还原为默认)。

评分

参与人数 1星屑 +100 赞 +1 收起 理由
RyanBern + 100 + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
439
在线时间
38 小时
注册时间
2018-5-3
回帖
12
 楼主| 发表于 2019-1-5 20:50:09 | 显示全部楼层
灯笼菜刀王 发表于 2019-1-5 18:08
在game map 脚本里找到定义通行的方法

def passable?(x, y, d, self_event = nil)

谢谢大佬!
想问一下Game_Map 里的passable 跟 Game_Character里的passable 有什么区别,分别是判定什么的?

点评

一个是地图的通行,一个是character(包括事件和角色)的通行。你可以看一下两者都在判断些什么。  发表于 2019-1-5 20:52
回复

使用道具 举报

梦石
0
星屑
439
在线时间
38 小时
注册时间
2018-5-3
回帖
12
 楼主| 发表于 2019-1-5 22:02:09 | 显示全部楼层
张咚咚 发表于 2019-1-5 20:45
1.将下面脚本插到main之前。

2.下面脚本插入到【Game_Map】的第212行下面。

哇!太贴心了,感谢大佬!
回复

使用道具 举报

梦石
0
星屑
439
在线时间
38 小时
注册时间
2018-5-3
回帖
12
 楼主| 发表于 2019-1-7 00:03:04 | 显示全部楼层
张咚咚 发表于 2019-1-5 20:45
1.将下面脚本插到main之前。

2.下面脚本插入到【Game_Map】的第212行下面。

3楼大神提供的代码只对地图元件的通行状况生效,如果要对事件也同时生效
要在Game_Character 1的139行添加如下代码:

pass = $game_system.isPassable?(@map_id, new_x, new_y)
      return pass unless pass.nil?

passable?函数里一堆乱七八糟的判定我到现在也看不懂。
我实验结果时如果passable?(x,y,d)为true表示从这个点向d方向可通行,但反之却未必。
所以要修改 new_x, new_y 来让我进入这个点。
这个函数目前够我用了,但我觉得还是会有bug.欢迎指正吧……
回复

使用道具 举报

梦石
0
星屑
19426
在线时间
3082 小时
注册时间
2013-1-11
回帖
1207
发表于 2019-1-7 00:16:57 | 显示全部楼层
本帖最后由 张咚咚 于 2019-1-7 00:19 编辑
hotzhl3 发表于 2019-1-7 00:03
3楼大神提供的代码只对地图元件的通行状况生效,如果要对事件也同时生效
要在Game_Character 1的139行添 ...


回复的太快,解决了就好。。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部