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

Project1

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

Leyeshot2.1线形视野系统,做暗杀类游戏的葵花宝典!

 关闭 [复制链接]

Lv2.观梦者

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

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

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

x

  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,插入此脚本全部内容。请详见脚本里的使用说明和范例。
脚本冲突:一些地图类。其实可能性比较小。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-8-15
帖子
98
44
发表于 2009-11-3 21:20:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
43
 楼主| 发表于 2009-10-8 21:17:18 | 只看该作者
LE2.1有BUG,而LE2.2已经相当完善了。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
42
 楼主| 发表于 2009-10-8 20:04:07 | 只看该作者
本帖最后由 流川枫 于 2009-10-8 20:05 编辑

这个脚本系统我这儿已经从LE2.1到LE2.1SP更新到LE2.2了。范例忍者暗杀小游戏也基本完成了。
只不过我懒得发布。。。
话说如果还可能更新的话,下一个版本肯定会加入NPC除了可以看见主角外还能看见自己人。
但是我懒得写了。。。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1140
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

41
发表于 2009-10-4 18:01:28 | 只看该作者
貌似强大得不得了阿

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-10-3
帖子
9
40
发表于 2009-10-3 23:10:00 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
34 小时
注册时间
2006-6-19
帖子
111
39
发表于 2009-9-22 12:57:59 | 只看该作者
你可以用 上帝的眼睛 的脚本
http://rpg.blue/viewthread.php?tid=133326&extra=page%3D2

有无冲突不知
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
1 小时
注册时间
2009-7-24
帖子
43
38
发表于 2009-8-30 13:23:42 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
37
 楼主| 发表于 2009-7-7 21:30:53 | 只看该作者
LE2.2开发告一段落了,过段时间发布。因为我得做个范例游戏呀,是很久以前约定的 暗杀类游戏啊~~
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
36
 楼主| 发表于 2008-11-13 05:00:05 | 只看该作者
以下引用皇贞季于2008-11-12 20:38:50的发言:

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

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

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

实在不会的话,加我QQ。我明天之后就不能上网了,所以要加就快点。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-23 23:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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