Project1

标题: Leyeshot2.1线形视野系统,做暗杀类游戏的葵花宝典! [打印本页]

作者: 流川枫    时间: 2008-11-3 13:20
标题: Leyeshot2.1线形视野系统,做暗杀类游戏的葵花宝典!

  1. #==============================================================================
  2. # ■ LCF_Leyeshot (linetype eyeshot)XP 2.1    Creator LCF  Date 2008.11.3
  3. #------------------------------------------------------------------------------
  4. #  线形视野系统    编者:流川枫    QQ:350773875
  5. #==============================================================================
  6. #【使用说明】
  7. #------------------------------------------------------------------------------
  8. # 视野系统开关    $game_map.events[@event_id].le_seeing = true/false
  9. # 功能:该值为true表示该NPC视野开启,否则未开启,默认为false。
  10. #------------------------------------------------------------------------------
  11. # 视野透视开关    $game_map.events[@event_id].le_clairv = true/false
  12. # 功能:该值为true表示该NPC视野不扫描视线障碍,否则扫描,默认为false。
  13. #------------------------------------------------------------------------------
  14. # 视线显示开关    $game_map.events[@event_id].le_show = true/false
  15. # 功能:该值为true表示显示该NPC的视线,否则不显示,默认为false。
  16. #------------------------------------------------------------------------------
  17. # 侧面可视开关    $game_map.events[@event_id].le_side = true/false
  18. # 功能:该值为true表示该NPC可以看到侧面一格内的人,否则由斜率决定,默认为true。
  19. #------------------------------------------------------------------------------
  20. # 视野环绕开关    $game_map.events[@event_id].le_circle = true/false
  21. # 功能:该值为true表示该NPC为环绕视野,否则不能看见自己的身后,默认为false。
  22. #------------------------------------------------------------------------------
  23. # 设置视野深度    $game_map.events[@event_id].le_deepness = 深度值
  24. # 功能:该值代表视野的能见度,默认为7。
  25. #------------------------------------------------------------------------------
  26. # 设置视野斜率    $game_map.events[@event_id].le_slope = 斜率值
  27. # 功能:该值代表视野的斜率,默认为1.0。
  28. #------------------------------------------------------------------------------
  29. # 设置显示颜色    $game_map.events[@event_id].le_color = 颜色值
  30. # 功能:该值代表视线显示的颜色,默认为0xf0。
  31. #==============================================================================
  32. # 当NPC看到主角的时候,独立开关D会被打开,否则为关闭状态。
  33. #==============================================================================

  34. #==============================================================================
  35. # ■ Game_Event
  36. #------------------------------------------------------------------------------
  37. #  重载事件类
  38. #==============================================================================
  39. class Game_Event
  40.   attr_accessor   :le_seeing                 # 视野系统开关
  41.   attr_accessor   :le_clairv                 # 视野透视开关
  42.   attr_accessor   :le_show                   # 视线显示开关
  43.   attr_accessor   :le_side                   # 侧面可视开关
  44.   attr_accessor   :le_circle                 # 视野环绕开关
  45.   attr_accessor   :le_deepness               # 视野深度
  46.   attr_accessor   :le_slope                  # 视野斜率
  47.   attr_accessor   :le_color                  # 显示颜色
  48.   #--------------------------------------------------------------------------
  49.   # ● 初始化对像
  50.   #     map_id : 地图 ID
  51.   #     event  : 事件 (RPG::Event)
  52.   #--------------------------------------------------------------------------
  53.   alias original_initialize initialize
  54.   def initialize (map_id, event)
  55.     original_initialize (map_id, event)
  56.     @le_seeing   = false
  57.     @le_clairv   = false
  58.     @le_show     = false
  59.     @le_side     = true
  60.     @le_circle   = false
  61.     @le_deepness = 7
  62.     @le_slope    = 1.0
  63.     @le_color    = 0xf0
  64.     @trace = Table.new (@le_deepness,2)
  65.     @trace[0,0] = -1
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 刷新
  69.   #--------------------------------------------------------------------------
  70.   alias original_update update
  71.   def update
  72.     if @le_seeing
  73.       @trace.resize (@le_deepness,2) if @trace.xsize != @le_deepness
  74.       original_switch = $game_self_switches[[$game_map.map_id, @id, "D"]]
  75.       self.see
  76.       $game_map.need_refresh = true if original_switch != $game_self_switches[[$game_map.map_id, @id, "D"]]
  77.     end
  78.     original_update
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # ● 视野检测
  82.   #--------------------------------------------------------------------------
  83.   def see
  84.     $game_self_switches[[$game_map.map_id, @id, "D"]] = false
  85.     if ($game_player.x-@x).abs<@le_deepness and ($game_player.y-@y).abs<@le_deepness
  86.       difference_x = $game_player.x - @x
  87.       difference_y = $game_player.y - @y
  88.       case @direction
  89.       when 2
  90.         return if @le_circle != true and $game_player.y < @y
  91.         unless @le_side and (difference_y == 0 and difference_x.abs == 1)
  92.           return if (difference_y/(difference_x+0.0)).abs < @le_slope
  93.         end
  94.       when 4
  95.         return if @le_circle != true and $game_player.x > @x
  96.         unless @le_side and difference_y.abs == 1 and difference_x == 0
  97.           return if (difference_x/(difference_y+0.0)).abs < @le_slope
  98.         end
  99.       when 6
  100.         return if @le_circle != true and $game_player.x < @x
  101.         unless @le_side and difference_y.abs == 1 and difference_x == 0
  102.           return if (difference_x/(difference_y+0.0)).abs < @le_slope
  103.         end
  104.       else
  105.         return if @le_circle != true and $game_player.y > @y
  106.         unless @le_side and difference_y == 0 and difference_x.abs == 1
  107.           return if (difference_y/(difference_x+0.0)).abs < @le_slope
  108.         end
  109.       end
  110.       $game_self_switches[[$game_map.map_id, @id, "D"]] = scan_line
  111.     end
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ● 视线检测
  115.   #--------------------------------------------------------------------------
  116.   def scan_line
  117.     difference_x = $game_player.x - @x
  118.     difference_y = $game_player.y - @y
  119.     direction_x = (difference_x > 0 ? 1 : -1)
  120.     direction_y = (difference_y > 0 ? 1 : -1)
  121.     i = 0
  122.     if difference_x.abs > difference_y.abs
  123.       while difference_x.abs > i+1
  124.         i+=1
  125.         x = @x+i*direction_x
  126.         if direction_y>0
  127.           y = @y+i*difference_y/(difference_x+0.0)*direction_y*direction_x+0.5
  128.         else
  129.           y = @y-i*difference_y/(difference_x+0.0)*direction_y*direction_x+0.5
  130.         end
  131.         x = x.floor
  132.         y = y.floor
  133.         if @le_clairv != true
  134.           unless (direction_x > 0 ? passable?(x-1,y,6) : passable?(x+1,y,4))
  135.             @trace[i-1,0] = -1
  136.             return false
  137.           end
  138.         end
  139.         if @le_show
  140.           @trace[i-1,0] = x
  141.           @trace[i-1,1] = y
  142.           $scene.spriteset.tilemap.flash_data[x,y] = @le_color
  143.         end
  144.       end
  145.     else
  146.       while difference_y.abs > i+1
  147.         i+=1
  148.         y = @y+i*direction_y
  149.         if direction_x>0
  150.           x = @x+i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  151.         else
  152.           x = @x-i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  153.         end
  154.         x = x.floor
  155.         y = y.floor
  156.         if @le_clairv != true
  157.           unless (direction_y > 0 ? passable?(x,y-1,2) : passable?(x,y+1,8))
  158.             @trace[i-1,0] = -1
  159.             return false
  160.           end
  161.         end
  162.         if @le_show
  163.           @trace[i-1,0] = x
  164.           @trace[i-1,1] = y
  165.           $scene.spriteset.tilemap.flash_data[x,y] = @le_color
  166.         end
  167.       end
  168.     end
  169.     return true
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ● 清楚痕迹
  173.   #--------------------------------------------------------------------------
  174.   def clear
  175.     for i in 0 .. @trace.xsize-1
  176.       break if @trace[i,0] == -1
  177.       $scene.spriteset.tilemap.flash_data[@trace[i,0],@trace[i,1]] = 0
  178.     end
  179.     @trace[0,0] = -1
  180.   end
  181. end
  182. #==============================================================================
  183. # ■ Spriteset_Map
  184. #------------------------------------------------------------------------------
  185. #    重载地图显示
  186. #==============================================================================
  187. class Spriteset_Map
  188.   attr_reader:tilemap
  189.   alias :original_ini :initialize
  190.   def initialize
  191.     original_ini
  192.     @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)
  193.   end  
  194. end
  195. #==============================================================================
  196. # ■ Scene_Map
  197. #------------------------------------------------------------------------------
  198. #    重载地图场景
  199. #==============================================================================
  200. class Scene_Map
  201.   attr_reader:spriteset
  202. end
  203. #==============================================================================
  204. # ■ Game_Map
  205. #------------------------------------------------------------------------------
  206. #  重载地图类
  207. #==============================================================================
  208. class Game_Map
  209.   alias original_update update
  210.   def update
  211.     # 清除视线痕迹
  212.     for event in @events.values
  213.       event.clear
  214.     end
  215.     original_update
  216.   end
  217. end
