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

Project1

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

[已发主站] LE线形视野脚本的XP2.2加VX2.21和ACE2.21版本全发布

[复制链接]

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
跳转到指定楼层
发表于 2012-7-6 07:24:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
RUBY 代码复制
  1. #==============================================================================
  2. # ■ LCF_Leyeshot (linetype eyeshot)ACE 2.21    Creator LCF  Date 2009.7.6
  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_ss = true/false
  18. # 功能:该值为true表示只有当NPC看见主角时才显示视线,否则一直显示,默认为false。
  19. #------------------------------------------------------------------------------
  20. # 侧面可视开关    $game_map.events[@event_id].le_side = true/false
  21. # 功能:该值为true表示该NPC可以看到侧面一格内的人,否则由斜率决定,默认为true。
  22. #------------------------------------------------------------------------------
  23. # 视野环绕开关    $game_map.events[@event_id].le_circle = true/false
  24. # 功能:该值为true表示该NPC为环绕视野,否则不能看见自己的身后,默认为false。
  25. #------------------------------------------------------------------------------
  26. # 设置视野深度    $game_map.events[@event_id].le_deepness = 深度值
  27. # 功能:该值代表视野的能见度,当视野模型为扇形时应避免设置成奇数,默认为8。
  28. #------------------------------------------------------------------------------
  29. # 设置视野斜率    $game_map.events[@event_id].le_slope = 斜率值
  30. # 功能:该值代表视野的斜率,默认为1.0。
  31. #------------------------------------------------------------------------------
  32. # 设置显示颜色    $game_map.events[@event_id].le_color = 颜色值
  33. # 功能:该值代表视线显示的颜色,默认为0xf0。
  34. #------------------------------------------------------------------------------
  35. # 设置触发开关    $game_map.events[@event_id].le_skey = "A"/"B"/"C"/"D"(大写)
  36. # 功能:该值指定了映射是否看见主角的状态的独立开关,默认为"D"。
  37. #------------------------------------------------------------------------------
  38. # 设置键开关    $game_map.events[@event_id].le_kw = true/false
  39. # 功能:该值表示是否将该NPC触发状态映射到触发开关指定的独立变量中,默认为true。
  40. #------------------------------------------------------------------------------
  41. # 设置触发确认    $game_map.events[@event_id].le_true = true/false
  42. # 功能:该值表示该NPC是否看见了主角,等价于触发开关,默认为false。
  43. #------------------------------------------------------------------------------
  44. # 设置视野模型    $game_map.events[@event_id].le_mode = 0/1
  45. # 功能:该值为0时表示该NPC的视野形状类扇形,为1时类三角形,默认为0。
  46. #==============================================================================
  47. # 全局视野开关    $le_run = true/false
  48. # 功能:该值为true表示系统正常工作,否则终止所有NPC的视野,默认为true。
  49. #------------------------------------------------------------------------------
  50. # 全局关闭列表    $le_close_table = ["A","B","C","D"]
  51. # 功能:不同场景转移时,将自动关闭表里的独立开关。(只针对le_seeing为true的NPC)
  52. #==============================================================================
  53. # 当NPC看见主角,独立开关(le_skey)便会被打开,否则为关闭状态。
  54. #==============================================================================
  55.  
  56. #==============================================================================
  57. # ■ Game_Event
  58. #------------------------------------------------------------------------------
  59. #  重载事件类
  60. #==============================================================================
  61. class Game_Event
  62.   attr_accessor   :le_seeing                 # 视野系统开关
  63.   attr_accessor   :le_clairv                 # 视野透视开关
  64.   attr_accessor   :le_show                   # 视线显示开关
  65.   attr_accessor   :le_ss                     # 看见时显示开关
  66.   attr_accessor   :le_side                   # 侧面可视开关
  67.   attr_accessor   :le_circle                 # 视野环绕开关
  68.   attr_accessor   :le_deepness               # 视野深度
  69.   attr_accessor   :le_slope                  # 视野斜率
  70.   attr_accessor   :le_color                  # 显示颜色
  71.   attr_accessor   :le_trace                  # 视野痕迹
  72.   attr_accessor   :le_skey                   # 触发开关
  73.   attr_accessor   :le_kw                     # 键开关
  74.   attr_accessor   :le_true                   # 触发确认
  75.   attr_accessor   :le_mode                   # 视野模型
  76.   #--------------------------------------------------------------------------
  77.   LE_DEEPNESS_OFFSET = 1                     # 深度缓存的偏移
  78.   #--------------------------------------------------------------------------
  79.   # ● 初始化对像
  80.   #     map_id : 地图 ID
  81.   #     event  : 事件 (RPG::Event)
  82.   #--------------------------------------------------------------------------
  83.   alias original_le_initialize initialize
  84.   def initialize (map_id, event)
  85.     original_le_initialize(map_id, event)
  86.     @le_seeing   = false
  87.     @le_clairv   = false
  88.     @le_show     = false
  89.     @le_ss       = false
  90.     @le_side     = true
  91.     @le_circle   = false
  92.     @le_deepness = 8
  93.     @le_slope    = 1.0
  94.     @le_color    = 0xf0
  95.     @le_trace = Table.new(@le_deepness-LE_DEEPNESS_OFFSET,2)
  96.     @le_trace[0,0] = -1
  97.     @le_kw   = true
  98.     @le_true = false
  99.     @le_mode = 0
  100.     @le_skey = "D"
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 刷新
  104.   #--------------------------------------------------------------------------
  105.   alias original_le_update update
  106.   def update
  107.     original_le_update
  108.     if @le_seeing and $le_run
  109.       @le_trace.resize(@le_deepness-LE_DEEPNESS_OFFSET,2) if @le_trace.xsize+LE_DEEPNESS_OFFSET != @le_deepness
  110.       self.see
  111.       if @le_kw
  112.         $game_map.need_refresh = true if @le_true != $game_self_switches[[$game_map.map_id, @id, @le_skey]]
  113.         $game_self_switches[[$game_map.map_id, @id, @le_skey]] = @le_true
  114.       end
  115.     end
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 视野检测
  119.   #--------------------------------------------------------------------------
  120.   def see
  121.     @le_true = false
  122.     if ($game_player.x-@x).abs<@le_deepness and ($game_player.y-@y).abs<@le_deepness
  123.       difference_x = ($game_player.x - @x).abs
  124.       difference_y = ($game_player.y - @y).abs
  125.       case @direction
  126.       when 2
  127.         return if @le_circle != true and $game_player.y < @y
  128.         unless @le_side and (difference_y == 0 and difference_x == 1)
  129.           return if difference_x.to_f/difference_y > @le_slope
  130.         end
  131.       when 4
  132.         return if @le_circle != true and $game_player.x > @x
  133.         unless @le_side and difference_y == 1 and difference_x == 0
  134.           return if difference_y.to_f/difference_x > @le_slope
  135.         end
  136.       when 6
  137.         return if @le_circle != true and $game_player.x < @x
  138.         unless @le_side and difference_y == 1 and difference_x == 0
  139.           return if difference_y.to_f/difference_x > @le_slope
  140.         end
  141.       else
  142.         return if @le_circle != true and $game_player.y > @y
  143.         unless @le_side and difference_y == 0 and difference_x == 1
  144.           return if difference_x.to_f/difference_y > @le_slope
  145.         end
  146.       end
  147.       if @le_mode == 0
  148.         return if (difference_x ** 2 + difference_y ** 2) > le_deepness ** 2
  149.       end
  150.       @le_true = scan_line
  151.       if @le_ss and @le_true !=true
  152.         @le_trace[0,0] = -1
  153.       end
  154.     end
  155.   end
  156.   #--------------------------------------------------------------------------
  157.   # ● 视线检测   采用了国际领先的视线扫描算法!
  158.   #--------------------------------------------------------------------------
  159.   def scan_line
  160.     difference_x = $game_player.x - @x
  161.     difference_y = $game_player.y - @y
  162.     direction_x = (difference_x > 0 ? 1 : -1)
  163.     direction_y = (difference_y > 0 ? 1 : -1)
  164.     i = 0
  165.     if difference_x.abs > difference_y.abs
  166.       while difference_x.abs > i+1
  167.         i+=1
  168.         x = @x+i*direction_x
  169.         if direction_y>0
  170.           y = @y+i*difference_y/difference_x.to_f*direction_y*direction_x+0.5
  171.         else
  172.           y = @y-i*difference_y/difference_x.to_f*direction_y*direction_x+0.5
  173.         end
  174.         x = x.floor
  175.         y = y.floor
  176.         if @le_clairv != true
  177.           unless (direction_x > 0 ? passable?(x-1,y,6) : passable?(x+1,y,4))
  178.             @le_trace[i-1,0] = -1
  179.             return false
  180.           end
  181.         end
  182.         if @le_show
  183.           @le_trace[i-1,0] = x
  184.           @le_trace[i-1,1] = y
  185.         end
  186.       end
  187.     else
  188.       while difference_y.abs > i+1
  189.         i+=1
  190.         y = @y+i*direction_y
  191.         if direction_x>0
  192.           x = @x+i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  193.         else
  194.           x = @x-i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  195.         end
  196.         x = x.floor
  197.         y = y.floor
  198.         if @le_clairv != true
  199.           unless (direction_y > 0 ? passable?(x,y-1,2) : passable?(x,y+1,8))
  200.             @le_trace[i-1,0] = -1
  201.             return false
  202.           end
  203.         end
  204.         if @le_show
  205.           @le_trace[i-1,0] = x
  206.           @le_trace[i-1,1] = y
  207.         end
  208.       end
  209.     end
  210.     @le_trace[i,0] = -1
  211.     return true
  212.   end
  213. end
  214. #==============================================================================
  215. # ■ Spriteset_Map
  216. #------------------------------------------------------------------------------
  217. #    重载地图显示
  218. #==============================================================================
  219. class Spriteset_Map
  220.   attr_reader:tilemap
  221.   alias :original_le_initialize :initialize
  222.   def initialize
  223.     original_le_initialize
  224.     @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)
  225.   end
  226. end
  227. #==============================================================================
  228. # ■ Game_Player
  229. #------------------------------------------------------------------------------
  230. #    重载玩家
  231. #==============================================================================
  232. class Game_Player < Game_Character
  233.   attr_reader:new_map_id
  234. end
  235. #==============================================================================
  236. # ■ Scene_Map
  237. #------------------------------------------------------------------------------
  238. #    重载地图场景
  239. #==============================================================================
  240. class Scene_Map
  241.   attr_reader:spriteset
  242.   #--------------------------------------------------------------------------
  243.   # ● 场所移动前的处理
  244.   #--------------------------------------------------------------------------
  245.   alias original_le_pre_transfer pre_transfer
  246.   def pre_transfer
  247.     original_le_pre_transfer
  248.     # 自动关闭当前地图上le_seeing为true的NPC独立开关
  249.     if $game_map.map_id != $game_player.new_map_id
  250.       for event in $game_map.events.values
  251.         if event.le_seeing
  252.           for key in $le_close_table
  253.             $game_self_switches[[$game_map.map_id,event.id, key]] =false
  254.           end
  255.         end
  256.       end
  257.     end
  258.   end
  259.   #--------------------------------------------------------------------------
  260.   # ● 更新画面
  261.   #--------------------------------------------------------------------------
  262.   #alias original_le_update update
  263.   def update
  264.     super
  265.       #==========================
  266.       # 清除LE视野产生的痕迹
  267.       #==========================
  268.       for event in $game_map.events.values
  269.         for i in 0 .. event.le_trace.xsize-1
  270.           break if event.le_trace[i,0] == -1
  271.           @spriteset.tilemap.flash_data[event.le_trace[i,0],event.le_trace[i,1]] = 0
  272.         end
  273.          event.le_trace[0,0] = -1
  274.        end
  275.       #==========================
  276.  
  277.     $game_map.update(true)
  278.     $game_player.update
  279.     $game_timer.update
  280.     @spriteset.update
  281.     update_scene if scene_change_ok?
  282.       #==========================
  283.       # 刷新LE视野路径
  284.       #==========================
  285.       for event in $game_map.events.values
  286.         for i in 0 .. event.le_trace.xsize-1
  287.           break if event.le_trace[i,0] == -1
  288.           @spriteset.tilemap.flash_data[event.le_trace[i,0],event.le_trace[i,1]] = event.le_color
  289.         end
  290.       end
  291.       #==========================
  292.   end
  293. end
  294. #==============================================================================
  295. # ■ Scene_Title
  296. #------------------------------------------------------------------------------
  297. #  处理标题画面的类。
  298. #==============================================================================
  299. class Scene_Title
  300.   alias original_le_main main
  301.   def main
  302.     $le_run = true
  303.     $le_close_table = ["A","B","C","D"]
  304.     original_le_main
  305.   end
  306. end
  307. #==============================================================================
  308. # ■ DataManager
  309. #------------------------------------------------------------------------------
  310. #  处理存档。
  311. #==============================================================================
  312. module DataManager
  313.   # 写入两个全局变量
  314.   def self.save_game_without_rescue(index)
  315.     File.open(make_filename(index), "wb") do |file|
  316.       $game_system.on_before_save
  317.       Marshal.dump(make_save_header, file)
  318.       Marshal.dump(make_save_contents, file)
  319.       @last_savefile_index = index
  320.       Marshal.dump($le_run,file)
  321.       Marshal.dump($le_close_table,file)
  322.     end
  323.     return true
  324.   end
  325.   def self.load_game_without_rescue(index)
  326.     File.open(make_filename(index), "rb") do |file|
  327.       Marshal.load(file)
  328.       extract_save_contents(Marshal.load(file))
  329.       reload_map_if_updated
  330.       @last_savefile_index = index
  331.       $le_run         = Marshal.load(file)
  332.       $le_close_table = Marshal.load(file)
  333.     end
  334.     return true
  335.   end
  336. end
  337. #==============================================================================
  338. #                                 The End
  339. #==============================================================================

