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

Project1

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

[已经解决] 请问流川枫大大的le线型视野脚本怎么用

[复制链接]

Lv1.梦旅人

梦石
0
星屑
705
在线时间
1 小时
注册时间
2015-10-4
帖子
4
跳转到指定楼层
1
发表于 2015-10-4 10:49:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x

# ■ LCF_Leyeshot (linetype eyeshot)ACE 2.21    Creator LCF  Date 2009.7.6

#------------------------------------------------------------------------------

#  线形视野系统    编者:流川枫   QQ:350773875

#==============================================================================

#【使用说明】

#------------------------------------------------------------------------------

# 视野系统开关    $game_map.events[@event_id].le_seeing = true/false

# 功能:该值为true表示该NPC视野开启,否则未开启,默认为false。

#------------------------------------------------------------------------------

# 视野透视开关    $game_map.events[@event_id].le_clairv = true/false

# 功能:该值为true表示该NPC视野不扫描视线障碍,否则扫描,默认为false。

#------------------------------------------------------------------------------

# 视线显示开关    $game_map.events[@event_id].le_show = true/false

# 功能:该值为true表示显示该NPC的视线,否则不显示,默认为false。

#------------------------------------------------------------------------------

# 看见时显示开关    $game_map.events[@event_id].le_ss = true/false

# 功能:该值为true表示只有当NPC看见主角时才显示视线,否则一直显示,默认为false。

#------------------------------------------------------------------------------

# 侧面可视开关    $game_map.events[@event_id].le_side = true/false

# 功能:该值为true表示该NPC可以看到侧面一格内的人,否则由斜率决定,默认为true。

#------------------------------------------------------------------------------

# 视野环绕开关    $game_map.events[@event_id].le_circle = true/false

# 功能:该值为true表示该NPC为环绕视野,否则不能看见自己的身后,默认为false。

#------------------------------------------------------------------------------

# 设置视野深度    $game_map.events[@event_id].le_deepness = 深度值

# 功能:该值代表视野的能见度,当视野模型为扇形时应避免设置成奇数,默认为8。

#------------------------------------------------------------------------------

# 设置视野斜率    $game_map.events[@event_id].le_slope = 斜率值

# 功能:该值代表视野的斜率,默认为1.0。

#------------------------------------------------------------------------------

# 设置显示颜色    $game_map.events[@event_id].le_color = 颜色值

# 功能:该值代表视线显示的颜色,默认为0xf0。

#------------------------------------------------------------------------------

# 设置触发开关    $game_map.events[@event_id].le_skey = "A"/"B"/"C"/"D"(大写)

# 功能:该值指定了映射是否看见主角的状态的独立开关,默认为"D"。

#------------------------------------------------------------------------------

# 设置键开关    $game_map.events[@event_id].le_kw = true/false

# 功能:该值表示是否将该NPC触发状态映射到触发开关指定的独立变量中,默认为true。

#------------------------------------------------------------------------------

# 设置触发确认    $game_map.events[@event_id].le_true = true/false

# 功能:该值表示该NPC是否看见了主角,等价于触发开关,默认为false。

#------------------------------------------------------------------------------

# 设置视野模型    $game_map.events[@event_id].le_mode = 0/1

# 功能:该值为0时表示该NPC的视野形状类扇形,为1时类三角形,默认为0。

#==============================================================================

# 全局视野开关    $le_run = true/false

# 功能:该值为true表示系统正常工作,否则终止所有NPC的视野,默认为true。

#------------------------------------------------------------------------------

# 全局关闭列表    $le_close_table = ["A","B","C","D"]

# 功能:不同场景转移时,将自动关闭表里的独立开关。(只针对le_seeing为true的NPC)

#==============================================================================

# 当NPC看见主角,独立开关(le_skey)便会被打开,否则为关闭状态。

#==============================================================================



#==============================================================================

# ■ Game_Event

#------------------------------------------------------------------------------

#  重载事件类

#==============================================================================

