Project1

标题: 小插件: 任意定义事件触发范围2.1版(12,.21更新) [打印本页]

作者: 灯笼菜刀王    时间: 2018-6-3 23:59
标题: 小插件: 任意定义事件触发范围2.1版(12,.21更新)
本帖最后由 灯笼菜刀王 于 2018-12-21 10:06 编辑

  emmm, 以前的版本使用不方便, 要用一个事件定义不同范围做不到, 所以推翻重来,

~~ 不过这次有改动到 game player的update, 所以冲突可能性大大增加, 会和一些常用的按键加速什么的冲突...

嘛有冲突的话,把脚本里备注"菜刀王到此一游"的部分塞到对方身体...脚本对应位置就可以了

-------------------------------------------------------------------------------------------------
2.1 更新内容
1, 因为之前只能是主角移动才会触发, 不移动被动进入范围不会触发, 增加了一个由NPC移动来判定触发的开关
2, 追加新的[视野]设置,  根据NPC朝向变化的锥形范围, 进入视野范围内触发
--------------------------------------------------------------------------------------------------
2.0 更新内容:  
1, 设置改为用注释设置, 可以用切换页面改变原本范围
2, 追加固定坐标范围触发, 可以代替需要判断坐标的并列处理
3, 优化判断方法, 确实等角色走到位再触发,(以前是一碰范围就触发)
4, 不用手动关闭重复开关了
5, 追加朝向判定
6, 追加每步触发判定
-------------------------------------------------------------------------------------------------
能用来干嘛?  省去设置用来判定坐标的并行处理咯


固定范围触发, 事件随意移动不影响


事件周围触发, 可以随着事件移动范围


范围内每一步都触发


范围内判定朝向后触发

