Project1

标题: NPC穿透【行走方面脚本】!!!! [打印本页]

作者: eu国猪    时间: 2012-7-15 10:33
标题: NPC穿透【行走方面脚本】!!!!
本帖最后由 忧雪の伤 于 2012-7-16 13:22 编辑

这个脚本能让NPC和NPC之间自由穿透,NPC和角色之间也能自由穿透
不过我觉的这脚本更适合网游的游戏
把他放在MAIN上面
  1. #==============================================================================
  2. # ■ Game_Character (分割定义 1)
  3. #------------------------------------------------------------------------------
  4. #  处理角色的类。本类作为 Game_Player 类与 Game_Event
  5. # 类的超级类使用。
  6. #==============================================================================

  7. class Game_Character
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_reader   :id                       # ID
  12.   attr_reader   :x                        # 地图 X 坐标 (理论坐标)
  13.   attr_reader   :y                        # 地图 Y 坐标 (理论坐标)
  14.   attr_reader   :real_x                   # 地图 X 坐标 (实际坐标 * 128)
  15.   attr_reader   :real_y                   # 地图 Y 坐标 (实际坐标 * 128)
  16.   attr_reader   :tile_id                  # 元件 ID  (0 为无效)
  17.   attr_reader   :character_name           # 角色 文件名
  18.   attr_reader   :character_hue            # 角色 色相
  19.   attr_reader   :opacity                  # 不透明度
  20.   attr_reader   :blend_type               # 合成方式
  21.   attr_reader   :direction                # 朝向
  22.   attr_reader   :pattern                  # 图案
  23.   attr_reader   :move_route_forcing       # 移动路线强制标志
  24.   attr_reader   :through                  # 穿透
  25.   attr_accessor :animation_id             # 动画 ID
  26.   attr_accessor :transparent              # 透明状态
  27.   #--------------------------------------------------------------------------
  28.   # ● 初始化对像
  29.   #--------------------------------------------------------------------------
  30.   def initialize
  31.     @id = 0
  32.     @x = 0
  33.     @y = 0
  34.     @real_x = 0
  35.     @real_y = 0
  36.     @tile_id = 0
  37.     @character_name = ""
  38.     @character_hue = 0
  39.     @opacity = 255
  40.     @blend_type = 0
  41.     @direction = 2
  42.     @pattern = 0
  43.     @move_route_forcing = false
  44.     @through = false
  45.     @animation_id = 0
  46.     @transparent = false
  47.     @original_direction = 2
  48.     @original_pattern = 0
  49.     @move_type = 0
  50.     @move_speed = 4
  51.     @move_frequency = 6
  52.     @move_route = nil
  53.     @move_route_index = 0
  54.     @original_move_route = nil
  55.     @original_move_route_index = 0
  56.     @walk_anime = true
  57.     @step_anime = false
  58.     @direction_fix = false
  59.     @always_on_top = false
  60.     @anime_count = 0
  61.     @stop_count = 0
  62.     @jump_count = 0
  63.     @jump_peak = 0
  64.     @wait_count = 0
  65.     @locked = false
  66.     @prelock_direction = 0
  67.   end
  68.   #--------------------------------------------------------------------------
  69.   # ● 移动中判定
  70.   #--------------------------------------------------------------------------
  71.   def moving?
  72.     # 如果在移动中理论坐标与实际坐标不同
  73.     return (@real_x != @x * 128 or @real_y != @y * 128)
  74.   end
  75.   #--------------------------------------------------------------------------
  76.   # ● 跳跃中判定
  77.   #--------------------------------------------------------------------------
  78.   def jumping?
  79.     # 如果跳跃中跳跃点数比 0 大
  80.     return @jump_count > 0
  81.   end
  82.   #--------------------------------------------------------------------------
  83.   # ● 矫正姿势
  84.   #--------------------------------------------------------------------------
  85.   def straighten
  86.     # 移动时动画以及停止动画为 ON 的情况下
  87.     if @walk_anime or @step_anime
  88.       # 设置图形为 0
  89.       @pattern = 0
  90.     end
  91.     # 清除动画计数
  92.     @anime_count = 0
  93.     # 清除被锁定的向前朝向
  94.     @prelock_direction = 0
  95.   end
  96.   #--------------------------------------------------------------------------
  97.   # ● 强制移动路线
  98.   #     move_route : 新的移动路线
  99.   #--------------------------------------------------------------------------
  100.   def force_move_route(move_route)
  101.     # 保存原来的移动路线
  102.     if @original_move_route == nil
  103.       @original_move_route = @move_route
  104.       @original_move_route_index = @move_route_index
  105.     end
  106.     # 更改移动路线
  107.     @move_route = move_route
  108.     @move_route_index = 0
  109.     # 设置强制移动路线标志
  110.     @move_route_forcing = true
  111.     # 清除被锁定的向前朝向
  112.     @prelock_direction = 0
  113.     # 清除等待计数
  114.     @wait_count = 0
  115.     # 自定义移动
  116.     move_type_custom
  117.   end
  118.   #--------------------------------------------------------------------------
  119.   # ● 可以通行判定
  120.   #     x : X 坐标
  121.   #     y : Y 坐标
  122.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  123.   #--------------------------------------------------------------------------
  124.   def passable?(x, y, d)
  125.     # 求得新的坐标
  126.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  127.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  128.     # 坐标在地图以外的情况
  129.     unless $game_map.valid?(new_x, new_y)
  130.       # 不能通行
  131.       return false
  132.     end
  133.     # 穿透是 ON 的情况下
  134.     if @through
  135.       # 可以通行
  136.       return true
  137.     end
  138.     # 移动者的元件无法来到指定方向的情况下
  139.     unless $game_map.passable?(x, y, d, self)
  140.       # 通行不可
  141.       return false
  142.     end
  143.     # 从指定方向不能进入到移动处的元件的情况下
  144.     unless $game_map.passable?(new_x, new_y, 10 - d)
  145.       # 不能通行
  146.       return false
  147.     end
  148. =begin
  149. # 循环全部事件
  150.     for event in $game_map.events.values
  151.       # 事件坐标于移动目标坐标一致的情况下
  152.       if event.x == new_x and event.y == new_y
  153.         # 穿透为 ON
  154.         unless event.through
  155.           # 自己就是事件的情况下
  156.           if self != $game_player
  157.             # 不能通行
  158.             return false
  159.           end
  160.           # 自己是主角、对方的图形是角色的情况下
  161.           if event.character_name != ""
  162.             # 不能通行
  163.             return false
  164.           end
  165.         end
  166.       end
  167.     end
  168. =end
  169.     # 主角的坐标与移动目标坐标一致的情况下
  170.     if $game_player.x == new_x and $game_player.y == new_y
  171.       # 穿透为 ON
  172.       unless $game_player.through
  173.         # 自己的图形是角色的情况下
  174.         if @character_name != ""
  175.           # 不能通行
  176.           return false
  177.         end
  178.       end
  179.     end
  180.     # 可以通行
  181.     return true
  182.   end
  183.   #--------------------------------------------------------------------------
  184.   # ● 锁定
  185.   #--------------------------------------------------------------------------
  186.   def lock
  187.     # 如果已经被锁定的情况下
  188.     if @locked
  189.       # 过程结束
  190.       return
  191.     end
  192.     # 保存锁定前的朝向
  193.     @prelock_direction = @direction
  194.     # 保存主角的朝向
  195.     turn_toward_player
  196.     # 设置锁定中标志
  197.     @locked = true
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # ● 锁定中判定
  201.   #--------------------------------------------------------------------------
  202.   def lock?
  203.     return @locked
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # ● 解除锁定
  207.   #--------------------------------------------------------------------------
  208.   def unlock
  209.     # 没有锁定的情况下
  210.     unless @locked
  211.       # 过程结束
  212.       return
  213.     end
  214.     # 清除锁定中标志
  215.     @locked = false
  216.     # 没有固定朝向的情况下
  217.     unless @direction_fix
  218.       # 如果保存了锁定前的方向
  219.       if @prelock_direction != 0
  220.         # 还原为锁定前的方向
  221.         @direction = @prelock_direction
  222.       end
  223.     end
  224.   end
  225.   #--------------------------------------------------------------------------
  226.   # ● 移动到指定位置
  227.   #     x : X 坐标
  228.   #     y : Y 坐标
  229.   #--------------------------------------------------------------------------
  230.   def moveto(x, y)
  231.     @x = x % $game_map.width
  232.     @y = y % $game_map.height
  233.     @real_x = @x * 128
  234.     @real_y = @y * 128
  235.     @prelock_direction = 0
  236.   end
  237.   #--------------------------------------------------------------------------
  238.   # ● 获取画面 X 坐标
  239.   #--------------------------------------------------------------------------
  240.   def screen_x
  241.     # 通过实际坐标和地图的显示位置来求得画面坐标
  242.     return (@real_x - $game_map.display_x + 3) / 4 + 16
  243.   end
  244.   #--------------------------------------------------------------------------
  245.   # ● 获取画面 Y 坐标
  246.   #--------------------------------------------------------------------------
  247.   def screen_y
  248.     # 通过实际坐标和地图的显示位置来求得画面坐标
  249.     y = (@real_y - $game_map.display_y + 3) / 4 + 32
  250.     # 取跳跃计数小的 Y 坐标
  251.     if @jump_count >= @jump_peak
  252.       n = @jump_count - @jump_peak
  253.     else
  254.       n = @jump_peak - @jump_count
  255.     end
  256.     return y - (@jump_peak * @jump_peak - n * n) / 2
  257.   end
  258.   #--------------------------------------------------------------------------
  259.   # ● 获取画面 Z 坐标
  260.   #     height : 角色的高度
  261.   #--------------------------------------------------------------------------
  262.   def screen_z(height = 0)
  263.     # 在最前显示的标志为 ON 的情况下
  264.     if @always_on_top
  265.       # 无条件设置为 999
  266.       return 999
  267.     end
  268.     # 通过实际坐标和地图的显示位置来求得画面坐标
  269.     z = (@real_y - $game_map.display_y + 3) / 4 + 32
  270.     # 元件的情况下
  271.     if @tile_id > 0
  272.       # 元件的优先不足 * 32
  273.       return z + $game_map.priorities[@tile_id] * 32
  274.     # 角色的场合
  275.     else
  276.       # 如果高度超过 32 就判定为满足 31
  277.       return z + ((height > 32) ? 31 : 0)
  278.     end
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # ● 取得繁茂
  282.   #--------------------------------------------------------------------------
  283.   def bush_depth
  284.     # 是元件、并且在最前显示为 ON 的情况下
  285.     if @tile_id > 0 or @always_on_top
  286.       return 0
  287.     end
  288.     # 在跳跃以外的状态时繁茂处元件的属性为 12,除此之外为 0
  289.     if @jump_count == 0 and $game_map.bush?(@x, @y)
  290.       return 12
  291.     else
  292.       return 0
  293.     end
  294.   end
  295.   #--------------------------------------------------------------------------
  296.   # ● 取得地形标记
  297.   #--------------------------------------------------------------------------
  298.   def terrain_tag
  299.     return $game_map.terrain_tag(@x, @y)
  300.   end
  301. end

复制代码

作者: 忧雪の伤    时间: 2012-7-16 13:23
UI> 我说 默认不就有穿透的功能么
作者: eu国猪    时间: 2012-7-17 09:22
忧雪の伤 发表于 2012-7-16 13:23
UI> 我说 默认不就有穿透的功能么

是有,不过那个穿透是连地图图块一起穿透的,我这个是不影响地图图块的,只有npc之间穿透,遇到
不能行走的地图也一样走不过去
作者: eu国猪    时间: 2012-7-17 09:26
eu国猪 发表于 2012-7-17 09:22
是有,不过那个穿透是连地图图块一起穿透的,我这个是不影响地图图块的,只有npc之间穿透,遇到
不能行走 ...

但是如果用npc那个穿透的话,npc就能在地图上不受地图限制的到处走都行
作者: eu国猪    时间: 2012-7-17 09:33
eu国猪 发表于 2012-7-17 09:26
但是如果用npc那个穿透的话,npc就能在地图上不受地图限制的到处走都行

能给我加法不???




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1