设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1641|回复: 2
打印 上一主题 下一主题

[已经解决] 关于如何让"允许穿透"事件不能穿透指定事件

[复制链接]

Lv2.观梦者

梦石
0
星屑
841
在线时间
194 小时
注册时间
2014-1-11
帖子
31
跳转到指定楼层
1
发表于 2019-1-30 20:49:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
楼主正在做一个ARPG,
在网上借了一个事件仓库的脚本,
但不知是不是这个脚本本身的原因还是脚本冲突,
每次设置事件位置或使一个复制的事件跳跃就有几率在原地留下一个隐形的事件(什么用都没有,角色自己也可以通过,但是事件无法通过它)
为了解决这个BUG,又去找了另一个区域通行的脚本
即事件只会在指定区域内通行,再给事件加上允许穿透
本来以为就这么解决了
然后发现原来我设置了一个技能是在原地放置一个不可通行的事件,,,,,
因为很有趣不想放弃这个技能,,,,,,,,,,,
但是因为怪都可以穿透了所以他们就可以无视这个事件穿过去,,,,,,,,,
所以现在我想寻求解决的办法,希望能给一些建议,以及以下是我自己找了半天也找不到的希望能解决这一问题的有关脚本,希望能提供一些帮助
1.设置指定坐标的区域设置
如果能够做到的话配合区域通行限制的脚本可以达到我想要的效果
2.设置指定事件无法被一般“允许穿透”的事件穿透
能想到最简单暴力的脚本,,