RUBY 代码复制
  1. # 范围触发2.1 by 灯笼菜刀君 2018.12.16
  2. #
  3. # 使用方法: 事件触发条件改为"接触事件", 然后用注释写下
  4. #
  5. # [范围]起始点x,y,终点x,y,朝向(可省略),要重复触发(省略为不触发)
  6. # [范围]的触发范围为起始点到终点的圈起来的矩形,朝向写2468,省略或者0为全方向触发
  7. # 栗子: [范围]0,0,19,14,0,yes  #=> 宽20,高15的触发范围,全方向,每步触发
  8. #
  9. # [身旁]x轴距离,y轴距离,要重复触发(省略为不触发)
  10. # [身旁]的触发范围为自身为中心 x轴距离和y轴距离圈起来的矩形
  11. # 栗子: [身旁]5,5         #=> 以事件为中心,5格范围内的范围,不重复触发
  12. #
  13. # [视野]有效距离,要重复触发(省略为不触发)
  14. # [视野]的触发范围为事件面朝方向N格距离的三角形
  15. # 栗子: [视野]2,yes       #=> 视野2格范围内,重复触发
  16. # □□■□
  17. # □■■□
  18. # →■■□
  19. # □■■□
  20. # □□■□
  21. #-----------------------------------------------------------
  22. # 注意: 以上触发条件都为"主角移动",主角不移动的话进入范围也不会触发,
  23. #       需要以事件移动为刷新条件, 打开下面的开关(打开开关后,触发范围重叠的话
  24. #       可能会引起判断异常,非必要别开开关)
  25.  
  26. CAIDAO_EVENT_FANWEI = 1   #允许以事件移动来触发范围的开关ID
  27. #-----------------------------------------------------------
  28.   def 范围触发
  29.     for event in $game_map.events.values
  30.       next if event.list.nil?
  31.       for i in event.list
  32.         if i.code == 108 or i.code == 408
  33.           if i.parameters[0] =~ /[范围]/
  34.             b = i.parameters[0].gsub("[范围]", "").split(/,/)
  35.             if b.size > 3 and $game_player.x >= b[0].to_i and \
  36.             $game_player.x <= b[2].to_i and $game_player.y >= b[1].to_i and \
  37.             $game_player.y <= b[3].to_i
  38.               @触范 = [0] if b[5] != nil
  39.               if b[4] != nil and b[4] != "0"
  40.                 return [event.id] if $game_player.direction == b[4].to_i
  41.               else
  42.                 return [event.id]
  43.               end
  44.             end
  45.           end
  46.           if i.parameters[0] =~ /[身旁]/
  47.             b = i.parameters[0].gsub("[身旁]", "").split(/,/)
  48.             if b.size > 1 and ($game_player.x - event.x).abs <= b[0].to_i and \
  49.             ($game_player.y - event.y).abs <= b[1].to_i
  50.               @触范 = [0] if b[2] != nil
  51.               return [-event.id,[event.x,event.y]]
  52.             end
  53.           end
  54.           if i.parameters[0] =~ /[视野]/
  55.             b = i.parameters[0].gsub("[视野]", "").split(/,/)
  56.             if b.size > 0
  57.               @触范 = [0] if b[1] != nil
  58.               case event.direction
  59.               when 2
  60.                 if $game_player.y > event.y and \
  61.                 $game_player.y <= event.y + b[0].to_i and \
  62.                 ($game_player.y - event.y).abs >= ($game_player.x - event.x).abs
  63.                    return [-event.id,[event.x,event.y,2]]
  64.                 end
  65.               when 8
  66.                 if $game_player.y < event.y and \
  67.                 $game_player.y >= event.y - b[0].to_i and \
  68.                 ($game_player.y - event.y).abs >= ($game_player.x - event.x).abs
  69.                    return [-event.id,[event.x,event.y,8]]
  70.                 end
  71.               when 4
  72.                 if $game_player.x < event.x and \
  73.                 $game_player.x >= event.x - b[0].to_i and \
  74.                 ($game_player.y - event.y).abs <= ($game_player.x - event.x).abs
  75.                    return [-event.id,[event.x,event.y,4]]
  76.                 end
  77.               when 6
  78.                 if $game_player.x > event.x and \
  79.                 $game_player.x <= event.x + b[0].to_i and \
  80.                 ($game_player.y - event.y).abs <= ($game_player.x - event.x).abs
  81.                    return [-event.id,[event.x,event.y,6]]
  82.                 end
  83.               end
  84.             end
  85.           end
  86.         end
  87.       end
  88.     end
  89.     return [0]
  90.   end
  91.  
  92. class Game_Player < Game_Character
  93.   def initialize
  94.     super()
  95.     @触范 = [0]
  96.   end
  97.  
  98.   def update
  99.     # 本地变量记录移动信息
  100.     last_moving = moving?
  101.     # 移动中、事件执行中、强制移动路线中、
  102.     # 信息窗口一个也不显示的时候
  103.     f = @触范 #菜刀王到此一游
  104.     unless moving? or $game_system.map_interpreter.running?
  105.            @move_route_forcing or $game_temp.message_window_showing
  106.       # 如果方向键被按下、主角就朝那个方向移动
  107.       case Input.dir4
  108.       when 2
  109.         move_down
  110.         f = 范围触发 #菜刀王到此一游
  111.       when 4
  112.         move_left
  113.         f = 范围触发 #菜刀王到此一游
  114.       when 6
  115.         move_right
  116.         f = 范围触发 #菜刀王到此一游
  117.       when 8
  118.         move_up
  119.         f = 范围触发 #菜刀王到此一游
  120.       end
  121.     end
  122.     # 本地变量记忆坐标
  123.     last_real_x = @real_x
  124.     last_real_y = @real_y
  125.     super
  126.     # 角色向下移动、画面上的位置在中央下方的情况下
  127.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  128.       # 画面向下卷动
  129.       $game_map.scroll_down(@real_y - last_real_y)
  130.     end
  131.     # 角色向左移动、画面上的位置在中央左方的情况下
  132.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  133.       # 画面向左卷动
  134.       $game_map.scroll_left(last_real_x - @real_x)
  135.     end
  136.     # 角色向右移动、画面上的位置在中央右方的情况下
  137.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  138.       # 画面向右卷动
  139.       $game_map.scroll_right(@real_x - last_real_x)
  140.     end
  141.     # 角色向上移动、画面上的位置在中央上方的情况下
  142.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  143.       # 画面向上卷动
  144.       $game_map.scroll_up(last_real_y - @real_y)
  145.     end
  146.     #-菜刀王到此一游----------------------------------------------
  147.     if @触范[0] != f[0] or (f[0] < 0 and @触范[1] != f[1])
  148.       if f[0] == 0
  149.         @触范 = f
  150.       else
  151.         event = $game_map.events[f[0].abs]
  152.         if event != nil and event.trigger == 1 and !event.jumping?
  153.           event.start
  154.           @触范 = f
  155.           return
  156.         end
  157.       end
  158.     end
  159.  
  160.     #-------------------------------------------------------------
  161.     # 不在移动中的情况下
  162.     unless moving?
  163.       # 上次主角移动中的情况
  164.       if last_moving
  165.         # 与同位置的事件接触就判定为事件启动
  166.         result = check_event_trigger_here([1,2])
  167.         # 没有可以启动的事件的情况下
  168.         if result == false
  169.           # 调试模式为 ON 并且按下 CTRL 键的情况下除外
  170.           unless $DEBUG and Input.press?(Input::CTRL)
  171.             # 遇敌计数下降
  172.             if @encounter_count > 0
  173.               @encounter_count -= 1
  174.             end
  175.           end
  176.         end
  177.       end
  178.       # 按下 C 键的情况下
  179.       if Input.trigger?(Input::C)
  180.         # 判定为同位置以及正面的事件启动
  181.         check_event_trigger_here([0])
  182.         check_event_trigger_there([0,1,2])
  183.       end
  184.     end
  185.   end
  186. end
  187.  
  188. class Game_Event < Game_Character
  189.   alias oxox_initialize initialize
  190.   def initialize(map_id, event)
  191.     oxox_initialize(map_id,event)
  192.     @范触 = []
  193.   end
  194.   alias oxox_check_event_trigger_auto check_event_trigger_auto
  195.   def check_event_trigger_auto
  196.     oxox_check_event_trigger_auto
  197.     if @trigger == 1 and $game_switches[CAIDAO_EVENT_FANWEI]
  198.       f = 范围触发
  199.       if f[0] == -@id and @范触 != f[1]
  200.         start
  201.         @范触 = f[1]
  202.       end
  203.     end
  204.   end
  205. end


