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

Project1

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

[已经过期] 请问LE线形视野系统的视线正确用法...

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4947
在线时间
920 小时
注册时间
2015-7-1
帖子
364
跳转到指定楼层
1
发表于 2017-12-3 10:47:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 L7-wind 于 2017-12-3 10:45 编辑

1.不知道怎么设置视线颜色...






好懵...
2.当我在游戏中设置$game_map.events[002].le_ss = false
时游戏就卡住了.


3.这是代码:
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. #==============================================================================


这个脚本的范例工程我没法下载...
所以没法参考工程调试...
其他的我都没来得及试...
【四季】已上架steam!欢迎大家来玩!

Lv5.捕梦者 (版主)

梦石
1
星屑
23999
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

2
发表于 2017-12-3 13:22:26 手机端发表。 | 只看该作者
额,脚事件脚本最后一行返回false时会卡住,在下面加一行注释就好了。以及0开头的002是八进制的数字。

点评

010 = 8,10 = 10  发表于 2017-12-3 19:56
我刚刚试了加注释不行...应该是我操作不对...然而我并不懂你所说的八进制...  发表于 2017-12-3 17:44
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4947
在线时间
920 小时
注册时间
2015-7-1
帖子
364
3
 楼主| 发表于 2017-12-4 20:29:35 | 只看该作者
有没有人给个范例工程让我参考下...
【四季】已上架steam!欢迎大家来玩!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 14:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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