虽然很努力想学脚本但是光看帮助看了很多次都看不懂(到函数那里就彻底懵了),但是想做自己真正想要的游戏,,只用事件实在没有办法完成(也有可能是我智商不足),,想了一天实在不知道该怎么解决,脑子乱成一团,,拜托了!
RUBY 代码复制
  1. =begin               
  2.  
  3.   事件管理器+事件复制功能
  4.  
  5.     2014/2/4   v1.2 添加复制事件保存功能
  6.     2013/12/13 v1.1 bug 修正
  7.  
  8.  
  9.   功能
  10.  
  11.   1. 优化默认脚本事件运行效率
  12.   2. 可以从其它地图复制事件;删除事件等
  13.  
  14.   使用说明
  15.  
  16.  
  17.  
  18.  
  19.   v1.2 新增      
  20.  
  21.   save_copy_events
  22.  
  23.     保存从其它地图复制过来的事件
  24.  
  25.   remove_all_copy_events
  26.     
  27.     移除该地图全部从其它地图复制过来的事件,保存的事件也删除
  28.  
  29.     
  30.     
  31.   v1.1
  32.  
  33.  
  34.   copy_map_event(map_id, event_id, x, y)
  35.  
  36.     复制特定地图的特定事件 到坐标 x y
  37.     如果 x y 坐标不填,事件就复制到原本的坐标
  38.     
  39.     例 copy_map_event(2, 1) # 复制地图2的事件1到它原本地图的坐标
  40.        copy_map_event(3, 2, 0, 0) # 复制地图3的事件2到坐标(0,0)
  41.  
  42.  
  43.   关于独立开关
  44.  
  45.     现在每个“复制事件”有各自的独立开关
  46.     “复制事件”的独立开关优先级高于“源事件”的独立开关
  47.     也就是说一旦通过“复制事件”操作独立开关,“源事件”的独立开关就不再
  48.     对“复制事件”有效了
  49.     
  50.     要开/关“源事件”的某个独立开关可以用脚本
  51.       $game_self_switch[[map_id, event_id, "A"]] = true / false
  52.  
  53.     
  54.   remove_copy_event(map_id, event_id)
  55.  
  56.     移除从特定地图复制过来的事件,如果复制了多个则全部移除
  57.     需要一个一个移除使用下面的方法
  58.     
  59.     
  60.   remove_map_event(事件id)
  61.  
  62.     移除指定id的事件
  63.     复制过来的事件id为 当前地图事件id最大值 + 1
  64.  
  65. =end
  66.  
  67. class Game_Event
  68. attr_reader\
  69. :copy_id,
  70. :map_id
  71.  
  72. attr_accessor\
  73. :copy_self_switch
  74.  
  75.   # 开始 >-------
  76.  
  77.   # 默认脚本距离屏幕比较远的事件是不会自主移动的
  78.  
  79.   # 这段脚本让全屏的事件都可以按照设置好的自身移动路线前进,如果静止的事件比较多会
  80.   # 比较省资源。如果不需要这个功能,就删除 开始 ~ 结束 之间的脚本
  81.  
  82.   def update_self_movement
  83.     if @stop_count > stop_count_threshold
  84.       case @move_type
  85.       when 1;  move_type_random
  86.       when 2;  move_type_toward_player
  87.       when 3;  move_type_custom
  88.       end
  89.     end
  90.   end
  91.  
  92.   # 结束 -------<
  93.  
  94.  
  95.   def event_copy_setup(id, x, y)
  96.     @copy_id = @id
  97.     @id = id
  98.     moveto(x, y) if x && y
  99.   end
  100.   def update #覆盖
  101.     super
  102.     check_event_trigger_auto
  103.     return unless @interpreter
  104.     @interpreter.setup(@list, @id) unless @interpreter.running? #@event.id-@id
  105.     @interpreter.update
  106.   end
  107.   def conditions_met?(page) #覆盖
  108.     c = page.condition
  109.     if c.switch1_valid
  110.       return false unless $game_switches[c.switch1_id]
  111.     end
  112.     if c.switch2_valid
  113.       return false unless $game_switches[c.switch2_id]
  114.     end
  115.     if c.variable_valid
  116.       return false if $game_variables[c.variable_id] < c.variable_value
  117.     end
  118.     if c.self_switch_valid #改了这里
  119.       return false unless @copy_self_switch ?
  120.         @copy_self_switch[c.self_switch_ch] :
  121.         $game_self_switches[[@map_id, @event.id, c.self_switch_ch]]
  122.     end
  123.     if c.item_valid
  124.       item = $data_items[c.item_id]
  125.       return false unless $game_party.has_item?(item)
  126.     end
  127.     if c.actor_valid
  128.       actor = $game_actors[c.actor_id]
  129.       return false unless $game_party.members.include?(actor)
  130.     end
  131.     return true
  132.   end
  133.   alias_method :sEventManager_init_public_members, :init_public_members
  134.   def init_public_members #覆盖
  135.     @gridding = $game_map.gridding
  136.     sEventManager_init_public_members
  137.   end
  138.   def moveto(x, y) #修改父类方法
  139.     gridding_remove
  140.     super
  141.     gridding_insert
  142.   end
  143.   def move_straight(d, turn_ok = true) #修改父类方法
  144.     gridding_remove
  145.     super
  146.     gridding_insert
  147.   end
  148.   def move_diagonal(horz, vert) #修改父类方法
  149.     gridding_remove
  150.     super
  151.     gridding_insert
  152.   end
  153.   def gridding_remove
  154.     @gridding[@x][@y].delete(self)
  155.   end
  156.   def gridding_insert
  157.     @gridding[@x][@y].push(self)
  158.   end
  159.   #
  160.   def saved_copy_load
  161.     @gridding = $game_map.gridding
  162.     gridding_insert
  163.   end
  164. end
  165.  
  166. class Game_Map
  167. attr_reader\
  168. :copy_map_events,
  169. :gridding
  170.  
  171.   def prepare_copy_event(event)
  172.     @copy_map_events ||= {}
  173.     @copy_map_events[event] = true
  174.   end
  175.   def prepare_remove_event(event)
  176.     @copy_map_events ||= {}
  177.     event.gridding_remove
  178.     @copy_map_events[event] = false
  179.   end
  180.   alias_method :sEventManager_update_events, :update_events
  181.   def update_events
  182.     sEventManager_update_events
  183.     if @copy_map_events
  184.       delete_ids = []
  185.       in_map = SceneManager.scene_is?(Scene_Map)
  186.       @copy_map_events.each {|event, copy|
  187.         if copy
  188.           @events[event.id] = event
  189.           SceneManager.scene.spriteset.add_event_sprite(event) if in_map
  190.         else
  191.           delete_ids.push(event.id)
  192.           SceneManager.scene.spriteset.remove_event_sprite(event) if in_map
  193.         end
  194.       }
  195.       delete_ids.each {|id| @events.delete(id)}
  196.       @copy_map_events = nil
  197.     end
  198.   end
  199.   alias_method :sEventManager_setup_events, :setup_events
  200.   def setup_events
  201.     @saved_copy_events ||= {}
  202.     @gridding = Array.new(width + 1) { Array.new(height + 1) {[]} }
  203.     sEventManager_setup_events
  204.     load_saved_copy_events
  205.   end
  206.   #
  207.   def refresh_tile_events #覆盖
  208.   end
  209.   def events_xy(x, y) #覆盖
  210.     @gridding[x][y]
  211.   end
  212.   def events_xy_nt(x, y) #覆盖
  213.     @gridding[x][y].select {|event| !event.through}
  214.   end
  215.   def tile_events_xy(x, y) #覆盖
  216.     @gridding[x][y].select {|event| event.tile? && !event.through}
  217.   end
  218.   def event_id_xy(x, y) #覆盖
  219.     list = events_xy(x, y)
  220.     list.empty? ? 0 : list[0].id
  221.   end
  222.   # 保存复制的事件
  223.   def save_copy_events
  224.     copy_events = []
  225.     @events.each_value {|event| copy_events.push(event) if event.copy_id}
  226.     @saved_copy_events[@map_id] = copy_events
  227.   end
  228.   # 读取保存的复制事件
  229.   def load_saved_copy_events
  230.     saved_copy_events = @saved_copy_events[@map_id]
  231.     saved_copy_events.each {|event|
  232.       event.saved_copy_load
  233.       @events[event.id] = event
  234.     } if saved_copy_events
  235.   end
  236.  
  237.  
  238.   # 移除所有复制事件
  239.   def remove_all_copy_events
  240.     @events.each_value {|event|
  241.       $game_map.prepare_remove_event(event) if event.copy_id
  242.     }
  243.     @saved_copy_events.delete @map_id
  244.   end
  245. end
  246. # 事件页脚本添加复制事件功能
  247. class Game_Interpreter
  248.   def copy_map_event(map_id, event_id, x = nil, y = nil)
  249.     map_filename = sprintf("Data/Map%03d.rvdata2", map_id)
  250.     if File.exist?(map_filename)
  251.       event = load_data(map_filename).events[event_id]
  252.       if event
  253.         event = Game_Event.new(map_id, event)
  254.         event_id = $game_map.events.keys.max + 1
  255.         event_id += $game_map.copy_map_events.size if $game_map.copy_map_events
  256.         event.event_copy_setup(event_id, x, y)
  257.         $game_map.prepare_copy_event(event)
  258.       elsif $TEST
  259.         msgbox("复制<地图#{map_id}>的<事件#{event_id}>失败,该事件不存在。")
  260.         exit
  261.       end
  262.     elsif $TEST
  263.       msgbox("从<地图#{map_id}>复制事件失败,该地图不存在。")
  264.       exit
  265.     end
  266.   end
  267.   #
  268.   def save_copy_events
  269.     $game_map.save_copy_events
  270.   end
  271.   def remove_all_copy_events
  272.     $game_map.remove_all_copy_events
  273.   end
  274.   def remove_copy_event(map_id, event_id)
  275.     $game_map.events.each_value {|event|
  276.       if event.copy_id == event_id && event.map_id == map_id
  277.         $game_map.prepare_remove_event(event)
  278.       end
  279.     }
  280.   end
  281.   def remove_map_event(event_id)
  282.     event = $game_map.events[event_id]
  283.     $game_map.prepare_remove_event(event) if event
  284.   end
  285.   #
  286.   alias_method :sEventManager_command_123, :command_123
  287.   def command_123
  288.     if @event_id > 0
  289.       event = get_character(@event_id)
  290.       event.copy_id ?
  291.         process_copy_self_switch(event) :
  292.         sEventManager_command_123
  293.     end
  294.   end
  295.   def process_copy_self_switch(event)
  296.     event.copy_self_switch ||= {}
  297.     event.copy_self_switch[@params[0]] = (@params[1] == 0)
  298.     all_off = true
  299.     event.copy_self_switch.each_value {|key| break all_off = false if key}
  300.     event.copy_self_switch = nil if all_off
  301.     $game_map.need_refresh = true
  302.   end
  303. end
  304. #
  305. # 精灵管理
  306. class Spriteset_Map
  307.   EventRadius = 1
  308.   def add_event_sprite(event)
  309.     @events_sprites[event] = nil
  310.   end
  311.   def remove_event_sprite(event)
  312.     sprite = @events_sprites.delete(event)
  313.     sprite.dispose if sprite
  314.   end
  315.   alias_method :sEventManager_create_characters, :create_characters
  316.   def create_characters
  317.     sEventManager_create_characters
  318.     setup_event_sprites
  319.   end
  320.   def setup_event_sprites
  321.     @events_sprites = {}
  322.     @character_sprites.each {|sp|
  323.       @events_sprites[sp.character] = sp if sp.character.class == Game_Event
  324.     }
  325.     @events_sprites.each_value {|sp| @character_sprites.delete(sp)}
  326.   end
  327.   alias_method :sEventManager_dispose_characters, :dispose_characters
  328.   def dispose_characters
  329.     @events_sprites.each_value {|sprite| sprite.dispose if sprite}
  330.     sEventManager_dispose_characters
  331.   end
  332.   alias_method :sEventManager_update_characters, :update_characters
  333.   def update_characters
  334.     sEventManager_update_characters
  335.     update_event_sprites
  336.   end
  337.   def update_event_sprites
  338.     ox = $game_map.display_x - EventRadius
  339.     ex = $game_map.display_x + Graphics.width / 32.0 + EventRadius - 1
  340.     oy = $game_map.display_y - EventRadius
  341.     ey = $game_map.display_y + Graphics.height / 32.0 + EventRadius - 0.875
  342.     mw = $game_map.width
  343.     mh = $game_map.height
  344.     lv = $game_map.loop_vertical?
  345.     lh = $game_map.loop_horizontal?
  346.     @events_sprites.each {|event, sprite|
  347.       x = event.real_x
  348.       y = event.real_y
  349.       if (x > ox && x < ex || lv && x + mw > ox && x + mw < ex) &&
  350.          (y > oy && y < ey || lh && y + mh > oy && y + mh < ey)
  351.         sprite ? sprite.update :
  352.           @events_sprites[event] = Sprite_Character.new(@viewport1, event)
  353.       elsif sprite
  354.         sprite.dispose
  355.         @events_sprites[event] = nil
  356.       end
  357.     }
  358.   end
  359. end
  360. class Scene_Map
  361. attr_reader :spriteset
  362. end

