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

Project1

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

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

[复制链接]

Lv5.捕梦者

梦石
0
星屑
37957
在线时间
5488 小时
注册时间
2006-11-10
帖子
6555
跳转到指定楼层
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, 下载次数: 214)

评分

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

查看全部评分

Lv5.捕梦者

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


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

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

回复 支持 反对

使用道具 举报

Lv5.捕梦者

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

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




范例没这个问题,

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

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

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

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37957
在线时间
5488 小时
注册时间
2006-11-10
帖子
6555
4
 楼主| 发表于 2018-12-16 20:55:10 | 显示全部楼层
更新自顶
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37957
在线时间
5488 小时
注册时间
2006-11-10
帖子
6555
5
 楼主| 发表于 2018-12-17 10:25:40 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 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个事件去挡吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-22 23:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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