复制代码



-------------------------------
范例下载:
ftp://[email protected]/game ... �统范例v2.10.rar
-------------------------------

LE2.1优化了视线痕迹清除的程序,这样一来地图不管有多大,都不会影响到效率了!

{/cy}
本次系统的革新已经完全打破了传统的束缚!
和过去的RE系统比起来,全新的LE视野系统简直太好太强大了!
同屏这么多人联动,但是FPS仍然这么流畅~~
最棒的是,虽然效率如此之高,但是却一点都
没有影响 视野障碍检测 的精确度!
之所以这个视野系统能够这么强大,正是因
为该系统采用了国际领先的视线扫描算法!
全程只需要扫描一条 NPC与主角相连 的视线
即可,因此效率和视野逻辑都是最好的!

原来的RE算法我已经完全推翻了,现在的LE是一种新的算法,
所以我又开了一个新帖。

截图:



复制全部脚本内容,在Main脚本之前按insert,插入此脚本全部内容。请详见脚本里的使用说明和范例。
脚本冲突:一些地图类。其实可能性比较小。

作者: 塑望    时间: 2008-11-3 23:14
{/gg}{/gg}

不知道怎么说了。。。。。很好
作者: Sora    时间: 2008-11-4 00:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: 流川枫    时间: 2008-11-4 01:07
以下引用Sora于2008-11-3 16:44:27的发言:

怎么让NPC攻击视野范围内的目标啊

当NPC看到主角的时候,独立开关D会被打开。
你可以设置一个事件层,当独立开关D打开的时候,
就代表看的了主角,你在里面写上看到主角后的 指令就行了。
例如:触发 战斗{/cy}
作者: CortesDevil    时间: 2008-11-4 01:39
{/hx}研究研究
作者: 流川枫    时间: 2008-11-4 05:38
范例中有一个人在房间里巡逻,玩家必须神不知鬼不觉地走到那人身后(包括侧面),然后马上按确定键,就表示这次偷袭成功了。
放到成品的游戏里,可以在那个时候显示一段动画,干掉那个人,就变成了一款有趣的忍者暗杀游戏了。{/cy}
作者: 纯子    时间: 2008-11-4 17:40
{/se}{/dk}范例貌似不能下啊
作者: 水迭澜    时间: 2008-11-4 18:12
速度是关键~~
原本FDR大人也写过一个
但是那个速度太慢太慢了
这个视野系统目前有几格?
如果是30x30的地图,放20个事件,会卡吗?
作者: 流川枫    时间: 2008-11-5 00:07
以下引用水迭澜于2008-11-4 10:12:48的发言:

速度是关键~~
原本FDR大人也写过一个
但是那个速度太慢太慢了
这个视野系统目前有几格?
如果是30x30的地图,放20个事件,会卡吗?