RUBY 代码复制
  1. #==============================================================================
  2. # ■ LCF_Leyeshot (linetype eyeshot)VX 2.21    Creator LCF  Date 2009.7.6
  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_ss = true/false
  18. # 功能:该值为true表示只有当NPC看见主角时才显示视线,否则一直显示,默认为false。
  19. #------------------------------------------------------------------------------
  20. # 侧面可视开关    $game_map.events[@event_id].le_side = true/false
  21. # 功能:该值为true表示该NPC可以看到侧面一格内的人,否则由斜率决定,默认为true。
  22. #------------------------------------------------------------------------------
  23. # 视野环绕开关    $game_map.events[@event_id].le_circle = true/false
  24. # 功能:该值为true表示该NPC为环绕视野,否则不能看见自己的身后,默认为false。
  25. #------------------------------------------------------------------------------
  26. # 设置视野深度    $game_map.events[@event_id].le_deepness = 深度值
  27. # 功能:该值代表视野的能见度,当视野模型为扇形时应避免设置成奇数,默认为8。
  28. #------------------------------------------------------------------------------
  29. # 设置视野斜率    $game_map.events[@event_id].le_slope = 斜率值
  30. # 功能:该值代表视野的斜率,默认为1.0。
  31. #------------------------------------------------------------------------------
  32. # 设置显示颜色    $game_map.events[@event_id].le_color = 颜色值
  33. # 功能:该值代表视线显示的颜色,默认为0xf0。
  34. #------------------------------------------------------------------------------
  35. # 设置触发开关    $game_map.events[@event_id].le_skey = "A"/"B"/"C"/"D"(大写)
  36. # 功能:该值指定了映射是否看见主角的状态的独立开关,默认为"D"。
  37. #------------------------------------------------------------------------------
  38. # 设置键开关    $game_map.events[@event_id].le_kw = true/false
  39. # 功能:该值表示是否将该NPC触发状态映射到触发开关指定的独立变量中,默认为true。
  40. #------------------------------------------------------------------------------
  41. # 设置触发确认    $game_map.events[@event_id].le_true = true/false
  42. # 功能:该值表示该NPC是否看见了主角,等价于触发开关,默认为false。
  43. #------------------------------------------------------------------------------
  44. # 设置视野模型    $game_map.events[@event_id].le_mode = 0/1
  45. # 功能:该值为0时表示该NPC的视野形状类扇形,为1时类三角形,默认为0。
  46. #==============================================================================
  47. # 全局视野开关    $le_run = true/false
  48. # 功能:该值为true表示系统正常工作,否则终止所有NPC的视野,默认为true。
  49. #------------------------------------------------------------------------------
  50. # 全局关闭列表    $le_close_table = ["A","B","C","D"]
  51. # 功能:不同场景转移时,将自动关闭表里的独立开关。(只针对le_seeing为true的NPC)
  52. #==============================================================================
  53. # 当NPC看见主角,独立开关(le_skey)便会被打开,否则为关闭状态。
  54. #==============================================================================
  55.  
  56. #==============================================================================
  57. # ■ Game_Event
  58. #------------------------------------------------------------------------------
  59. #  重载事件类
  60. #==============================================================================
  61. class Game_Event
  62.   attr_accessor   :le_seeing                 # 视野系统开关
  63.   attr_accessor   :le_clairv                 # 视野透视开关
  64.   attr_accessor   :le_show                   # 视线显示开关
  65.   attr_accessor   :le_ss                     # 看见时显示开关
  66.   attr_accessor   :le_side                   # 侧面可视开关
  67.   attr_accessor   :le_circle                 # 视野环绕开关
  68.   attr_accessor   :le_deepness               # 视野深度
  69.   attr_accessor   :le_slope                  # 视野斜率
  70.   attr_accessor   :le_color                  # 显示颜色
  71.   attr_accessor   :le_trace                  # 视野痕迹
  72.   attr_accessor   :le_skey                   # 触发开关
  73.   attr_accessor   :le_kw                     # 键开关
  74.   attr_accessor   :le_true                   # 触发确认
  75.   attr_accessor   :le_mode                   # 视野模型
  76.   #--------------------------------------------------------------------------
  77.   LE_DEEPNESS_OFFSET = 1                     # 深度缓存的偏移
  78.   #--------------------------------------------------------------------------
  79.   # ● 初始化对像
  80.   #     map_id : 地图 ID
  81.   #     event  : 事件 (RPG::Event)
  82.   #--------------------------------------------------------------------------
  83.   alias original_le_initialize initialize
  84.   def initialize (map_id, event)
  85.     original_le_initialize (map_id, event)
  86.     @le_seeing   = false
  87.     @le_clairv   = false
  88.     @le_show     = false
  89.     @le_ss       = false
  90.     @le_side     = true
  91.     @le_circle   = false
  92.     @le_deepness = 8
  93.     @le_slope    = 1.0
  94.     @le_color    = 0xf0
  95.     @le_trace = Table.new (@le_deepness-LE_DEEPNESS_OFFSET,2)
  96.     @le_trace[0,0] = -1
  97.     @le_kw   = true
  98.     @le_true = false
  99.     @le_mode = 0
  100.     @le_skey = "D"
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 刷新
  104.   #--------------------------------------------------------------------------
  105.   alias original_le_update update
  106.   def update
  107.     original_le_update
  108.     if @le_seeing and $le_run
  109.       @le_trace.resize (@le_deepness-LE_DEEPNESS_OFFSET,2) if @le_trace.xsize+LE_DEEPNESS_OFFSET != @le_deepness
  110.       self.see
  111.       if @le_kw
  112.         $game_map.need_refresh = true if @le_true != $game_self_switches[[$game_map.map_id, @id, @le_skey]]
  113.         $game_self_switches[[$game_map.map_id, @id, @le_skey]] = @le_true
  114.       end
  115.     end
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 视野检测
  119.   #--------------------------------------------------------------------------
  120.   def see
  121.     @le_true = false
  122.     if ($game_player.x-@x).abs<@le_deepness and ($game_player.y-@y).abs<@le_deepness
  123.       difference_x = ($game_player.x - @x).abs
  124.       difference_y = ($game_player.y - @y).abs
  125.       case @direction
  126.       when 2
  127.         return if @le_circle != true and $game_player.y < @y
  128.         unless @le_side and (difference_y == 0 and difference_x == 1)
  129.           return if difference_x.to_f/difference_y > @le_slope
  130.         end
  131.       when 4
  132.         return if @le_circle != true and $game_player.x > @x
  133.         unless @le_side and difference_y == 1 and difference_x == 0
  134.           return if difference_y.to_f/difference_x > @le_slope
  135.         end
  136.       when 6
  137.         return if @le_circle != true and $game_player.x < @x
  138.         unless @le_side and difference_y == 1 and difference_x == 0
  139.           return if difference_y.to_f/difference_x > @le_slope
  140.         end
  141.       else
  142.         return if @le_circle != true and $game_player.y > @y
  143.         unless @le_side and difference_y == 0 and difference_x == 1
  144.           return if difference_x.to_f/difference_y > @le_slope
  145.         end
  146.       end
  147.       if @le_mode == 0
  148.         return if (difference_x ** 2 + difference_y ** 2) > le_deepness ** 2
  149.       end
  150.       @le_true = scan_line
  151.       if @le_ss and @le_true !=true
  152.         @le_trace[0,0] = -1
  153.       end
  154.     end
  155.   end
  156.   #--------------------------------------------------------------------------
  157.   # ● 视线检测   采用了国际领先的视线扫描算法!
  158.   #--------------------------------------------------------------------------
  159.   def scan_line
  160.     difference_x = $game_player.x - @x
  161.     difference_y = $game_player.y - @y
  162.     direction_x = (difference_x > 0 ? 1 : -1)
  163.     direction_y = (difference_y > 0 ? 1 : -1)
  164.     i = 0
  165.     if difference_x.abs > difference_y.abs
  166.       while difference_x.abs > i+1
  167.         i+=1
  168.         x = @x+i*direction_x
  169.         if direction_y>0
  170.           y = @y+i*difference_y/difference_x.to_f*direction_y*direction_x+0.5
  171.         else
  172.           y = @y-i*difference_y/difference_x.to_f*direction_y*direction_x+0.5
  173.         end
  174.         x = x.floor
  175.         y = y.floor
  176.         if @le_clairv != true
  177.           unless (direction_x > 0 ? passable?(x,y) : passable?(x,y))
  178.             @le_trace[i-1,0] = -1
  179.             return false
  180.           end
  181.         end
  182.         if @le_show
  183.           @le_trace[i-1,0] = x
  184.           @le_trace[i-1,1] = y
  185.         end
  186.       end
  187.     else
  188.       while difference_y.abs > i+1
  189.         i+=1
  190.         y = @y+i*direction_y
  191.         if direction_x>0
  192.           x = @x+i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  193.         else
  194.           x = @x-i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  195.         end
  196.         x = x.floor
  197.         y = y.floor
  198.         if @le_clairv != true
  199.           unless (direction_y > 0 ? passable?(x,y) : passable?(x,y))
  200.             @le_trace[i-1,0] = -1
  201.             return false
  202.           end
  203.         end
  204.         if @le_show
  205.           @le_trace[i-1,0] = x
  206.           @le_trace[i-1,1] = y
  207.         end
  208.       end
  209.     end
  210.     @le_trace[i,0] = -1
  211.     return true
  212.   end
  213. end
  214. #==============================================================================
  215. # ■ Spriteset_Map
  216. #------------------------------------------------------------------------------
  217. #    重载地图显示
  218. #==============================================================================
  219. class Spriteset_Map
  220.   attr_reader:tilemap
  221.   alias :original_le_initialize :initialize
  222.   def initialize
  223.     original_le_initialize
  224.     @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)
  225.   end
  226. end
  227. #==============================================================================
  228. # ■ Game_Player
  229. #------------------------------------------------------------------------------
  230. #    重载玩家
  231. #==============================================================================
  232. class Game_Player < Game_Character
  233.   attr_reader:new_map_id
  234. end
  235. #==============================================================================
  236. # ■ Scene_Map
  237. #------------------------------------------------------------------------------
  238. #    重载地图场景
  239. #==============================================================================
  240. class Scene_Map
  241.   attr_reader:spriteset
  242.   #--------------------------------------------------------------------------
  243.   # ● 主角的场所移动
  244.   #--------------------------------------------------------------------------
  245.   alias original_le_transfer_player update_transfer_player
  246.   def update_transfer_player
  247.     return unless $game_player.transfer?
  248.     # 自动关闭当前地图上le_seeing为true的NPC独立开关
  249.     if $game_map.map_id != $game_player.new_map_id
  250.       for event in $game_map.events.values
  251.         if event.le_seeing
  252.           for key in $le_close_table
  253.             $game_self_switches[[$game_map.map_id,event.id, key]] =false
  254.           end
  255.         end
  256.       end
  257.     end
  258.     original_le_transfer_player
  259.   end
  260.    #--------------------------------------------------------------------------
  261.   # ● 更新画面
  262.   #--------------------------------------------------------------------------
  263.   #alias original_le_update update
  264.   def update
  265.     super
  266.       #==========================
  267.       # 清除LE视野产生的痕迹
  268.       #==========================
  269.       for event in $game_map.events.values
  270.         for i in 0 .. event.le_trace.xsize-1
  271.           break if event.le_trace[i,0] == -1
  272.           @spriteset.tilemap.flash_data[event.le_trace[i,0],event.le_trace[i,1]] = 0
  273.         end
  274.          event.le_trace[0,0] = -1
  275.        end
  276.       #==========================
  277.     $game_map.interpreter.update      # 更新解释器
  278.     $game_map.update                  # 更新地图
  279.     $game_player.update               # 更新主角
  280.     $game_system.update               # 更新计时器
  281.     @spriteset.update                 # 更新活动块组
  282.     @message_window.update            # 更新信息窗口
  283.     unless $game_message.visible      # 信息窗口显示中除外
  284.       update_transfer_player
  285.       update_encounter
  286.       update_call_menu
  287.       update_call_debug
  288.       update_scene_change
  289.     end
  290.       #==========================
  291.       # 刷新LE视野路径
  292.       #==========================
  293.       for event in $game_map.events.values
  294.         for i in 0 .. event.le_trace.xsize-1
  295.           break if event.le_trace[i,0] == -1
  296.           @spriteset.tilemap.flash_data[event.le_trace[i,0],event.le_trace[i,1]] = event.le_color
  297.         end
  298.       end
  299.       #==========================
  300.   end
  301. end
  302. #==============================================================================
  303. # ■ Scene_Title
  304. #------------------------------------------------------------------------------
  305. #  处理标题画面的类。
  306. #==============================================================================
  307. class Scene_Title
  308.   alias original_le_main main
  309.   def main
  310.     $le_run = true
  311.     $le_close_table = ["A","B","C","D"]
  312.     original_le_main
  313.   end
  314. end
  315. #==============================================================================
  316. # ■ Scene_Save
  317. #------------------------------------------------------------------------------
  318. #  处理存档画面的类。
  319. #==============================================================================
  320. class Scene_Save < Scene_File
  321.   # 写入两个全局变量
  322.   alias original_le_write_save_data write_save_data
  323.   def write_save_data(file)
  324.     original_le_write_save_data(file)
  325.     Marshal.dump($le_run,file)
  326.     Marshal.dump($le_close_table,file)
  327.   end
  328. end
  329. #==============================================================================
  330. # ■ Scene_Load
  331. #------------------------------------------------------------------------------
  332. #  处理读档画面的类。
  333. #==============================================================================
  334. class Scene_Load < Scene_File
  335.   # 读取两个全局变量
  336.   alias original_le_read_save_data read_save_data
  337.   def read_save_data(file)
  338.     original_le_read_save_data(file)
  339.     $le_run         = Marshal.load(file)
  340.     $le_close_table = Marshal.load(file)
  341.   end
  342. end
  343. #==============================================================================
  344. #                                 The End
  345. #==============================================================================

