Project1

标题: [PS0]线形视野系统 v20120129【XP线形视野系统移植版】 [打印本页]

作者: 各种压力的猫君    时间: 2012-1-29 01:30
标题: [PS0]线形视野系统 v20120129【XP线形视野系统移植版】
本帖最后由 各种压力的猫君 于 2012-1-29 02:04 编辑

移植自XP脚本 Leyeshot2.1线形视野系统,做暗杀类游戏的葵花宝典! By 流川枫
  1. #encoding:utf-8
  2. #==============================================================================
  3. # [PS0]线形视野系统
  4. #      Linetype_Eyeshot
  5. #------------------------------------------------------------------------------
  6. #     非常强大、高效率的NPC视野系统
  7. #==============================================================================
  8. # [更新记录]
  9. #    - 2012.01.29 By 各种压力的猫君
  10. #      * 移植至RGSS3,遵循PS0协议
  11. #    - 2008.11.03 By LCF(流川枫 QQ:350773875)
  12. #      * 蓝本(LCF_Leyeshot XP 2.1)
  13. #------------------------------------------------------------------------------
  14. # [使用方法]
  15. #    - 将本脚本插入到MAIN以上
  16. #    - 当NPC看到主角时,会打开自身的独立开关D
  17. #------------------------------------------------------------------------------
  18. # [使用说明]
  19. #    - 在需要开启视野系统的NPC身上执行以下脚本至少一次即可
  20. #        以下内容纯移植原脚本,下一版加入简化输入功能。
  21. #    - $game_map.events[@event_id].le_seeing = true/false
  22. #        该值为true表示该NPC视野开启,否则未开启,默认为false。
  23. #    - $game_map.events[@event_id].le_clairv = true/false
  24. #        该值为true表示该NPC视野不扫描视线障碍,否则扫描,默认为false。
  25. #    - $game_map.events[@event_id].le_show = true/false
  26. #        该值为true表示显示该NPC的视线,否则不显示,默认为false。
  27. #    - $game_map.events[@event_id].le_side = true/false
  28. #        该值为true表示该NPC可以看到侧面一格内的人,否则由斜率决定,默认为true。
  29. #    - $game_map.events[@event_id].le_circle = true/false
  30. #        该值为true表示该NPC为环绕视野,否则不能看见自己的身后,默认为false。
  31. #    - $game_map.events[@event_id].le_deepness = 深度值
  32. #        该值代表视野的能见度,默认为7。
  33. #    - $game_map.events[@event_id].le_slope = 斜率值
  34. #        该值代表视野的斜率,默认为1.0。
  35. #    - $game_map.events[@event_id].le_color = 颜色值
  36. #        该值代表视线显示的颜色,默认为0xf0。
  37. #==============================================================================
  38. $_PS0 = {} if $_PS0 == nil  
  39. $_PS0["Linetype_Eyeshot"] = 20120129
  40. #==============================================================================
  41. # [PS0] 通用配置模块  
  42. #==============================================================================
  43. module PS0
  44.   module Linetype_Eyeshot
  45.    
  46.     # 初始版本,仅移植为Ace可用版本。功能待添加。
  47.    
  48.   end
  49. end
  50. #==============================================================================
  51. # ■ Game_Event
  52. #==============================================================================
  53. class Game_Event < Game_Character
  54.   #--------------------------------------------------------------------------
  55.   # ● 定义实例变量
  56.   #--------------------------------------------------------------------------
  57.   attr_accessor :le_seeing                 # 视野系统开关
  58.   attr_accessor :le_clairv                 # 视野透视开关
  59.   attr_accessor :le_show                   # 视线显示开关
  60.   attr_accessor :le_side                   # 侧面可视开关
  61.   attr_accessor :le_circle                 # 视野环绕开关
  62.   attr_accessor :le_deepness               # 视野深度
  63.   attr_accessor :le_slope                  # 视野斜率
  64.   attr_accessor :le_color                  # 显示颜色
  65.   #--------------------------------------------------------------------------
  66.   # ● 初始化对象
  67.   #     event : RPG::Event
  68.   #--------------------------------------------------------------------------
  69.   alias original_initialize initialize
  70.   def initialize(map_id, event)
  71.     original_initialize(map_id, event)
  72.     @le_seeing   = false
  73.     @le_clairv   = false
  74.     @le_show     = false
  75.     @le_side     = true
  76.     @le_circle   = false
  77.     @le_deepness = 7
  78.     @le_slope    = 1.0
  79.     @le_color    = 0xf0
  80.     @trace = Table.new(@le_deepness,2)
  81.     @trace[0,0] = -1
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 刷新
  85.   #--------------------------------------------------------------------------
  86.   alias original_update update
  87.   def update
  88.     if @le_seeing
  89.       @trace.resize(@le_deepness,2) if @trace.xsize != @le_deepness
  90.       original_switch = $game_self_switches[[$game_map.map_id, @id, "D"]]
  91.       self.see
  92.       $game_map.need_refresh = true if original_switch != $game_self_switches[[$game_map.map_id, @id, "D"]]
  93.     end
  94.     original_update
  95.   end
  96.   #--------------------------------------------------------------------------
  97.   # ● 视野检测
  98.   #--------------------------------------------------------------------------
  99.   def see
  100.     $game_self_switches[[$game_map.map_id, @id, "D"]] = false
  101.     if ($game_player.x-@x).abs<@le_deepness and ($game_player.y-@y).abs<@le_deepness
  102.       difference_x = $game_player.x - @x
  103.       difference_y = $game_player.y - @y
  104.       case @direction
  105.       when 2
  106.         return if @le_circle != true and $game_player.y < @y
  107.         unless @le_side and (difference_y == 0 and difference_x.abs == 1)
  108.           return if (difference_y/(difference_x+0.0)).abs < @le_slope
  109.         end
  110.       when 4
  111.         return if @le_circle != true and $game_player.x > @x
  112.         unless @le_side and difference_y.abs == 1 and difference_x == 0
  113.           return if (difference_x/(difference_y+0.0)).abs < @le_slope
  114.         end
  115.       when 6
  116.         return if @le_circle != true and $game_player.x < @x
  117.         unless @le_side and difference_y.abs == 1 and difference_x == 0
  118.           return if (difference_x/(difference_y+0.0)).abs < @le_slope
  119.         end
  120.       else
  121.         return if @le_circle != true and $game_player.y > @y
  122.         unless @le_side and difference_y == 0 and difference_x.abs == 1
  123.           return if (difference_y/(difference_x+0.0)).abs < @le_slope
  124.         end
  125.       end
  126.       $game_self_switches[[$game_map.map_id, @id, "D"]] = scan_line
  127.     end
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   # ● 视线检测
  131.   #--------------------------------------------------------------------------
  132.   def scan_line
  133.     difference_x = $game_player.x - @x
  134.     difference_y = $game_player.y - @y
  135.     direction_x = (difference_x > 0 ? 1 : -1)
  136.     direction_y = (difference_y > 0 ? 1 : -1)
  137.     i = 0
  138.     if difference_x.abs > difference_y.abs
  139.       while difference_x.abs > i+1
  140.         i+=1
  141.         x = @x+i*direction_x
  142.         if direction_y>0
  143.           y = @y+i*difference_y/(difference_x+0.0)*direction_y*direction_x+0.5
  144.         else
  145.           y = @y-i*difference_y/(difference_x+0.0)*direction_y*direction_x+0.5
  146.         end
  147.         x = x.floor
  148.         y = y.floor
  149.         if @le_clairv != true
  150.           unless (direction_x > 0 ? passable?(x-1,y,6) : passable?(x+1,y,4))
  151.             @trace[i-1,0] = -1
  152.             return false
  153.           end
  154.         end
  155.         if @le_show
  156.           @trace[i-1,0] = x
  157.           @trace[i-1,1] = y
  158.           $scene.spriteset.tilemap.flash_data[x,y] = @le_color
  159.         end
  160.       end
  161.     else
  162.       while difference_y.abs > i+1
  163.         i+=1
  164.         y = @y+i*direction_y
  165.         if direction_x>0
  166.           x = @x+i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  167.         else
  168.           x = @x-i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  169.         end
  170.         x = x.floor
  171.         y = y.floor
  172.         if @le_clairv != true
  173.           unless (direction_y > 0 ? passable?(x,y-1,2) : passable?(x,y+1,8))
  174.             @trace[i-1,0] = -1
  175.             return false
  176.           end
  177.         end
  178.         if @le_show
  179.           @trace[i-1,0] = x
  180.           @trace[i-1,1] = y
  181.           SceneManager.scene.spriteset.tilemap.flash_data[x,y] = @le_color
  182.         end
  183.       end
  184.     end
  185.     return true
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   # ● 清楚痕迹
  189.   #--------------------------------------------------------------------------
  190.   def clear
  191.     for i in 0 .. @trace.xsize-1
  192.       break if @trace[i,0] == -1
  193.       SceneManager.scene.spriteset.tilemap.flash_data[@trace[i,0],@trace[i,1]] = 0
  194.     end
  195.     @trace[0,0] = -1
  196.   end
  197. end
  198. #==============================================================================
  199. # ■ Spriteset_Map
  200. #==============================================================================
  201. class Spriteset_Map
  202.   #--------------------------------------------------------------------------
  203.   # ● 定义实例变量
  204.   #--------------------------------------------------------------------------
  205.   attr_reader   :tilemap
  206.   #--------------------------------------------------------------------------
  207.   # ● 初始化对象
  208.   #--------------------------------------------------------------------------
  209.   alias original_ini initialize
  210.   def initialize
  211.     original_ini
  212.     @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)
  213.   end
  214. end
  215. #==============================================================================
  216. # ■ Scene_Map
  217. #==============================================================================
  218. class Scene_Map
  219.   #--------------------------------------------------------------------------
  220.   # ● 定义实例变量
  221.   #--------------------------------------------------------------------------
  222.   attr_reader   :spriteset
  223. end
  224. #==============================================================================
  225. # ■ Game_Map
  226. #==============================================================================
  227. class Game_Map
  228.   alias original_update update
  229.   #--------------------------------------------------------------------------
  230.   # ● 更新画面
  231.   #     main : 事件解释器更新的标志
  232.   #--------------------------------------------------------------------------
  233.   def update(main = false)
  234.     # 清除视线痕迹
  235.     for event in @events.values
  236.       event.clear
  237.     end
  238.     original_update(main = false)
  239.   end
  240. end
  241. #==============================================================================
  242. # [PS0] End of Script
  243. #==============================================================================