[本贴由作者于 2008-11-4 10:13:10 最后编辑]

我刚才测试了一下 LE2.1,地图大小在500*500 并且NPC 20人的情况下,
FPS平均率仍然保持在40左右。{/hx}
作者: 水蓝    时间: 2008-11-5 02:58
提示: 作者被禁止或删除 内容自动屏蔽
作者: 做游戏的新手    时间: 2008-11-5 03:59
那啥啥,LZ为什么一打开是一片空白{/hx}
作者: 流川枫    时间: 2008-11-5 04:05
以下引用水蓝于2008-11-4 18:58:26的发言:


以下引用流川枫于2008-11-3 5:20:06的发言:

之所以这个视野系统能够这么强大,正是因
为该系统采用了国际领先的视线扫描算法!



这是什么算法,我懒得看脚本,LZ能否能大概讲一下思路


思路就是  全程只需要扫描一条 NPC与主角相连 的视线
即可,因此效率和视野逻辑都是最好的!
作者: 流川枫    时间: 2008-11-5 04:06
以下引用做游戏的新手于2008-11-4 19:59:01的发言:

那啥啥,LZ为什么一打开是一片空白

刚才忘了把游戏RTP选项设置为 标准了。{/tp}
已经重新上传
作者: 八云紫    时间: 2008-11-5 04:12
请在顶楼详细说明脚本的使用方法, 这样 我好发布。谢谢~
作者: 水蓝    时间: 2008-11-5 04:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 流川枫    时间: 2008-11-5 04:17
以下引用八云紫于2008-11-4 20:12:29的发言:

请在顶楼详细说明脚本的使用方法, 这样 我好发布。谢谢~

不用谢,脚本里已经写了使用说明哈。{/cy}

以下引用水蓝于2008-11-4 20:17:02的发言:


以下引用流川枫于2008-11-4 20:05:02的发言:


以下引用水蓝于2008-11-4 18:58:26的发言:


以下引用流川枫于2008-11-3 5:20:06的发言:

之所以这个视野系统能够这么强大,正是因
为该系统采用了国际领先的视线扫描算法!



这是什么算法,我懒得看脚本,LZ能否能大概讲一下思路



思路就是  全程只需要扫描一条 NPC与主角相连 的视线
即可,因此效率和视野逻辑都是最好的!



能否再详细一点,不懂 = =


再详细一点,那就直接看代码吧{/wx}
作者: 水蓝    时间: 2008-11-5 04:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: 流川枫    时间: 2008-11-5 05:09
以下引用水蓝于2008-11-4 20:20:17的发言:

为了看LZ的效果,咱去装RM = =

另外请LZ上传到附件,FTP下载好慢

加我QQ,我直接发给你 完整版。(可以脱离RM环境的)
作者: 美兽    时间: 2008-11-5 18:43
根据边长决定范围,与三角碰撞差不多。
作者: 流川枫    时间: 2008-11-6 00:17
以下引用美兽于2008-11-5 10:43:07的发言:

根据边长决定范围,与三角碰撞差不多。

斜率(>0) 和 深度(>0) 两个合起来就形成了一个 三角形。
当主角在这个视野范围内,就进行视线扫描。
最终将信息反映给NPC。
作者: Sora    时间: 2008-11-6 02:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: 流川枫    时间: 2008-11-6 05:10
以下引用Sora于2008-11-5 18:54:01的发言:

我提个意见可以么
不知道是我不会用,还是确实存在这个缺陷
我设置一个事件,在D开关打开时,移动方式变成靠近主角,然后是与主角接触时战斗处理,模拟当NPC看见主角时,过去与之战斗
我遇到的问题是,比如当主角在事件左下方时,刚好进入事件视野,按4方向行走,NPC要靠近主角,就会往左走,当事件面一朝左,主角就不在视野内了,NPC就不动了……

这是设计上的 流程 问题。
正确的流程如下:

