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

Project1

 找回密码
 注册会员
搜索
查看: 14197|回复: 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
在线时间
333 小时
注册时间
2007-4-11
帖子
5369

贵宾

2
发表于 2008-11-3 23:14:11 | 只看该作者
{/gg}{/gg}

不知道怎么说了。。。。。很好
6R复活?别扯淡了.

柳柳一旦接手66RPG,我果断呵呵啊。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
4
 楼主| 发表于 2008-11-4 01:07:37 | 只看该作者
以下引用Sora于2008-11-3 16:44:27的发言:

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

当NPC看到主角的时候,独立开关D会被打开。
你可以设置一个事件层,当独立开关D打开的时候,
就代表看的了主角,你在里面写上看到主角后的 指令就行了。
例如:触发 战斗{/cy}
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
190
在线时间
83 小时
注册时间
2007-6-26
帖子
264
5
发表于 2008-11-4 01:39:34 | 只看该作者
{/hx}研究研究
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
6
 楼主| 发表于 2008-11-4 05:38:11 | 只看该作者
范例中有一个人在房间里巡逻,玩家必须神不知鬼不觉地走到那人身后(包括侧面),然后马上按确定键,就表示这次偷袭成功了。
放到成品的游戏里,可以在那个时候显示一段动画,干掉那个人,就变成了一款有趣的忍者暗杀游戏了。{/cy}
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
394 小时
注册时间
2007-4-2
帖子
954
7
发表于 2008-11-4 17:40:02 | 只看该作者
{/se}{/dk}范例貌似不能下啊
回复 支持 反对

使用道具 举报

Lv5.捕梦者

御灵的宠物

梦石
12
星屑
8438
在线时间
88 小时
注册时间
2006-12-11
帖子
3148

第2届TG大赛亚军

8
发表于 2008-11-4 18:12:48 | 只看该作者
速度是关键~~
原本FDR大人也写过一个
但是那个速度太慢太慢了
这个视野系统目前有几格?
如果是30x30的地图,放20个事件,会卡吗?
我的Lofter:http://nightoye.lofter.com/

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
9
 楼主| 发表于 2008-11-5 00:07:11 | 只看该作者
以下引用水迭澜于2008-11-4 10:12:48的发言:

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


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

我刚才测试了一下 LE2.1,地图大小在500*500 并且NPC 20人的情况下,
FPS平均率仍然保持在40左右。{/hx}
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-8-30
帖子
57
10
发表于 2008-11-5 02:58:26 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 14:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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