饭粒一个
范围触发2.1.rar (191.92 KB, 下载次数: 215)
作者: 89444640    时间: 2018-6-4 06:24
这个不错,扩大了结束范围,不过我感觉肯定和我的有冲突。
可以做出及其没手感的判定……
话说有更好的解决敌人追击问题的方法了没?
作者: 灯笼菜刀王    时间: 2018-6-4 10:47
本帖最后由 灯笼菜刀王 于 2018-6-4 11:06 编辑
89444640 发表于 2018-6-4 06:24
这个不错,扩大了结束范围,不过我感觉肯定和我的有冲突。
可以做出及其没手感的判定……
话说有更好的解决 ...


其实咱也都不知道这个脚本能用来干嘛,一般情况下需要这种效果完全可以用并行处理搞定,能用默认解决的事就用默认解决,乃最绿色环保的手段,不怕在什么奇怪的地方给你抽风~ 这个是咱入脚本坑以后得到的最大教训,没有之一。

估计也就是像那位一样的用途,用来做 大型BOSS的简陋碰撞判定,省得一个一个设置并行事件吧


作者: xp兔子徒弟    时间: 2018-6-4 12:13
用来做事件版本的arpg
作者: myaa475    时间: 2018-6-4 19:36
  首先!非常感谢lz的劳动成果.不过呢!您似乎没有考虑到事件面朝左右的情况?

  就像这样,玩家和事件上下接触时还算正常.不过一旦事件转了个弯,面朝左右时角色就可以穿透进去了...另外我设置的名字是[水母@9;9]
作者: 灯笼菜刀王    时间: 2018-6-4 20:14
本帖最后由 灯笼菜刀王 于 2018-6-4 20:16 编辑
myaa475 发表于 2018-6-4 19:36
首先!非常感谢lz的劳动成果.不过呢!您似乎没有考虑到事件面朝左右的情况?

  就像这样,玩家和事件上下接 ...




范例没这个问题,

原本脚本没有朝向判定,你用PP去碰范围也一样会触发

不能重复触发的话, 最大的问题就是你开关没关上,  (默认5号开关)只要碰过一次, 开关就自动打开了, 然后范围就无效了, 这样是为了避免重复触发事件

你要重复触发,就要 离开范围后(像咱范例里的, 触发后,强制角色或者事件后退离开范围), 再关闭这个开关才能重复触发. 另外,还要(没有除了并列以外的其他事件运行)
作者: 89444640    时间: 2018-6-4 20:46
灯笼菜刀王 发表于 2018-6-4 20:14
范例没这个问题,

原本脚本没有朝向判定,你用PP去碰范围也一样会触发

我试了一下,居然跟我脚本堆没冲突……
拿来挡路用。

话说,这个我触发后用别的开关也没事吧?比如触发事件后,发生XXXX剧情什么的?
阻拦事件弄一排真心麻烦啊
作者: 2224573639    时间: 2018-6-19 19:02
能不能发一个范例 谢谢!
作者: 星梦刀    时间: 2018-9-15 11:44
可以很强
作者: 灯笼菜刀王    时间: 2018-12-16 20:55
更新自顶
作者: 89444640    时间: 2018-12-17 06:49
本帖最后由 89444640 于 2018-12-17 08:14 编辑
灯笼菜刀王 发表于 2018-12-16 20:55
更新自顶


第一个好像是范围挖宝?

第二个,事件周围触发, 可以随着事件移动范围
是不是可以做出act那段的攻击判定范围,是角色y坐标+32*4
就是这样


不是角色靠近npc,npc后退
而是npc靠近角色一定范围,就触发事件,act这里视觉上就是判定角色被击中了。播放受伤动画减少HP,至于击退……似乎也可以吧?因为受创硬直,一段时间不能继续操作角色移动,播放受创动画,直接掉落到地面或者不能通行的范围,不过rm击落中没法实现切换图像?所以只能一落到底。