RUBY 代码复制
  1. #==============================================================================
  2. # ■ LCF_Leyeshot (linetype eyeshot)XP 2.2    Creator LCF  Date 2009.7.6
  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_ss = true/false
  18. # 功能:该值为true表示只有当NPC看见主角时才显示视线,否则一直显示,默认为false。
  19. #------------------------------------------------------------------------------
  20. # 侧面可视开关    $game_map.events[@event_id].le_side = true/false
  21. # 功能:该值为true表示该NPC可以看到侧面一格内的人,否则由斜率决定,默认为true。
  22. #------------------------------------------------------------------------------
  23. # 视野环绕开关    $game_map.events[@event_id].le_circle = true/false
  24. # 功能:该值为true表示该NPC为环绕视野,否则不能看见自己的身后,默认为false。
  25. #------------------------------------------------------------------------------
  26. # 设置视野深度    $game_map.events[@event_id].le_deepness = 深度值
  27. # 功能:该值代表视野的能见度,当视野模型为扇形时应避免设置成奇数,默认为8。
  28. #------------------------------------------------------------------------------
  29. # 设置视野斜率    $game_map.events[@event_id].le_slope = 斜率值
  30. # 功能:该值代表视野的斜率,默认为1.0。
  31. #------------------------------------------------------------------------------
  32. # 设置显示颜色    $game_map.events[@event_id].le_color = 颜色值
  33. # 功能:该值代表视线显示的颜色,默认为0xf0。
  34. #------------------------------------------------------------------------------
  35. # 设置触发开关    $game_map.events[@event_id].le_skey = "A"/"B"/"C"/"D"(大写)
  36. # 功能:该值指定了映射是否看见主角的状态的独立开关,默认为"D"。
  37. #------------------------------------------------------------------------------
  38. # 设置键开关    $game_map.events[@event_id].le_kw = true/false
  39. # 功能:该值表示是否将该NPC触发状态映射到触发开关指定的独立变量中,默认为true。
  40. #------------------------------------------------------------------------------
  41. # 设置触发确认    $game_map.events[@event_id].le_true = true/false
  42. # 功能:该值表示该NPC是否看见了主角,等价于触发开关,默认为false。
  43. #------------------------------------------------------------------------------
  44. # 设置视野模型    $game_map.events[@event_id].le_mode = 0/1
  45. # 功能:该值为0时表示该NPC的视野形状类扇形,为1时类三角形,默认为0。
  46. #==============================================================================
  47. # 全局视野开关    $le_run = true/false
  48. # 功能:该值为true表示系统正常工作,否则终止所有NPC的视野,默认为true。
  49. #------------------------------------------------------------------------------
  50. # 全局关闭列表    $le_close_table = ["A","B","C","D"]
  51. # 功能:不同场景转移时,将自动关闭表里的独立开关。(只针对le_seeing为true的NPC)
  52. #==============================================================================
  53. # 当NPC看见主角,独立开关(le_skey)便会被打开,否则为关闭状态。
  54. #==============================================================================
  55.  
  56. #==============================================================================
  57. # ■ Game_Event
  58. #------------------------------------------------------------------------------
  59. #  重载事件类
  60. #==============================================================================
  61. class Game_Event
  62.   attr_accessor   :le_seeing                 # 视野系统开关
  63.   attr_accessor   :le_clairv                 # 视野透视开关
  64.   attr_accessor   :le_show                   # 视线显示开关
  65.   attr_accessor   :le_ss                     # 看见时显示开关
  66.   attr_accessor   :le_side                   # 侧面可视开关
  67.   attr_accessor   :le_circle                 # 视野环绕开关
  68.   attr_accessor   :le_deepness               # 视野深度
  69.   attr_accessor   :le_slope                  # 视野斜率
  70.   attr_accessor   :le_color                  # 显示颜色
  71.   attr_accessor   :le_trace                  # 视野痕迹
  72.   attr_accessor   :le_skey                   # 触发开关
  73.   attr_accessor   :le_kw                     # 键开关
  74.   attr_accessor   :le_true                   # 触发确认
  75.   attr_accessor   :le_mode                   # 视野模型
  76.   #--------------------------------------------------------------------------
  77.   LE_DEEPNESS_OFFSET = 1                     # 深度缓存的偏移
  78.   #--------------------------------------------------------------------------
  79.   # ● 初始化对像
  80.   #     map_id : 地图 ID
  81.   #     event  : 事件 (RPG::Event)
  82.   #--------------------------------------------------------------------------
  83.   alias original_le_initialize initialize
  84.   def initialize (map_id, event)
  85.     original_le_initialize (map_id, event)
  86.     @le_seeing   = false
  87.     @le_clairv   = false
  88.     @le_show     = false
  89.     @le_ss       = false
  90.     @le_side     = true
  91.     @le_circle   = false
  92.     @le_deepness = 8
  93.     @le_slope    = 1.0
  94.     @le_color    = 0xf0
  95.     @le_trace = Table.new (@le_deepness-LE_DEEPNESS_OFFSET,2)
  96.     @le_trace[0,0] = -1
  97.     @le_kw   = true
  98.     @le_true = false
  99.     @le_mode = 0
  100.     @le_skey = "D"
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 刷新
  104.   #--------------------------------------------------------------------------
  105.   alias original_le_update update
  106.   def update
  107.     original_le_update
  108.     if @le_seeing and $le_run
  109.       @le_trace.resize (@le_deepness-LE_DEEPNESS_OFFSET,2) if @le_trace.xsize+LE_DEEPNESS_OFFSET != @le_deepness
  110.       self.see
  111.       if @le_kw
  112.         $game_map.need_refresh = true if @le_true != $game_self_switches[[$game_map.map_id, @id, @le_skey]]
  113.         $game_self_switches[[$game_map.map_id, @id, @le_skey]] = @le_true
  114.       end
  115.     end
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 视野检测
  119.   #--------------------------------------------------------------------------
  120.   def see
  121.     @le_true = false
  122.     if ($game_player.x-@x).abs<@le_deepness and ($game_player.y-@y).abs<@le_deepness
  123.       difference_x = ($game_player.x - @x).abs
  124.       difference_y = ($game_player.y - @y).abs
  125.       case @direction
  126.       when 2
  127.         return if @le_circle != true and $game_player.y < @y
  128.         unless @le_side and (difference_y == 0 and difference_x == 1)
  129.           return if difference_x.to_f/difference_y > @le_slope
  130.         end
  131.       when 4
  132.         return if @le_circle != true and $game_player.x > @x
  133.         unless @le_side and difference_y == 1 and difference_x == 0
  134.           return if difference_y.to_f/difference_x > @le_slope
  135.         end
  136.       when 6
  137.         return if @le_circle != true and $game_player.x < @x
  138.         unless @le_side and difference_y == 1 and difference_x == 0
  139.           return if difference_y.to_f/difference_x > @le_slope
  140.         end
  141.       else
  142.         return if @le_circle != true and $game_player.y > @y
  143.         unless @le_side and difference_y == 0 and difference_x == 1
  144.           return if difference_x.to_f/difference_y > @le_slope
  145.         end
  146.       end
  147.       if @le_mode == 0
  148.         return if (difference_x ** 2 + difference_y ** 2) > le_deepness ** 2
  149.       end
  150.       @le_true = scan_line
  151.       if @le_ss and @le_true !=true
  152.         @le_trace[0,0] = -1
  153.       end
  154.     end
  155.   end
  156.   #--------------------------------------------------------------------------
  157.   # ● 视线检测   采用了国际领先的视线扫描算法!
  158.   #--------------------------------------------------------------------------
  159.   def scan_line
  160.     difference_x = $game_player.x - @x
  161.     difference_y = $game_player.y - @y
  162.     direction_x = (difference_x > 0 ? 1 : -1)
  163.     direction_y = (difference_y > 0 ? 1 : -1)
  164.     i = 0
  165.     if difference_x.abs > difference_y.abs
  166.       while difference_x.abs > i+1
  167.         i+=1
  168.         x = @x+i*direction_x
  169.         if direction_y>0
  170.           y = @y+i*difference_y/difference_x.to_f*direction_y*direction_x+0.5
  171.         else
  172.           y = @y-i*difference_y/difference_x.to_f*direction_y*direction_x+0.5
  173.         end
  174.         x = x.floor
  175.         y = y.floor
  176.         if @le_clairv != true
  177.           unless (direction_x > 0 ? passable?(x-1,y,6) : passable?(x+1,y,4))
  178.             @le_trace[i-1,0] = -1
  179.             return false
  180.           end
  181.         end
  182.         if @le_show
  183.           @le_trace[i-1,0] = x
  184.           @le_trace[i-1,1] = y
  185.         end
  186.       end
  187.     else
  188.       while difference_y.abs > i+1
  189.         i+=1
  190.         y = @y+i*direction_y
  191.         if direction_x>0
  192.           x = @x+i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  193.         else
  194.           x = @x-i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5
  195.         end
  196.         x = x.floor
  197.         y = y.floor
  198.         if @le_clairv != true
  199.           unless (direction_y > 0 ? passable?(x,y-1,2) : passable?(x,y+1,8))
  200.             @le_trace[i-1,0] = -1
  201.             return false
  202.           end
  203.         end
  204.         if @le_show
  205.           @le_trace[i-1,0] = x
  206.           @le_trace[i-1,1] = y
  207.         end
  208.       end
  209.     end
  210.     @le_trace[i,0] = -1
  211.     return true
  212.   end
  213. end
  214. #==============================================================================
  215. # ■ Spriteset_Map
  216. #------------------------------------------------------------------------------
  217. #    重载地图显示
  218. #==============================================================================
  219. class Spriteset_Map
  220.   attr_reader:tilemap
  221.   alias :original_le_initialize :initialize
  222.   def initialize
  223.     original_le_initialize
  224.     @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)
  225.   end
  226. end
  227. #==============================================================================
  228. # ■ Scene_Map
  229. #------------------------------------------------------------------------------
  230. #    重载地图场景
  231. #==============================================================================
  232. class Scene_Map
  233.   attr_reader:spriteset
  234.   #--------------------------------------------------------------------------
  235.   # ● 主角的场所移动
  236.   #--------------------------------------------------------------------------
  237.   alias original_le_transfer_player transfer_player
  238.   def transfer_player
  239.     # 自动关闭当前地图上le_seeing为true的NPC独立开关
  240.     if $game_map.map_id != $game_temp.player_new_map_id
  241.       for event in $game_map.events.values
  242.         if event.le_seeing
  243.           for key in $le_close_table
  244.             $game_self_switches[[$game_map.map_id,event.id, key]] =false
  245.           end
  246.         end
  247.       end
  248.     end
  249.     original_le_transfer_player
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # ● 主处理
  253.   #--------------------------------------------------------------------------
  254.   def main
  255.     # 生成活动块
  256.     @spriteset = Spriteset_Map.new
  257.     # 生成信息窗口
  258.     @message_window = Window_Message.new
  259.     # 执行过渡
  260.     Graphics.transition
  261.     # 主循环
  262.     loop do
  263.       # 刷新游戏画面
  264.       Graphics.update
  265.       # 刷新输入信息
  266.       Input.update
  267.       #==========================
  268.       # 清除LE视野产生的痕迹
  269.       #==========================
  270.       for event in $game_map.events.values
  271.         for i in 0 .. event.le_trace.xsize-1
  272.           break if event.le_trace[i,0] == -1
  273.           $scene.spriteset.tilemap.flash_data[event.le_trace[i,0],event.le_trace[i,1]] = 0
  274.         end
  275.          event.le_trace[0,0] = -1
  276.        end
  277.       #==========================
  278.       # 刷新画面
  279.       update
  280.       # 如果画面切换的话就中断循环
  281.       if $scene != self
  282.         break
  283.       end
  284.       #==========================
  285.       # 刷新LE视野路径
  286.       #==========================
  287.       for event in $game_map.events.values
  288.         for i in 0 .. event.le_trace.xsize-1
  289.           break if event.le_trace[i,0] == -1
  290.           $scene.spriteset.tilemap.flash_data[event.le_trace[i,0],event.le_trace[i,1]] = event.le_color
  291.         end
  292.       end
  293.       #==========================
  294.     end
  295.     # 准备过渡
  296.     Graphics.freeze
  297.     # 释放活动块
  298.     @spriteset.dispose
  299.     # 释放信息窗口
  300.     @message_window.dispose
  301.     # 标题画面切换中的情况下
  302.     if $scene.is_a?(Scene_Title)
  303.       # 淡入淡出画面
  304.       Graphics.transition
  305.       Graphics.freeze
  306.     end
  307.   end
  308. end
  309. #==============================================================================
  310. # ■ Scene_Title
  311. #------------------------------------------------------------------------------
  312. #  处理标题画面的类。
  313. #==============================================================================
  314. class Scene_Title
  315.   alias original_le_main main
  316.   def main
  317.     $le_run = true
  318.     $le_close_table = ["A","B","C","D"]
  319.     original_le_main
  320.   end
  321. end
  322. #==============================================================================
  323. # ■ Scene_Save
  324. #------------------------------------------------------------------------------
  325. #  处理存档画面的类。
  326. #==============================================================================
  327. class Scene_Save < Scene_File
  328.   # 写入两个全局变量
  329.   alias original_le_write_save_data write_save_data
  330.   def write_save_data(file)
  331.     original_le_write_save_data(file)
  332.     Marshal.dump($le_run,file)
  333.     Marshal.dump($le_close_table,file)
  334.   end
  335. end
  336. #==============================================================================
  337. # ■ Scene_Load
  338. #------------------------------------------------------------------------------
  339. #  处理读档画面的类。
  340. #==============================================================================
  341. class Scene_Load < Scene_File
  342.   # 读取两个全局变量
  343.   alias original_le_read_save_data read_save_data
  344.   def read_save_data(file)
  345.     original_le_read_save_data(file)
  346.     $le_run         = Marshal.load(file)
  347.     $le_close_table = Marshal.load(file)
  348.   end
  349. end
  350. #==============================================================================
  351. #                                 The End
  352. #==============================================================================