class Game_Event

  attr_accessor   :le_seeing                 # 视野系统开关

  attr_accessor   :le_clairv                 # 视野透视开关

  attr_accessor   :le_show                   # 视线显示开关

  attr_accessor   :le_ss                     # 看见时显示开关

  attr_accessor   :le_side                   # 侧面可视开关

  attr_accessor   :le_circle                 # 视野环绕开关

  attr_accessor   :le_deepness               # 视野深度

  attr_accessor   :le_slope                  # 视野斜率

  attr_accessor   :le_color                  # 显示颜色

  attr_accessor   :le_trace                  # 视野痕迹

  attr_accessor   :le_skey                   # 触发开关

  attr_accessor   :le_kw                     # 键开关

  attr_accessor   :le_true                   # 触发确认

  attr_accessor   :le_mode                   # 视野模型

  #--------------------------------------------------------------------------

  LE_DEEPNESS_OFFSET = 1                     # 深度缓存的偏移

  #--------------------------------------------------------------------------

  # ● 初始化对像

  #     map_id : 地图 ID

  #     event  : 事件 (RPG::Event)

  #--------------------------------------------------------------------------

  alias original_le_initialize initialize

  def initialize (map_id, event)

    original_le_initialize(map_id, event)

    @le_seeing   = false

    @le_clairv   = false

    @le_show     = false

    @le_ss       = false

    @le_side     = true

    @le_circle   = false

    @le_deepness = 8

    @le_slope    = 1.0

    @le_color    = 0xf0

    @le_trace = Table.new(@le_deepness-LE_DEEPNESS_OFFSET,2)

    @le_trace[0,0] = -1

    @le_kw   = true

    @le_true = false

    @le_mode = 0

    @le_skey = "D"

  end

  #--------------------------------------------------------------------------

  # ● 刷新

  #--------------------------------------------------------------------------

  alias original_le_update update

  def update

    original_le_update

    if @le_seeing and $le_run

      @le_trace.resize(@le_deepness-LE_DEEPNESS_OFFSET,2) if @le_trace.xsize+LE_DEEPNESS_OFFSET != @le_deepness

      self.see

      if @le_kw

        $game_map.need_refresh = true if @le_true != $game_self_switches[[$game_map.map_id, @id, @le_skey]]

        $game_self_switches[[$game_map.map_id, @id, @le_skey]] = @le_true

      end

    end

  end

  #--------------------------------------------------------------------------

  # ● 视野检测

  #--------------------------------------------------------------------------

  def see

    @le_true = false

    if ($game_player.x-@x).abs<@le_deepness and ($game_player.y-@y).abs<@le_deepness

      difference_x = ($game_player.x - @x).abs

      difference_y = ($game_player.y - @y).abs

      case @direction

      when 2

        return if @le_circle != true and $game_player.y < @y

        unless @le_side and (difference_y == 0 and difference_x == 1)

          return if difference_x.to_f/difference_y > @le_slope

        end

      when 4

        return if @le_circle != true and $game_player.x > @x

        unless @le_side and difference_y == 1 and difference_x == 0

          return if difference_y.to_f/difference_x > @le_slope

        end

      when 6

        return if @le_circle != true and $game_player.x < @x

        unless @le_side and difference_y == 1 and difference_x == 0

          return if difference_y.to_f/difference_x > @le_slope

        end

      else

        return if @le_circle != true and $game_player.y > @y

        unless @le_side and difference_y == 0 and difference_x == 1

          return if difference_x.to_f/difference_y > @le_slope

        end

      end

      if @le_mode == 0

        return if (difference_x ** 2 + difference_y ** 2) > le_deepness ** 2

      end

      @le_true = scan_line

      if @le_ss and @le_true !=true

        @le_trace[0,0] = -1

      end

    end

  end

  #--------------------------------------------------------------------------

  # ● 视线检测   采用了国际领先的视线扫描算法!

  #--------------------------------------------------------------------------

  def scan_line

    difference_x = $game_player.x - @x

    difference_y = $game_player.y - @y

    direction_x = (difference_x > 0 ? 1 : -1)

    direction_y = (difference_y > 0 ? 1 : -1)

    i = 0

    if difference_x.abs > difference_y.abs

      while difference_x.abs > i+1

        i+=1

        x = @x+i*direction_x

        if direction_y>0

          y = @y+i*difference_y/difference_x.to_f*direction_y*direction_x+0.5

        else

          y = @y-i*difference_y/difference_x.to_f*direction_y*direction_x+0.5

        end

        x = x.floor

        y = y.floor

        if @le_clairv != true

          unless (direction_x > 0 ? passable?(x-1,y,6) : passable?(x+1,y,4))

            @le_trace[i-1,0] = -1

            return false

          end

        end

        if @le_show

          @le_trace[i-1,0] = x

          @le_trace[i-1,1] = y

        end

      end

    else

      while difference_y.abs > i+1

        i+=1

        y = @y+i*direction_y

        if direction_x>0

          x = @x+i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5

        else

          x = @x-i*difference_x/(difference_y+0.0)*direction_x*direction_y+0.5

        end

        x = x.floor

        y = y.floor

        if @le_clairv != true

          unless (direction_y > 0 ? passable?(x,y-1,2) : passable?(x,y+1,8))

            @le_trace[i-1,0] = -1

            return false

          end

        end

        if @le_show

          @le_trace[i-1,0] = x

          @le_trace[i-1,1] = y

        end

      end

    end

    @le_trace[i,0] = -1

    return true

  end