Lv5.捕梦者

梦石
10
星屑
39440
在线时间
1914 小时
注册时间
2010-11-14
帖子
3315

R考场第七期纪念奖

2
发表于 2019-1-30 21:31:04 | 只看该作者
本帖最后由 KB.Driver 于 2019-1-30 21:41 编辑

RUBY 代码复制
  1. class Game_CharacterBase
  2.   #--------------------------------------------------------------------------
  3.   # ● [别名修改]判定是否可以通行(检查 地图的通行度 和 前方是否有路障)
  4.   #--------------------------------------------------------------------------
  5.   alias :passable_for_unpassable :passable?
  6.   def passable?(x, y, d)
  7.     x2 = $game_map.round_x_with_direction(x, d)
  8.     y2 = $game_map.round_y_with_direction(y, d)
  9.     return false if collide_with_unpassable_events?(x2, y2)
  10.     passable_for_unpassable(x, y, d)
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # ● [追加]判定是否与"<不可穿透>"事件碰撞
  14.   #--------------------------------------------------------------------------
  15.   def collide_with_unpassable_events?(x, y)
  16.     $game_map.events_xy_nt(x, y).any?{|event| event.unpassable_event?}
  17.   end
  18. end
  19.  
  20. class Game_Event
  21.   #--------------------------------------------------------------------------
  22.   # ● [追加]是否<不可穿透>
  23.   #--------------------------------------------------------------------------
  24.   def unpassable_event?
  25.     @list.any?{|cmd| cmd.code == 108 && cmd.parameters[0].index("<不可穿透>")}
  26.   end
  27. end


新建工程测试通过,有问题请报告。
使用方法:在不想被穿透的事件中增加注释,注释里写<不可穿透>

点评

十分感谢!成功了  发表于 2019-1-30 22:45

评分

参与人数 2星屑 +50 +1 收起 理由
VIPArcher + 50 认可答案
苏达罗 + 1

查看全部评分

用头画头像,用脚写脚本
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-23 14:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表