2.21其实只是为了支持VX和ACE而改写的版本,功能和2.2是一样的。
而范例请见我之前发的帖子。
这里给出一个ACE的LE范例游戏:
[ACT] [游戏发布] 魔法妹子卖萌求生 试行版
http://rpg.blue/forum.php?mod=viewthread&tid=238881&page=1#pid1942076

评分

参与人数 1+10 收起 理由
Shy07 + 10 主站收录

查看全部评分

在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。

Lv3.寻梦者

梦石
0
星屑
1433
在线时间
1705 小时
注册时间
2011-8-17
帖子
818
4
发表于 2014-9-6 14:57:29 | 只看该作者
LZ大大,我使用这个事件管理器(https://rpg.blue/thread-341787-1-1.html)以后发现没法共存,这个脚本的功能室将其他地图的事件移过来,而这个事件在那张地图上ID是001而现在的地图上也有个ID001的事件,然后当我执行视野脚本的时候就只会影响到当前地图的ID001事件,移过来的没用。。。不知道LZ大大能不能通过事件名称控制而不是ID呢?
roguelike求生RPG研发中....
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
100
在线时间
211 小时
注册时间
2011-8-16
帖子
300
3
发表于 2013-12-17 18:25:26 | 只看该作者
157行 笑喷
话说我自己写的视线也是用到了标示符 see 楼主,有缘哦~
RPGMaker 脚本/学习交流群:143356012
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
201 小时
注册时间
2012-4-8
帖子
466
2
发表于 2012-7-6 11:14:30 | 只看该作者
楼主那个签名- -好吧~
义三国系统更改中,预计长期坑化
好游戏的标准:
创意,完整度,人性化,独立性
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
341
在线时间
453 小时
注册时间
2009-10-2
帖子
125
1
发表于 2012-7-6 07:53:31 | 只看该作者
辛苦了,楼主
...
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-4 01:06

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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