幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4408|回复: 9

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

[复制链接]

8

主题

63

帖子

570

积分

⑤进阶

积分
570
发表于 2008-11-5 16:11:18 | 显示全部楼层 |阅读模式
#==============================================================================
# ■ LCF_Leyeshot (linetype eyeshot)XP 2.1    Creator LCF  Date 2008.11.3
#------------------------------------------------------------------------------
#  线形视野系统    编者:流川枫    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_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 = 深度值
# 功能:该值代表视野的能见度,默认为7。
#------------------------------------------------------------------------------
# 设置视野斜率    $game_map.events[@event_id].le_slope = 斜率值
# 功能:该值代表视野的斜率,默认为1.0。
#------------------------------------------------------------------------------
# 设置显示颜色    $game_map.events[@event_id].le_color = 颜色值
# 功能:该值代表视线显示的颜色,默认为0xf0。
#==============================================================================
# 当NPC看到主角的时候,独立开关D会被打开,否则为关闭状态。
#==============================================================================

#==============================================================================
# ■ Game_Event
#------------------------------------------------------------------------------
#  重载事件类
#==============================================================================
class Game_Event
  attr_accessor   :le_seeing                 # 视野系统开关
  attr_accessor   :le_clairv                 # 视野透视开关
  attr_accessor   :le_show                   # 视线显示开关
  attr_accessor   :le_side                   # 侧面可视开关
  attr_accessor   :le_circle                 # 视野环绕开关
  attr_accessor   :le_deepness               # 视野深度
  attr_accessor   :le_slope                  # 视野斜率
  attr_accessor   :le_color                  # 显示颜色
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     map_id : 地图 ID
  #     event  : 事件 (RPG::Event)
  #--------------------------------------------------------------------------
  alias original_initialize initialize
  def initialize (map_id, event)
    original_initialize (map_id, event)
    @le_seeing   = false
    @le_clairv   = false
    @le_show     = false
    @le_side     = true
    @le_circle   = false
    @le_deepness = 7
    @le_slope    = 1.0
    @le_color    = 0xf0
    @trace = Table.new (@le_deepness,2)
    @trace[0,0] = -1
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  alias original_update update
  def update
    if @le_seeing
      @trace.resize (@le_deepness,2) if @trace.xsize != @le_deepness
      original_switch = $game_self_switches[[$game_map.map_id, @id, "D"]]
      self.see
      $game_map.need_refresh = true if original_switch != $game_self_switches[[$game_map.map_id, @id, "D"]]
    end
    original_update
  end
  #--------------------------------------------------------------------------
  # ● 视野检测
  #--------------------------------------------------------------------------
  def see
    $game_self_switches[[$game_map.map_id, @id, "D"]] = false
    if ($game_player.x-@x).abs<@le_deepness and ($game_player.y-@y).abs<@le_deepness
      difference_x = $game_player.x - @x
      difference_y = $game_player.y - @y
      case @direction
      when 2
        return if @le_circle != true and $game_player.y < @y
        unless @le_side and (difference_y == 0 and difference_x.abs == 1)
          return if (difference_y/(difference_x+0.0)).abs < @le_slope
        end
      when 4
        return if @le_circle != true and $game_player.x > @x
        unless @le_side and difference_y.abs == 1 and difference_x == 0
          return if (difference_x/(difference_y+0.0)).abs < @le_slope
        end
      when 6
        return if @le_circle != true and $game_player.x < @x
        unless @le_side and difference_y.abs == 1 and difference_x == 0
          return if (difference_x/(difference_y+0.0)).abs < @le_slope
        end
      else
        return if @le_circle != true and $game_player.y > @y
        unless @le_side and difference_y == 0 and difference_x.abs == 1
          return if (difference_y/(difference_x+0.0)).abs < @le_slope
        end
      end
      $game_self_switches[[$game_map.map_id, @id, "D"]] = scan_line
    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+0.0)*direction_y*direction_x+0.5
        else
          y = @y-i*difference_y/(difference_x+0.0)*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))
            @trace[i-1,0] = -1
            return false
          end
        end
        if @le_show
          @trace[i-1,0] = x
          @trace[i-1,1] = y
          $scene.spriteset.tilemap.flash_data[x,y] = @le_color
        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))
            @trace[i-1,0] = -1
            return false
          end
        end
        if @le_show
          @trace[i-1,0] = x
          @trace[i-1,1] = y
          $scene.spriteset.tilemap.flash_data[x,y] = @le_color
        end
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 清楚痕迹
  #--------------------------------------------------------------------------
  def clear
    for i in 0 .. @trace.xsize-1
      break if @trace[i,0] == -1
      $scene.spriteset.tilemap.flash_data[@trace[i,0],@trace[i,1]] = 0
    end
    @trace[0,0] = -1
  end