复制代码
这次移植很简单 = = 中途走了弯路所以拖了半天……

范例暂不提供,请浏览原版的旧发布页:
http://www.66rpg.com/htm/news1185.htm

想测试效果的话,随便弄个范例地图,建个NPC,用事件脚本
  1. $game_map.events[@event_id].le_seeing = true
  2. $game_map.events[@event_id].le_show = true
复制代码
就能看到效果了。


作者: orzfly    时间: 2012-1-29 02:38
本帖最后由 orzfly 于 2012-1-29 11:22 编辑

鼓励!我今天发现国外va的脚本不知道有多少了!

@各种压力的猫君http://yanflychannel.wordpress.c ... event-chase-player/
作者: 2825136    时间: 2012-1-31 23:28
运行脚本行走几步就卡住了



‘‘

自动执行更卡


──2825136于2012-1-31 23:47补充以上内容’’

未命名.PNG (28.74 KB, 下载次数: 18)

未命名.PNG

作者: xuzhengchi    时间: 2012-2-1 11:10
本帖最后由 xuzhengchi 于 2012-2-1 13:18 编辑


走到NPC的视野内就报错了

我用的是ACE啊


‘‘

插入这个脚本之后别的事件都无法执行了,比如和正常NPC对话都会卡住。不知道LZ有没有遇到这个问题?


──xuzhengchi于2012-2-2 13:32补充以上内容’’
作者: 浩仔    时间: 2012-6-5 11:18
本帖最后由 浩仔 于 2012-6-5 18:13 编辑

角色在事件的下方没问题,
但一走到左右就出错了


‘‘──浩仔于2012-6-5 18:12补充以下内容:

好像是同问题{:2_276:}
’’

error.png (681.94 KB, 下载次数: 17)

error.png





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