(第一种方案)在看到主角的 事件层里 关闭 可视开关,这样 独立开关D 就不会被关闭。你就可以 靠近主角,直到接触主角,触发战斗等。

(第二种方案)在看到主角的 事件层里 打开另一个独立开关B,当 独立开关D又被关上的时候,由于开了独立开关B,所以由 另外一个事件层 来处理 看见主角后又再次看不见主角时 的程序。

作者: Sora    时间: 2008-11-6 17:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: 178818872    时间: 2008-11-8 00:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: 流川枫    时间: 2008-11-8 02:15
以下引用178818872于2008-11-7 16:54:20的发言:


?????
作者: 流川枫    时间: 2008-11-8 07:18

  1. #==============================================================================
  2. # ■ LCF_Leyeshot (linetype eyeshot)VX 2.1    Creator LCF  Date 2008.11.3
  3. #------------------------------------------------------------------------------
  4. #  线形视野系统    编者:流川枫    QQ:350773875
  5. #==============================================================================
  6. #【使用说明】
  7. #------------------------------------------------------------------------------
  8. # 视野系统开关    $game_map.events[@event_id].le_seeing = true/false
  9. # 功能:该值为true表示该NPC视野开启,否则未开启,默认为false。
  10. #------------------------------------------------------------------------------
  11. # 视野透视开关    $game_map.events[@event_id].le_clairv = true/false
  12. # 功能:该值为true表示该NPC视野不扫描视线障碍,否则扫描,默认为false。
  13. #------------------------------------------------------------------------------
  14. # 视线显示开关    $game_map.events[@event_id].le_show = true/false
  15. # 功能:该值为true表示显示该NPC的视线,否则不显示,默认为false。
  16. #------------------------------------------------------------------------------
  17. # 侧面可视开关    $game_map.events[@event_id].le_side = true/false
  18. # 功能:该值为true表示该NPC可以看到侧面一格内的人,否则由斜率决定,默认为true。
  19. #------------------------------------------------------------------------------
  20. # 视野环绕开关    $game_map.events[@event_id].le_circle = true/false
  21. # 功能:该值为true表示该NPC为环绕视野,否则不能看见自己的身后,默认为false。
  22. #------------------------------------------------------------------------------
  23. # 设置视野深度    $game_map.events[@event_id].le_deepness = 深度值
  24. # 功能:该值代表视野的能见度,默认为7。
  25. #------------------------------------------------------------------------------
  26. # 设置视野斜率    $game_map.events[@event_id].le_slope = 斜率值
  27. # 功能:该值代表视野的斜率,默认为1.0。
  28. #------------------------------------------------------------------------------
  29. # 设置显示颜色    $game_map.events[@event_id].le_color = 颜色值
  30. # 功能:该值代表视线显示的颜色,默认为0xf0。
  31. #==============================================================================
  32. # 当NPC看到主角的时候,独立开关D会被打开,否则为关闭状态。
  33. #==============================================================================

  34. #==============================================================================
  35. # ■ Game_Event
  36. #------------------------------------------------------------------------------
  37. #  重载事件类
  38. #==============================================================================
  39. class Game_Event
  40.   attr_accessor   :le_seeing                 # 视野系统开关
  41.   attr_accessor   :le_clairv                 # 视野透视开关
  42.   attr_accessor   :le_show                   # 视线显示开关
  43.   attr_accessor   :le_side                   # 侧面可视开关
  44.   attr_accessor   :le_circle                 # 视野环绕开关
  45.   attr_accessor   :le_deepness               # 视野深度
  46.   attr_accessor   :le_slope                  # 视野斜率
  47.   attr_accessor   :le_color                  # 显示颜色
  48.   #--------------------------------------------------------------------------
  49.   # ● 初始化对像
  50.   #     map_id : 地图 ID
  51.   #     event  : 事件 (RPG::Event)
  52.   #--------------------------------------------------------------------------
  53.   alias original_initialize initialize
  54.   def initialize (map_id, event)
  55.     original_initialize (map_id, event)
  56.     @le_seeing   = false
  57.     @le_clairv   = false
  58.     @le_show     = false
  59.     @le_side     = true
  60.     @le_circle   = false
  61.     @le_deepness = 7
  62.     @le_slope    = 1.0
  63.     @le_color    = 0xf0
  64.     @trace = Table.new (@le_deepness,2)
  65.     @trace[0,0] = -1
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 刷新
  69.   #--------------------------------------------------------------------------
  70.   alias original_update update
  71.   def update
  72.     if @le_seeing
  73.       @trace.resize (@le_deepness,2) if @trace.xsize != @le_deepness
  74.       original_switch = $game_self_switches[[$game_map.map_id, @id, "D"]]
  75.       self.see
  76.       $game_map.need_refresh = true if original_switch != $game_self_switches[[$game_map.map_id, @id, "D"]]
  77.     end
  78.     original_update
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # ● 视野检测
  82.   #--------------------------------------------------------------------------
  83.   def see
  84.     $game_self_switches[[$game_map.map_id, @id, "D"]] = false
  85.     if ($game_player.x-@x).abs<@le_deepness and ($game_player.y-@y).abs<@le_deepness
  86.       difference_x = $game_player.x - @x
  87.       difference_y = $game_player.y - @y
  88.       case @direction
  89.       when 2
  90.         return if @le_circle != true and $game_player.y < @y
  91.         unless @le_side and (difference_y == 0 and difference_x.abs == 1)
  92.           return if (difference_y/(difference_x+0.0)).abs < @le_slope
  93.         end
  94.       when 4
  95.         return if @le_circle != true and $game_player.x > @x
  96.         unless @le_side and difference_y.abs == 1 and difference_x == 0
  97.           return if (difference_x/(difference_y+0.0)).abs < @le_slope
  98.         end
  99.       when 6
  100.         return if @le_circle != true and $game_player.x < @x
  101.         unless @le_side and difference_y.abs == 1 and difference_x == 0
  102.           return if (difference_x/(difference_y+0.0)).abs < @le_slope
  103.         end
  104.       else
  105.         return if @le_circle != true and $game_player.y > @y
  106.         unless @le_side and difference_y == 0 and difference_x.abs == 1
  107.           return if (difference_y/(difference_x+0.0)).abs < @le_slope
  108.         end
  109.       end
  110.       $game_self_switches[[$game_map.map_id, @id, "D"]] = scan_line
  111.     end
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ● 视线检测
  115.   #--------------------------------------------------------------------------
  116.   def scan_line
  117.     difference_x = $game_player.x - @x
  118.     difference_y = $game_player.y - @y
  119.     direction_x = (difference_x > 0 ? 1 : -1)
  120.     direction_y = (difference_y > 0 ? 1 : -1)
  121.     i = 0
  122.     if difference_x.abs > difference_y.abs
  123.       while difference_x.abs > i+1
  124.         i+=1
  125.         x = @x+i*direction_x
  126.         if direction_y>0
  127.           y = @y+i*difference_y/(difference_x+0.0)*direction_y*direction_x+0.5
  128.         else
  129.           y = @y-i*difference_y/(difference_x+0.0)*direction_y*direction_x+0.5
  130.         end
  131.         x = x.floor
  132.         y = y.floor
  133.         if @le_clairv != true
  134.           unless (direction_x > 0 ? map_passable?(x,y) : map_passable?(x,y))
  135.             @trace[i-1,0] = -1
  136.             return false
  137.           end
  138.         end
  139.         if @le_show
  140.           @trace[i-1,0] = x
  141.           @trace[i-1,1] = y
  142.           $scene.spriteset.tilemap.flash_data[x,y] = @le_color
  143.         end
  144.       end
  145.     else
  146.       while difference_y.abs > i+1
  147.         i+=1
  148.         y = @y+i*direction_y
  149.         if direction_x>0
  150.           x = @x+i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  151.         else
  152.           x = @x-i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  153.         end
  154.         x = x.floor
  155.         y = y.floor
  156.         if @le_clairv != true
  157.           unless (direction_y > 0 ? map_passable?(x,y) : map_passable?(x,y))
  158.             @trace[i-1,0] = -1
  159.             return false
  160.           end
  161.         end
  162.         if @le_show
  163.           @trace[i-1,0] = x
  164.           @trace[i-1,1] = y
  165.           $scene.spriteset.tilemap.flash_data[x,y] = @le_color
  166.         end
  167.       end
  168.     end
  169.     return true
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ● 清楚痕迹
  173.   #--------------------------------------------------------------------------
  174.   def clear
  175.     for i in 0 .. @trace.xsize-1
  176.       break if @trace[i,0] == -1
  177.       $scene.spriteset.tilemap.flash_data[@trace[i,0],@trace[i,1]] = 0
  178.     end
  179.     @trace[0,0] = -1
  180.   end
  181. end
  182. #==============================================================================
  183. # ■ Spriteset_Map
  184. #------------------------------------------------------------------------------
  185. #    重载地图显示
  186. #==============================================================================
  187. class Spriteset_Map
  188.   attr_reader:tilemap
  189.   alias :original_ini :initialize
  190.   def initialize
  191.     original_ini
  192.     @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)
  193.   end  
  194. end
  195. #==============================================================================
  196. # ■ Scene_Map
  197. #------------------------------------------------------------------------------
  198. #    重载地图场景
  199. #==============================================================================
  200. class Scene_Map
  201.   attr_reader:spriteset
  202. end
  203. #==============================================================================
  204. # ■ Game_Map
  205. #------------------------------------------------------------------------------
  206. #  重载地图类
  207. #==============================================================================
  208. class Game_Map
  209.   alias original_update update
  210.   def update
  211.     # 清除视线痕迹
  212.     for event in @events.values
  213.       event.clear
  214.     end
  215.     original_update
  216.   end
  217. end
