查看: 2219|回复: 3

[已经过期] 关于跳跃脚本的问题

[复制链接]
梦石
0
星屑
50
在线时间
5 小时
注册时间
2016-7-16
回帖
7
发表于 2016-7-19 09:54:32 | 显示全部楼层 |阅读模式

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

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

×
我这有一个跳跃代码,该怎么插入进游戏中?
有木有哪位大大有更好的跳跃设置方法?







[pre lang="ruby"]class Game_Map
  #--------------------------------------------------------------------------
  # ● 计算地图元件ID
  #--------------------------------------------------------------------------
  def get_tile_id(x, y)
    a = data[x, y, 0]
    return 0 unless a
    a-=2000
    map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
    map_tile_id_1 = (data[x, y, 1]-2000) / 48
    map_tile_id_2 = (data[x, y, 2])
         
    map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
    map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
    map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
   
    # 图块 ID 矫正
    map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
    unless @events.nil?
      for event in @events.values
        if event.pos?(x, y) and event.tile_id > 0
          # 若是事件使用地图元件,使用该地图元件的ID
          map_tile_id_2 = event.tile_id
        end
      end
    end
    # 返回 [底层ID, 上层ID]
    return [map_tile_id_0, map_tile_id_2]
  end
end
class Game_Character < Game_CharacterBase
  #--------------------------------------------------------------------------
  # ● 获取地图元件ID
  #--------------------------------------------------------------------------
  def get_map_tile_id(x, y)
    return $game_map.get_tile_id(x, y)
  end
  #--------------------------------------------------------------------------
  # ● 判断是否能跳跃
  #--------------------------------------------------------------------------
  def can_jump?
    # 面向与方向键不同时不跳跃
    return false if Input.dir4 != @direction
    return false if debug_through? # 测试行走(按下Ctrl)时不跳跃
    x_f1 = x_f2 = @x
    y_f1 = y_f2 = @y
   
    # 计算前两格座标
    case @direction
    when 2
      y_f2 += 2
      y_f1 += 1
    when 4
      x_f2 -= 2
      x_f1 -= 1
    when 6
      x_f2 += 2
      x_f1 += 1
    when 8
      y_f2 -= 2
      y_f1 -= 1
    end
    tile_id_0 = get_map_tile_id(@x, @y)       # 获取当前格元件ID
    tile_id_1 = get_map_tile_id(x_f1, y_f1)   # 获取前一格元件ID
    tile_id_2 = get_map_tile_id(x_f2, y_f2)   # 获取前两格元件ID
    event_1 = $game_map.events_xy(x_f1, y_f1) # 获取前一格事件
    event_2 = $game_map.events_xy(x_f2, y_f2) # 获取前两格事件
   
    # 事件判断
    if !event_1.empty? # 若前一格有事件
      return false if !event_2.empty? # 前两格也有事件则不能跳跃
      return check_event_jumpable?(event_1) # 判断是否指定可以跳跃
    end
   
    # 前第一格判断
    if tile_id_1[1]>1
      return false # 前一格的B~E层无法通行时也不能跳跃
    elsif $game_map.counter?(x_f1, y_f1)
      return false # 前一格为柜台时无法跳跃
    end
   
    # 判断面前两格是否相同
    return false if tile_id_1 == tile_id_2
    return false if tile_id_1 == tile_id_0
   
    # 判断面前一格是否墙壁元件
    wall_tile = (89..96).to_a + (105..112).to_a + (121..128).to_a # 获取墙壁元件ID
    w_top_tile = (81..88).to_a + (97..104).to_a + (113..120).to_a # 获取墙顶元件ID
    return false if wall_tile.include?(tile_id_1[0]) # 前一格为墙壁时无法跳跃
    if w_top_tile.include?(tile_id_0[0]) # 若当前格为墙顶
      # 前一格非墙顶,而前两格为墙顶时则可以跳跃
      if !w_top_tile.include?(tile_id_1[0]) && w_top_tile.include?(tile_id_2[0])
        return true
      end
    end
    return false if map_passable?(x_f1, y_f1, @direction) # 前一格能通行时不跳跃
    return map_passable?(x_f2, y_f2, @direction) # 判断前两格是否能通行
  end
  #--------------------------------------------------------------------------
  # ● 判断某格的事件是否能跳跃
  #--------------------------------------------------------------------------
  def check_event_jumpable?(events)
    events.each{|event|
      return true if event.can_jump?
    }
    return false
  end
  #--------------------------------------------------------------------------
  # ● 执行跳跃
  #--------------------------------------------------------------------------
  def do_jump(d=@direction)
    # 判断跳跃方向
    case d
      when 2;  jump(0, 2)  # 向下跳
      when 4;  jump(-2, 0) # 向左跳
      when 6;  jump(2, 0)  # 向右跳
      when 8;  jump(0, -2) # 向上跳
    end
  end
end
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 判断事件是否能跳跃
  #--------------------------------------------------------------------------
  def can_jump?
    return false if @list[0].code != 108 # 第一个指令不是“注释”时返回 false
    return @list[0].parameters[0] == "jumpable"
  end
end
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 输入移动处理
  #--------------------------------------------------------------------------
  alias old_move_by_input move_by_input
  def move_by_input
    # 不能行动时忽略所有动作
    return unless movable?
    # 解释器执行时忽略所有动作
    return if $game_map.interpreter.running?
    d = Input.dir4
    if can_jump?# 能够跳跃时
      if $game_player.followers.visible # 队伍跟随时
        $game_player.followers.gather   # 跟随队伍聚集
        while !$game_player.followers.gather?
          $game_player.followers.update # 跟随队伍刷新
        end
        # 跟随队员跳跃
        $game_player.followers.each{ |follower|
          follower.do_jump(d)
        }
      end
    if Input.trigger?(:C)
        do_jump(d) # 执行跳跃
    end
    else
      old_move_by_input # 呼叫原有方法
    end
  end
end[/pre]

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
回帖
3011
发表于 2016-7-19 10:01:58 | 显示全部楼层
就插入脚本
回复

使用道具 举报

梦石
0
星屑
50
在线时间
5 小时
注册时间
2016-7-16
回帖
7
 楼主| 发表于 2016-7-19 14:01:37 | 显示全部楼层

插在哪里。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
5 小时
注册时间
2016-7-16
回帖
7
 楼主| 发表于 2016-7-19 14:27:01 | 显示全部楼层

不知道为什么脚本没有效果
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部