end

#==============================================================================

# ■ Spriteset_Map

#------------------------------------------------------------------------------

#    重载地图显示

#==============================================================================

class Spriteset_Map

  attr_reader:tilemap

  alias :original_le_initialize :initialize

  def initialize

    original_le_initialize

    @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)

  end

end

#==============================================================================

# ■ Game_Player

#------------------------------------------------------------------------------

#    重载玩家

#==============================================================================

class Game_Player < Game_Character

  attr_reader:new_map_id

end

#==============================================================================

# ■ Scene_Map

#------------------------------------------------------------------------------

#    重载地图场景

#==============================================================================

class Scene_Map

  attr_reader:spriteset

  #--------------------------------------------------------------------------

  # ● 场所移动前的处理

  #--------------------------------------------------------------------------

  alias original_le_pre_transfer pre_transfer

  def pre_transfer

    original_le_pre_transfer

    # 自动关闭当前地图上le_seeing为true的NPC独立开关

    if $game_map.map_id != $game_player.new_map_id

      for event in $game_map.events.values

        if event.le_seeing

          for key in $le_close_table

            $game_self_switches[[$game_map.map_id,event.id, key]] =false

          end

        end

      end

    end

  end

  #--------------------------------------------------------------------------

  # ● 更新画面

  #--------------------------------------------------------------------------

  #alias original_le_update update

  def update

    super

      #==========================

      # 清除LE视野产生的痕迹

      #==========================

      for event in $game_map.events.values

        for i in 0 .. event.le_trace.xsize-1

          break if event.le_trace[i,0] == -1

          @spriteset.tilemap.flash_data[event.le_trace[i,0],event.le_trace[i,1]] = 0

        end

         event.le_trace[0,0] = -1

       end

      #==========================



    $game_map.update(true)

    $game_player.update

    $game_timer.update

    @spriteset.update

    update_scene if scene_change_ok?

      #==========================

      # 刷新LE视野路径

      #==========================

      for event in $game_map.events.values

        for i in 0 .. event.le_trace.xsize-1

          break if event.le_trace[i,0] == -1

          @spriteset.tilemap.flash_data[event.le_trace[i,0],event.le_trace[i,1]] = event.le_color

        end

      end

      #==========================

  end

end

#==============================================================================

# ■ Scene_Title

#------------------------------------------------------------------------------

#  处理标题画面的类。

#==============================================================================

class Scene_Title

  alias original_le_main main

  def main

    $le_run = true

    $le_close_table = ["A","B","C","D"]

    original_le_main

  end

end

#==============================================================================

# ■ DataManager

#------------------------------------------------------------------------------

#  处理存档。

#==============================================================================

module DataManager

  # 写入两个全局变量

  def self.save_game_without_rescue(index)

    File.open(make_filename(index), "wb") do |file|

      $game_system.on_before_save

      Marshal.dump(make_save_header, file)

      Marshal.dump(make_save_contents, file)

      @last_savefile_index = index

      Marshal.dump($le_run,file)

      Marshal.dump($le_close_table,file)

    end

    return true

  end

  def self.load_game_without_rescue(index)

    File.open(make_filename(index), "rb") do |file|

      Marshal.load(file)

      extract_save_contents(Marshal.load(file))

      reload_map_if_updated

      @last_savefile_index = index

      $le_run         = Marshal.load(file)

      $le_close_table = Marshal.load(file)

    end

    return true

  end