复制代码

这个是LE2.1的VX版本。
作者: 流川枫    时间: 2008-11-9 07:09
原来的RE系统已经推翻,请版主看到后 把原来的发布帖更新为LE系统。谢谢
http://rpg.blue/web/htm/news1183.htm
作者: Mage    时间: 2008-11-9 22:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 纯子    时间: 2008-11-9 23:07
并行处理。。。。{/fd}
作者: 皇贞季    时间: 2008-11-11 20:33
{/fd}感谢发布啊。这个感觉确实很棒。。。刚才在测试的过程中也发现了个问题,如果触发之后就是某个NPC的独立D启动看到了主角。这时候如果因为事件发生了场景转换,回归的时候,这个开关会处于永远开启的状态。。。比如,会追踪主角的NPC之后不断的追踪,54视野了。。。像你的范例里的那个场所移动,就会发生,不断的自动移动,无限循环。。。= =+求解。。。
作者: 流川枫    时间: 2008-11-12 07:34
以下引用皇贞季于2008-11-11 12:33:46的发言:

感谢发布啊。这个感觉确实很棒。。。刚才在测试的过程中也发现了个问题,如果触发之后就是某个NPC的独立D启动看到了主角。这时候如果因为事件发生了场景转换,回归的时候,这个开关会处于永远开启的状态。。。比如,会追踪主角的NPC之后不断的追踪,54视野了。。。像你的范例里的那个场所移动,就会发生,不断的自动移动,无限循环。。。= =+求解。。。

