Project1

标题: 我设置了主角撞到不可通行的图块时触发事件,,为何NPC... [打印本页]

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

作者: 芯☆淡茹水    时间: 2014-11-21 13:12
把那个公共事件加到 172,173 之间试试,其它加公共事件的地方都删除。
作者: hys111111    时间: 2014-11-21 13:29
执行公共事件之前,加一个判断:
  1. if self.is_a?(Game_Player)
复制代码





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