第三个高级挡路ORZ,外加范围侦测,这回NPC欠揍程度更高了,我当前是只能做多个npc在挡路
话说npc横向移动没有动作啊……是不是只能面向角色移动才能持续触发?目前看对应事件的挡路过程
这样的话,如果想视觉上没问题,需要做对应npc横向移动的行走图,然后移动时动画,这样就能看到螃蟹步了。
不知道测试没测试过斜角,回头我过去慢慢试。
范围侦测的话,来算个锥形视野不? 贴上对应的手电筒光效,然后小幅度晃动侦测,然后玩盟军敢死队模式XD
最后一个,是不是把我ACT贴墙角循环切换的问题解决了?

最后……所有范围切换事件又得重写ORZ,我时间都是这么糟蹋的ORZ,论算法对节约人生的重要性XD
我还是出去逛逛街吧…

npc后退这个,版边卡死怎么处理?

这个可是四边到头的地图,实际地图比这个复杂很多。
应该让后退一步忽略不能移动场合?

另外你定义了这个斜角伪八方移动都失效了。
      case Input.dir4
      when 2
        move_down
        f = 范围触发 #菜刀王到此一游
      when 4
        move_left
        f = 范围触发 #菜刀王到此一游
      when 6
        move_right
        f = 范围触发 #菜刀王到此一游
      when 8
        move_up
        f = 范围触发 #菜刀王到此一游
      end
    end
但是我改成了这样以后
    case Input.dir8
      when 2
        move_down
        f = 范围触发
      when 4
        move_left
        f = 范围触发
      when 6
        move_right
        f = 范围触发
      when 8
        move_up
        f = 范围触发
      when 1
        move_lower_left
        f = 范围触发
      when 3
        move_lower_right
        f = 范围触发
      when 7  
        move_upper_left
        f = 范围触发
      when 9
        move_upper_right
        f = 范围触发
      end
    end
别的触发依然生效,固定点踩花没事,靠近回后退的npc,可以找好切入角度,绕到对方背后,从而卡死,

四个斜角的阻挡就是大问题了。

不用伪八方移动是不可能的,所以这个怎么处理一下?
作者: 灯笼菜刀王    时间: 2018-12-17 10:25
本帖最后由 灯笼菜刀王 于 2018-12-17 11:23 编辑

其实也就两种判定, [范围]是固定范围判定, 就和并列处理, 判定主角X和Y到某一地方后执行事件的用法一样, 以主角移动来刷新
[身旁]是事件范围判定, 就是之前的那个版本功能, 可以用来做简陋的ARPG判定, 除了主角移动来刷新外,事件移动也一样会刷新

第一种是: 触发一次后,在范围内都不会再次触发. 用来做些进入某地方后NPC警告, 吆喝什么的吧

第二种确实可以用来做中弹判定,  飞行道具事件设置为 [身旁]0,4 这样主角在它的y+4-4 范围内都可以触发, 然后触发后进行动作分歧判断就好了, 像主角Y小于它的Y, 那就是在脚底下=跳过去了 , 然后主角Y比它多2,同时动作判定是下蹲, 也是躲过去, 剩下的情况下中弹处理, 要击退就"移动路线, 后退"

第三种和第一种一样, 是固定范围触发(区别是每步都触发), 因为这个触发和事件位置无关, 所以可以这样玩, 要NPC有走路动作的话判定主角x小于自己向左移动, 大于自己向右移动, 然后循环, 满足x=0为止, 范例是 偷懒直接用移动事件移动到主角的X坐标上

想范围随着事件移动,要用第二种设置

至于NPC怎么移动不会卡死, 自然就按自己的地图该转向转向,该瞬移的瞬移咯,笑, 咱这个又不是自动寻路, 自己手动寻路吧

斜向移到背后去卡, 可以不用主角朝向判定而是用实际坐标判定就卡不住了

最后,斜角通行, 每次前进都有3个方向的选择, 1个事件肯定是挡不了的, 上3个事件去挡吧
作者: 如企鹅一样纯真    时间: 2020-9-2 23:43
这。。太有用了!!!话说还是呢个右下角小人的问题,鸡追到我身边后,小人就判定不准确了,我就可以溜过去了。
作者: 金芒芒    时间: 2022-11-15 13:39
本帖最后由 金芒芒 于 2022-11-15 13:42 编辑
灯笼菜刀王 发表于 2018-6-4 10:47
其实咱也都不知道这个脚本能用来干嘛,一般情况下需要这种效果完全可以用并行处理搞定,能用默 ...


这个脚本做血液动态图恰到好处https://rpg.blue/thread-491333-1-1.html




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1