Project1

标题: 如何判定玩家是否乘坐载具 [打印本页]

作者: 余烬之中    时间: 2013-8-28 20:16
标题: 如何判定玩家是否乘坐载具
本帖最后由 余烬之中 于 2013-8-28 20:37 编辑

不久前入手一个被动跳跃的脚本(感谢@gaogs123456 )功能是在地图上移动时允许进行跳跃
如图: 可以从1跳到2 从2跳到3 从4跳到5 (反之亦可)
但是发现一个问题 就是……乘坐载具时,也可以进行跳跃
比如在船上,可以从6跳到7……
在脚本中找到了判定允许跳跃的地方(有备注还找不到就是“高手”了)……也知道只需要新增判定就可以了……
但是就是不知道怎么获得是否乘坐载具的信息……本人脚本盲,只会从英文推测脚本作用……
不知道有没有大神可以指点一下
脚本:
RUBY 代码复制
  1. class Game_Map
  2.   #--------------------------------------------------------------------------
  3.   # ● 计算地图元件ID
  4.   #--------------------------------------------------------------------------
  5.   def get_tile_id(x, y)
  6.     a = data[x, y, 0]
  7.     return 0 unless a
  8.     a-=2000
  9.     map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
  10.     map_tile_id_1 = (data[x, y, 1]-2000) / 48
  11.     map_tile_id_2 = (data[x, y, 2])
  12.  
  13.     map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
  14.     map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
  15.     map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
  16.  
  17.     # 图块 ID 矫正
  18.     map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
  19.     unless @events.nil?
  20.       for event in @events.values
  21.         if event.pos?(x, y) and event.tile_id > 0
  22.           # 若是事件使用地图元件,使用该地图元件的ID
  23.           map_tile_id_2 = event.tile_id
  24.         end
  25.       end
  26.     end
  27.     # 返回 [底层ID, 上层ID]
  28.     return [map_tile_id_0, map_tile_id_2]
  29.   end
  30. end
  31. class Game_Character < Game_CharacterBase
  32.   #--------------------------------------------------------------------------
  33.   # ● 获取地图元件ID
  34.   #--------------------------------------------------------------------------
  35.   def get_map_tile_id(x, y)
  36.     return $game_map.get_tile_id(x, y)
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 判断是否能跳跃
  40.   #--------------------------------------------------------------------------
  41.   def can_jump?
  42.     # 面向与方向键不同时不跳跃
  43.     return false if Input.dir4 != @direction
  44.     return false if debug_through? # 测试行走(按下Ctrl)时不跳跃
  45.     x_f1 = x_f2 = @x
  46.     y_f1 = y_f2 = @y
  47.  
  48.     # 计算前两格座标
  49.     case @direction
  50.     when 2
  51.       y_f2 += 2
  52.       y_f1 += 1
  53.     when 4
  54.       x_f2 -= 2
  55.       x_f1 -= 1
  56.     when 6
  57.       x_f2 += 2
  58.       x_f1 += 1
  59.     when 8
  60.       y_f2 -= 2
  61.       y_f1 -= 1
  62.     end
  63.     tile_id_0 = get_map_tile_id(@x, @y)       # 获取当前格元件ID
  64.     tile_id_1 = get_map_tile_id(x_f1, y_f1)   # 获取前一格元件ID
  65.     tile_id_2 = get_map_tile_id(x_f2, y_f2)   # 获取前两格元件ID
  66.     event_1 = $game_map.events_xy(x_f1, y_f1) # 获取前一格事件
  67.     event_2 = $game_map.events_xy(x_f2, y_f2) # 获取前两格事件
  68.  
  69.     # 事件判断
  70.     if !event_1.empty? # 若前一格有事件
  71.       return false if !event_2.empty? # 前两格也有事件则不能跳跃
  72.       return check_event_jumpable?(event_1) # 判断是否指定可以跳跃
  73.     end
  74.  
  75.     # 前第一格判断
  76.     if tile_id_1[1]>1
  77.       return false # 前一格的B~E层无法通行时也不能跳跃
  78.     elsif $game_map.counter?(x_f1, y_f1)
  79.       return false # 前一格为柜台时无法跳跃
  80.     end
  81.  
  82.     # 判断面前两格是否相同
  83.     return false if tile_id_1 == tile_id_2
  84.     return false if tile_id_1 == tile_id_0
  85.  
  86.     # 判断面前一格是否墙壁元件
  87.     wall_tile = (89..96).to_a + (105..112).to_a + (121..128).to_a # 获取墙壁元件ID
  88.     w_top_tile = (81..88).to_a + (97..104).to_a + (113..120).to_a # 获取墙顶元件ID
  89.     return false if wall_tile.include?(tile_id_1[0]) # 前一格为墙壁时无法跳跃
  90.     if w_top_tile.include?(tile_id_0[0]) # 若当前格为墙顶
  91.       # 前一格非墙顶,而前两格为墙顶时则可以跳跃
  92.       if !w_top_tile.include?(tile_id_1[0]) && w_top_tile.include?(tile_id_2[0])
  93.         return true
  94.       end
  95.     end
  96.     return false if map_passable?(x_f1, y_f1, @direction) # 前一格能通行时不跳跃
  97.     return map_passable?(x_f2, y_f2, @direction) # 判断前两格是否能通行
  98.   end
  99.   #--------------------------------------------------------------------------
  100.   # ● 判断某格的事件是否能跳跃
  101.   #--------------------------------------------------------------------------
  102.   def check_event_jumpable?(events)
  103.     events.each{|event|
  104.       return true if event.can_jump?
  105.     }
  106.     return false
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 执行跳跃
  110.   #--------------------------------------------------------------------------
  111.   def do_jump(d=@direction)
  112.     # 判断跳跃方向
  113.     case d
  114.     when 2;  jump(0, 2)  # 向下跳
  115.     when 4;  jump(-2, 0) # 向左跳
  116.     when 6;  jump(2, 0)  # 向右跳
  117.     when 8;  jump(0, -2) # 向上跳
  118.     end
  119.   end
  120. end
  121. class Game_Event < Game_Character
  122.   #--------------------------------------------------------------------------
  123.   # ● 判断事件是否能跳跃
  124.   #--------------------------------------------------------------------------
  125.   def can_jump?
  126.     return false if @list[0].code != 988 # 108第一个指令不是“注释”时返回 false
  127.     return @list[0].parameters[0] == "jumpable"
  128.   end
  129. end
  130. class Game_Player < Game_Character
  131.   #--------------------------------------------------------------------------
  132.   # ● 输入移动处理
  133.   #--------------------------------------------------------------------------
  134.   alias old_move_by_input move_by_input
  135.   def move_by_input
  136.     # 不能行动时忽略所有动作
  137.     return unless movable?
  138.     # 解释器执行时忽略所有动作
  139.     return if $game_map.interpreter.running?
  140.     d = Input.dir4
  141.     if can_jump?# 能够跳跃时
  142.       if $game_player.followers.visible # 队伍跟随时
  143.         $game_player.followers.gather   # 跟随队伍聚集
  144.         while !$game_player.followers.gather?
  145.           $game_player.followers.update # 跟随队伍刷新
  146.         end
  147.         # 跟随队员跳跃
  148.         $game_player.followers.each{ |follower|
  149.           follower.do_jump(d)
  150.         }
  151.       end
  152.       do_jump(d) # 执行跳跃
  153.     else
  154.       old_move_by_input # 呼叫原有方法
  155.     end
  156.   end
  157. end


作者: 鑫晴    时间: 2013-8-28 20:25
      
                        

              我只知道在Game_Player里面可以找到这一段:


RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 判定是否正在步行
  3.   #--------------------------------------------------------------------------
  4.   def normal_walk?
  5.     @vehicle_type == :walk && !@move_route_forcing
  6.   end


                  
剩下的就不会了.....






作者: 余烬之中    时间: 2013-8-28 20:36
鑫晴 发表于 2013-8-28 20:25
我只知道在Game_Player里面可以找到这一段:

十分感谢,已经解决了
  1.     #判断是否步行
  2.     return false if @vehicle_type != :walk
复制代码

作者: gaogs123456    时间: 2013-8-28 22:32
船也能跳- -没注意到过,87-88行是改判断的,计算的方式就是根据地图库横向的数。
http://rpg.blue/forum.php?mod=viewthread&tid=325209这里有个某人的小更改,可以参考一下,解决了一些不合理的地方。
不合理的地方有这些:
1、在悬崖上,向边缘冲刺距离1格会跳下去
2、可跳跃的前方有不可通行的事件,但可以跳跃
3、室内的墙壁可以跳跃
。我更喜欢这些不合理的地方。




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