end

#==============================================================================

#                                 The End

#==============================================================================

我是小白,完全看不懂脚本,请求走过路过的大大们教教我怎么用吧(ノ゚∀゚)ノ

点评

先告诉你一个问题:插入脚本请用编辑区倒数第二栏里的“添加代码文字”,不然太长了,看起来很不方便......+1  发表于 2015-10-4 12:04

Lv5.捕梦者

梦石
0
星屑
30890
在线时间
608 小时
注册时间
2014-7-18
帖子
729

开拓者

2
发表于 2015-10-4 12:01:50 | 只看该作者
本帖最后由 xjzsq 于 2015-10-4 12:03 编辑

首先,我必须先告诉你一个问题:插入脚本请用编辑区倒数第二栏里的“添加代码文字”,不然太长了,看起来很不方便......
这里已经说得很清楚了啊:
RUBY 代码复制
  1. #==============================================================================
  2.  
  3. #【使用说明】
  4.  
  5. #------------------------------------------------------------------------------
  6.  
  7. # 视野系统开关    $game_map.events[@event_id].le_seeing = true/false
  8.  
  9. # 功能:该值为true表示该NPC视野开启,否则未开启,默认为false。
  10.  
  11. #------------------------------------------------------------------------------
  12.  
  13. # 视野透视开关    $game_map.events[@event_id].le_clairv = true/false
  14.  
  15. # 功能:该值为true表示该NPC视野不扫描视线障碍,否则扫描,默认为false。
  16.  
  17. #------------------------------------------------------------------------------
  18.  
  19. # 视线显示开关    $game_map.events[@event_id].le_show = true/false
  20.  
  21. # 功能:该值为true表示显示该NPC的视线,否则不显示,默认为false。
  22.  
  23. #------------------------------------------------------------------------------
  24.  
  25. # 看见时显示开关    $game_map.events[@event_id].le_ss = true/false
  26.  
  27. # 功能:该值为true表示只有当NPC看见主角时才显示视线,否则一直显示,默认为false。
  28.  
  29. #------------------------------------------------------------------------------
  30.  
  31. # 侧面可视开关    $game_map.events[@event_id].le_side = true/false
  32.  
  33. # 功能:该值为true表示该NPC可以看到侧面一格内的人,否则由斜率决定,默认为true。
  34.  
  35. #------------------------------------------------------------------------------
  36.  
  37. # 视野环绕开关    $game_map.events[@event_id].le_circle = true/false
  38.  
  39. # 功能:该值为true表示该NPC为环绕视野,否则不能看见自己的身后,默认为false。
  40.  
  41. #------------------------------------------------------------------------------
  42.  
  43. # 设置视野深度    $game_map.events[@event_id].le_deepness = 深度值
  44.  
  45. # 功能:该值代表视野的能见度,当视野模型为扇形时应避免设置成奇数,默认为8。
  46.  
  47. #------------------------------------------------------------------------------
  48.  
  49. # 设置视野斜率    $game_map.events[@event_id].le_slope = 斜率值
  50.  
  51. # 功能:该值代表视野的斜率,默认为1.0。
  52.  
  53. #------------------------------------------------------------------------------
  54.  
  55. # 设置显示颜色    $game_map.events[@event_id].le_color = 颜色值
  56.  
  57. # 功能:该值代表视线显示的颜色,默认为0xf0。
  58.  
  59. #------------------------------------------------------------------------------
  60.  
  61. # 设置触发开关    $game_map.events[@event_id].le_skey = "A"/"B"/"C"/"D"(大写)
  62.  
  63. # 功能:该值指定了映射是否看见主角的状态的独立开关,默认为"D"。
  64.  
  65. #------------------------------------------------------------------------------
  66.  
  67. # 设置键开关    $game_map.events[@event_id].le_kw = true/false
  68.  
  69. # 功能:该值表示是否将该NPC触发状态映射到触发开关指定的独立变量中,默认为true。
  70.  
  71. #------------------------------------------------------------------------------
  72.  
  73. # 设置触发确认    $game_map.events[@event_id].le_true = true/false
  74.  
  75. # 功能:该值表示该NPC是否看见了主角,等价于触发开关,默认为false。
  76.  
  77. #------------------------------------------------------------------------------
  78.  
  79. # 设置视野模型    $game_map.events[@event_id].le_mode = 0/1
  80.  
  81. # 功能:该值为0时表示该NPC的视野形状类扇形,为1时类三角形,默认为0。
  82.  
  83. #==============================================================================
  84.  
  85. # 全局视野开关    $le_run = true/false
  86.  
  87. # 功能:该值为true表示系统正常工作,否则终止所有NPC的视野,默认为true。
  88.  
  89. #------------------------------------------------------------------------------
  90.  
  91. # 全局关闭列表    $le_close_table = ["A","B","C","D"]
  92.  
  93. # 功能:不同场景转移时,将自动关闭表里的独立开关。(只针对le_seeing为true的NPC)
  94.  
  95. #==============================================================================
  96.  
  97. # 当NPC看见主角,独立开关(le_skey)便会被打开,否则为关闭状态。
  98.  
  99. #==============================================================================