不会吧?我测试了一下你说的情况,但是并没有发生任何异常。

还是说你采用了我前面说的第一种方案?
就是:(第一种方案)在看到主角的 事件层里 关闭 可视开关,这样 独立开关D 就不会被关闭。你就可以 靠近主角,直到接触主角,触发战斗等。
作者: 皇贞季    时间: 2008-11-12 07:53
=A=+++我不知道了,也许是刚巧和我这边的某些脚本冲突吧。
其实上午测试的时候就是为了证实这个,我把你做的那个走来走去的测试暗杀的家伙复制过来用了下。

结果就是一次被发现之后,我是把转移的地址进行了修改,移动到了另一个地图,然后我一出来就又立即刷回去了。回到原始地图的时候,那个独立开关D在没有被关闭了=A=+汗汗。。
作者: 流川枫    时间: 2008-11-12 23:38
以下引用皇贞季于2008-11-11 23:53:51的发言:

=A=+++我不知道了,也许是刚巧和我这边的某些脚本冲突吧。
其实上午测试的时候就是为了证实这个,我把你做的那个走来走去的测试暗杀的家伙复制过来用了下。

结果就是一次被发现之后,我是把转移的地址进行了修改,移动到了另一个地图,然后我一出来就又立即刷回去了。回到原始地图的时候,那个独立开关D在没有被关闭了=A=+汗汗。。

