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

Project1

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

[原创发布] 小插件: 任意定义事件触发范围2.1版(12,.21更新)

[复制链接]

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
跳转到指定楼层
1
发表于 2018-6-3 23:59:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 灯笼菜刀王 于 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)

评分

参与人数 5星屑 +150 +5 收起 理由
miantouchi + 1 精品文章,好玩,真好玩
RyanBern + 150 + 1 精品文章
2224573639 + 1
myaa475 + 1 认可答案
真·可乐 + 1 精品文章

查看全部评分

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
2
发表于 2018-6-4 06:24:03 | 只看该作者
这个不错,扩大了结束范围,不过我感觉肯定和我的有冲突。
可以做出及其没手感的判定……
话说有更好的解决敌人追击问题的方法了没?

点评

嗯……那判定框的事还是算了,大型角色怪物总是追着角色脚底下走还想着能不能套一个来解决判定过小的问题。  发表于 2018-6-4 11:21
那种效果你现在不是在用了? 之前的动画BUG搞定了不是么?那就可以继续用了呗。别在乱插什么东西自找麻烦了=。=  发表于 2018-6-4 10:33
那个事寻路啊?难道能寻找角色动态坐标一直追着?但是一直追着也不好,闹心,应该还是在一定范围内才开始追比较合适,追不上返回事件最初位置  发表于 2018-6-4 10:30
好像是看到过……我再看看能怎么用  发表于 2018-6-4 10:24
最好的追击脚本就是芯大的那个仿MV寻路咯,可以绕过障碍物追你到天涯海角=。=  发表于 2018-6-4 09:51
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
3
 楼主| 发表于 2018-6-4 10:47:21 | 只看该作者
本帖最后由 灯笼菜刀王 于 2018-6-4 11:06 编辑
89444640 发表于 2018-6-4 06:24
这个不错,扩大了结束范围,不过我感觉肯定和我的有冲突。
可以做出及其没手感的判定……
话说有更好的解决 ...


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

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

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2145
在线时间
235 小时
注册时间
2018-3-23
帖子
100
4
发表于 2018-6-4 12:13:13 | 只看该作者
用来做事件版本的arpg
RMXP天下第一!
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1370
在线时间
98 小时
注册时间
2018-4-12
帖子
85
5
发表于 2018-6-4 19:36:40 | 只看该作者
  首先!非常感谢lz的劳动成果.不过呢!您似乎没有考虑到事件面朝左右的情况?

  就像这样,玩家和事件上下接触时还算正常.不过一旦事件转了个弯,面朝左右时角色就可以穿透进去了...另外我设置的名字是[水母@9;9]

点评

不起名 直接 用 @9;9 也是可以的, 关键是这几个符号, 名字是附赠给你的=.=, 以后你想要用名字分歧, $game_map.events[@event_id].name 就可以得到事件的名字  发表于 2018-6-4 20:48
编程 音乐 美工...先从编程下手吧XD.
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
6
 楼主| 发表于 2018-6-4 20:14:21 | 只看该作者
本帖最后由 灯笼菜刀王 于 2018-6-4 20:16 编辑
myaa475 发表于 2018-6-4 19:36
首先!非常感谢lz的劳动成果.不过呢!您似乎没有考虑到事件面朝左右的情况?

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




范例没这个问题,

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

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

你要重复触发,就要 离开范围后(像咱范例里的, 触发后,强制角色或者事件后退离开范围), 再关闭这个开关才能重复触发. 另外,还要(没有除了并列以外的其他事件运行)
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
7
发表于 2018-6-4 20:46:43 | 只看该作者
灯笼菜刀王 发表于 2018-6-4 20:14
范例没这个问题,

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

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

话说,这个我触发后用别的开关也没事吧?比如触发事件后,发生XXXX剧情什么的?
阻拦事件弄一排真心麻烦啊

点评

可以使用,不过大行走图由于RM默认素材显示问题,需要调位置。因为是半径,图像显示判定是脚下的32*32  发表于 2018-6-19 20:00
用这个插件加大型行走图效果如何?  发表于 2018-6-19 19:33
这个脚本就属堵口最好用了。免得一堆事件,每次改我都想死一样,烛台判定什么的,不过都做完了也没必要重写一遍。  发表于 2018-6-4 21:11
那个吆喝我试过随机性太大而,文字长了特别难以阅读,停留时间长了不是短了不是,还是固定剧情后刷新的传统rpg模式吧。  发表于 2018-6-4 21:10
路过摊位听吆这个似乎不是该脚本的功能,这个要想听只能单独价格开关建立新的事件页,在进出地图时候刷新,每次进出地图路过时摊贩都吆一声  发表于 2018-6-4 21:09
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
791
在线时间
54 小时
注册时间
2018-1-1
帖子
50
8
发表于 2018-6-19 19:02:26 | 只看该作者
能不能发一个范例 谢谢!

点评

=.= 已补范例~  发表于 2018-6-19 22:33
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
43
在线时间
4 小时
注册时间
2018-9-15
帖子
3
9
发表于 2018-9-15 11:44:05 | 只看该作者
可以很强
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
10
 楼主| 发表于 2018-12-16 20:55:10 | 只看该作者
更新自顶
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 23:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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