你在地图里设置一个事件,设置为自动执行,然后先输入:$game_map.events[事件ID].le_seeing = true(事件ID为你想打开本脚本功能的NPC的事件ID,下同),

再输入你想实现的功能对应的命令就可以了

举个例子:如果你想显示视野,就输入$game_map.events[事件ID].le_show = true,就这样~

注意要先改好事件ID和“=”后面的参数(true/false/A/B/C/D等等)


点评

这个嘛...... 简单说,等待几帧就好了,仔细介绍起来太麻烦了 你可以参照这个里面的设置: http://rm.66rpg.com/thread-245657-1-1.html 就是图书馆里的那个帖。   发表于 2015-10-4 20:46
谢谢!按照你说的试了一下,现在的状态是主角走到敌人视野范围里能看到显示视野,但是要敌人发现主角就冲过来扑倒(误),要怎么设置呢?  发表于 2015-10-4 17:55
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
705
在线时间
1 小时
注册时间
2015-10-4
帖子
4
3
 楼主| 发表于 2015-10-4 18:03:28 | 只看该作者
xjzsq 发表于 2015-10-4 12:01
首先,我必须先告诉你一个问题:插入脚本请用编辑区倒数第二栏里的“添加代码文字”,不然太长了,看起来很 ...

有好多个触发开关设置,搞不清楚分别干嘛用的,能给我说说吗?感谢!
  1. # 设置触发开关    $game_map.events[@event_id].le_skey = "A"/"B"/"C"/"D"(大写)

  2. # 功能:该值指定了映射是否看见主角的状态的独立开关,默认为"D"。

  3. #------------------------------------------------------------------------------

  4. # 设置键开关    $game_map.events[@event_id].le_kw = true/false

  5. # 功能:该值表示是否将该NPC触发状态映射到触发开关指定的独立变量中,默认为true。

  6. #------------------------------------------------------------------------------

  7. # 设置触发确认    $game_map.events[@event_id].le_true = true/false

  8. # 功能:该值表示该NPC是否看见了主角,等价于触发开关,默认为false。
复制代码
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
30890
在线时间
608 小时
注册时间
2014-7-18
帖子
729

开拓者

4
发表于 2015-10-4 21:01:48 | 只看该作者
本帖最后由 xjzsq 于 2015-10-4 22:44 编辑
abumyo 发表于 2015-10-4 18:03
有好多个触发开关设置,搞不清楚分别干嘛用的,能给我说说吗?感谢!

(均为个人理解,对答案的准确性概不负责^_^)
第一个,就是对应事件里面的独立开关,如果看见了,就打开独立开关D,你可以自己设置NPC的动作,
第二个,是否把NPC触发状态存到独立变量中(也许是供调试用,或实现其他功能)
第三个,就是设置NPC是否看见主角(只是个人理解+1),即使不在看见范围之内,也强迫看见(感觉有点......)

评分

参与人数 1星屑 +200 收起 理由
taroxd + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
705
在线时间
1 小时
注册时间
2015-10-4
帖子
4
5
 楼主| 发表于 2015-10-5 10:07:46 | 只看该作者
xjzsq 发表于 2015-10-4 21:01
(均为个人理解,对答案的准确性概不负责^_^)
第一个,就是对应事件里面的独立开关,如果看见了,就打开 ...

好的我摸索一下,谢谢啦!!!(〃∀〃)
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 22:55

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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