原因就是因为在地图转移的时候,没有记录事件的属性,只记录了独立开关。
所以重新转移回原来的地图的时候,事件又回到了最初的属性,但是独立开关仍然开着。
导致第一层事件没有将 LE视野打开,直接跳到 独立开关D 事件那里去执行了。

解决办法如下:
在转移地图之前,用一段脚本将地图中所有的事件的独立开关都关上。这样就可以解决问题了。
  1. for event in $game_map.events.values
  2. if event.le_seeing == true
  3. $game_self_switches[[$game_map.map_id,event.id, "A"]] =false
  4. $game_self_switches[[$game_map.map_id,event.id, "B"]] =false
  5. $game_self_switches[[$game_map.map_id,event.id, "C"]] =false
  6. $game_self_switches[[$game_map.map_id,event.id, "D"]] =false
  7. end
  8. end
复制代码

(放在事件脚本里,需要用“\”分行,不然一行写不下。)
只要在场景转移之前,用这段脚本,就能够关闭当前地图上
所有le_seeing为true的事件的独立开关了。

还有个方法,就是在所有事件层的自定义移动路线里,设置脚本指令填写LE的参数。这样无论如何,它也会重新启动LE系统。
作者: 皇贞季    时间: 2008-11-13 04:05
{/se}哇哈,虽然我脚本比较白,不过先去试试啊,超感谢。一会汇报结果
作者: 皇贞季    时间: 2008-11-13 04:38
{/ll}无力了,或许还是我对于脚本的认知不够,没能解决。
于是按照第二个方法。。。貌似也不成
作者: 流川枫    时间: 2008-11-13 05:00
以下引用皇贞季于2008-11-12 20:38:50的发言:

无力了,或许还是我对于脚本的认知不够,没能解决。
于是按照第二个方法。。。貌似也不成

你要在 场景转移 之前,调用上面的那段脚本。
这样的话,地图上所有LE事件的独立开关都会关掉。

注意:放在事件脚本里,需要用“\”分行,不然一行写不下。

实在不会的话,加我QQ。我明天之后就不能上网了,所以要加就快点。
作者: 流川枫    时间: 2009-7-7 21:30
LE2.2开发告一段落了,过段时间发布。因为我得做个范例游戏呀,是很久以前约定的 暗杀类游戏啊~~
作者: 淫笑君    时间: 2009-8-30 13:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: waya    时间: 2009-9-22 12:57
你可以用 上帝的眼睛 的脚本
http://rpg.blue/viewthread.php?tid=133326&extra=page%3D2

有无冲突不知
作者: jeymodena    时间: 2009-10-3 23:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: DeathKing    时间: 2009-10-4 18:01
貌似强大得不得了阿
作者: 流川枫    时间: 2009-10-8 20:04
本帖最后由 流川枫 于 2009-10-8 20:05 编辑

这个脚本系统我这儿已经从LE2.1到LE2.1SP更新到LE2.2了。范例忍者暗杀小游戏也基本完成了。
只不过我懒得发布。。。
话说如果还可能更新的话,下一个版本肯定会加入NPC除了可以看见主角外还能看见自己人。
但是我懒得写了。。。
作者: 流川枫    时间: 2009-10-8 21:17
LE2.1有BUG,而LE2.2已经相当完善了。
作者: 瓦沙尔    时间: 2009-11-3 21:20
提示: 作者被禁止或删除 内容自动屏蔽




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