end
#==============================================================================
# ■ Spriteset_Map
#------------------------------------------------------------------------------
#    重载地图显示
#==============================================================================
class Spriteset_Map
  attr_reader:tilemap
  alias riginal_ini :initialize
  def initialize
    original_ini
    @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)
  end  
end
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#    重载地图场景
#==============================================================================
class Scene_Map
  attr_reader:spriteset
end
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
#  重载地图类
#==============================================================================
class Game_Map
  alias original_update update
  def update
    # 清除视线痕迹
    for event in @events.values
      event.clear
    end
    original_update
  end
end


-------------------------------
范例下载:
ftp://new3@ftp3.66rpg.com/game/LCF_Leyeshot系统范例v2.10.rar
-------------------------------

LE2.1优化了视线痕迹清除的程序,这样一来地图不管有多大,都不会影响到效率了![/COLOR]

{/cy}
本次系统的革新已经完全打破了传统的束缚!
和过去的RE系统比起来,全新的LE视野系统简直太好太强大了!
同屏这么多人联动,但是FPS仍然这么流畅~~
最棒的是,虽然效率如此之高,但是却一点都
没有影响 视野障碍检测 的精确度!
之所以这个视野系统能够这么强大,正是因
为该系统采用了国际领先的视线扫描算法!
全程只需要扫描一条 NPC与主角相连 的视线
即可,因此效率和视野逻辑都是最好的!

原来的RE算法我已经完全推翻了,现在的LE是一种新的算法,
所以我又开了一个新帖。

截图:


http://bbs.66rpg.com/forumTopicRead.asp?id=108850
回复

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2008-11-5 17:27:28 | 显示全部楼层
和本站范例里的那个很像啊


功能还没有哪个强大呢
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

8

主题

63

帖子

570

积分

⑤进阶

积分
570
 楼主| 发表于 2008-11-5 21:19:28 | 显示全部楼层
引用第1楼secondsen于2008-11-05 17:27发表的  :
和本站范例里的那个很像啊


功能还没有哪个强大呢
哪个站?
我的这个系统是现今RMXP里,效率最高,视线障碍最精确的视野系统了。
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2008-11-5 21:48:11 | 显示全部楼层
置顶。。。就是很卡。。。如果事件很多的话
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

8

主题

63

帖子

570

积分

⑤进阶

积分
570
 楼主| 发表于 2008-11-5 21:51:24 | 显示全部楼层
引用第3楼secondsen于2008-11-05 21:48发表的  :
置顶。。。就是很卡。。。如果事件很多的话
LE系统就是为了解决效率问题,而开发的。
用原来的锥形视野系统,我5个NPC就已经跑不动了。
而LE系统的话,20个都没问题!
回复 支持 反对

使用道具 举报

7

主题

373

帖子

6346

积分

⑦老手

积分
6346
发表于 2009-3-5 00:46:39 | 显示全部楼层
很赞,可惜没有vx版。。。
[url=http:\\\\agmer.lunqun.com]AGM制作者论坛[/url]
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2009-3-5 06:01:55 | 显示全部楼层
突然想到作ARPG挺好 回去搞一搞
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

8

主题

63

帖子

570

积分

⑤进阶

积分
570
 楼主| 发表于 2009-3-23 18:59:15 | 显示全部楼层
引用第5楼巴哈姆特于2009-03-05 00:46发表的 :
很赞,可惜没有vx版。。。

有VX版,请到66RPG的本帖里查找。
回复 支持 反对

使用道具 举报

8

主题

63

帖子

570

积分

⑤进阶

积分
570
 楼主| 发表于 2009-3-23 19:01:36 | 显示全部楼层
引用第6楼secondsen于2009-03-05 06:01发表的 :
突然想到作ARPG挺好 回去搞一搞

我在写这个系统的时候,忘记考虑了一个小问题,也就是操作问题。
记录状态的是独立变量,所以可能会出现一些问题。
我写了一个SP版本,解决了这个问题。不过我没有发布。
回复 支持 反对

使用道具 举报

8

主题

63

帖子

570

积分

⑤进阶

积分
570
 楼主| 发表于 2009-7-6 21:47:43 | 显示全部楼层
LE2.2更新完毕,修正了原来两个严重BUG,并且完美解决操作问题。过些时候发布
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-29 02:54 , Processed in 0.022931 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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