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

Project1

 找回密码
 注册会员
搜索
楼主: 流川枫
打印 上一主题 下一主题

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

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
22
 楼主| 发表于 2008-11-6 05:10:30 | 只看该作者
以下引用Sora于2008-11-5 18:54:01的发言:

我提个意见可以么
不知道是我不会用,还是确实存在这个缺陷
我设置一个事件,在D开关打开时,移动方式变成靠近主角,然后是与主角接触时战斗处理,模拟当NPC看见主角时,过去与之战斗
我遇到的问题是,比如当主角在事件左下方时,刚好进入事件视野,按4方向行走,NPC要靠近主角,就会往左走,当事件面一朝左,主角就不在视野内了,NPC就不动了……

这是设计上的 流程 问题。
正确的流程如下:

(第一种方案)在看到主角的 事件层里 关闭 可视开关,这样 独立开关D 就不会被关闭。你就可以 靠近主角,直到接触主角,触发战斗等。

(第二种方案)在看到主角的 事件层里 打开另一个独立开关B,当 独立开关D又被关上的时候,由于开了独立开关B,所以由 另外一个事件层 来处理 看见主角后又再次看不见主角时 的程序。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
25
 楼主| 发表于 2008-11-8 02:15:19 | 只看该作者
以下引用178818872于2008-11-7 16:54:20的发言:


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

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
26
 楼主| 发表于 2008-11-8 07:18:15 | 只看该作者

  1. #==============================================================================
  2. # ■ LCF_Leyeshot (linetype eyeshot)VX 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 ? map_passable?(x,y) : map_passable?(x,y))
  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 ? map_passable?(x,y) : map_passable?(x,y))
  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
复制代码

这个是LE2.1的VX版本。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
27
 楼主| 发表于 2008-11-9 07:09:08 | 只看该作者
原来的RE系统已经推翻,请版主看到后 把原来的发布帖更新为LE系统。谢谢
http://rpg.blue/web/htm/news1183.htm
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
6 小时
注册时间
2008-9-28
帖子
103
28
发表于 2008-11-9 22:17:15 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
394 小时
注册时间
2007-4-2
帖子
954
29
发表于 2008-11-9 23:07:39 | 只看该作者
并行处理。。。。{/fd}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
24 小时
注册时间
2005-10-21
帖子
55
30
发表于 2008-11-11 20:33:46 | 只看该作者
{/fd}感谢发布啊。这个感觉确实很棒。。。刚才在测试的过程中也发现了个问题,如果触发之后就是某个NPC的独立D启动看到了主角。这时候如果因为事件发生了场景转换,回归的时候,这个开关会处于永远开启的状态。。。比如,会追踪主角的NPC之后不断的追踪,54视野了。。。像你的范例里的那个场所移动,就会发生,不断的自动移动,无限循环。。。= =+求解。。。
QQ:345762628  MSN:[email protected]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 12:46

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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