设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1540|回复: 0
打印 上一主题 下一主题

[已经过期] RM重力系统能不能让事件跳跃

[复制链接]

Lv2.观梦者

梦石
0
星屑
841
在线时间
194 小时
注册时间
2014-1-11
帖子
31
跳转到指定楼层
1
发表于 2015-8-3 22:12:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 丿梁丶小柒 于 2015-10-4 21:59 编辑

RUBY 代码复制
  1. #=============================================================================
  2. #★RMVX重力系统★
  3. #-----------------------------------------------------------------------------
  4. #★作者: Zhong_zw
  5. #★联系方式: 66rpg.com论坛短信 或 [email][email protected][/email] 或 [email][email protected][/email]
  6. #★游戏中引用本脚本,请保留以上信息,并作相关说明.
  7. #☆如若转载本脚本请联系本人☆
  8. #==============================================================================
  9. #==============================================================================
  10. # ★ Game_Character
  11. #------------------------------------------------------------------------------
  12. #  涉及角色的类。本类作为 Game_Player 类与 Game_Event 的超级类
  13. # 使用。
  14. #==============================================================================
  15.  
  16. #==============================================================================
  17. #★参数设置
  18. #==============================================================================
  19. #跳跃初速度
  20. JUMP_SPEED = 150
  21.  
  22. #重力加速度
  23. GRAVITATIONAL = 9
  24.  
  25. #连跳次数
  26. JUME_SERIES = 2
  27.  
  28. #连跳速度衰减
  29. JUMP_SERIES_WEAKEN = 30
  30.  
  31. #跳跃键
  32. JUMP_KEY = Input::C #默认为键盘A键
  33.  
  34. #弹跳时的行走图 (格式为:[名称,index])
  35. JUMP_CHARACTER = nil
  36.  
  37. #弹跳时的声音 (注:声音文件放在SE文件夹下)
  38. JUMP_SE = "Jump1.ogg"
  39.  
  40. #掉出屏幕时打开的开关(用于调用相关公共事件)
  41. DEAD_SWITCHES_ID = 50
  42.  
  43. #各地图交通工具的摆放位置
  44. MAP_VEHICLE = {1=>[[2,1],[3,1],[4,1],[5,1],[8,2],[6,2],[7,2,1]]}
  45.  
  46.  
  47. #各地图可以飞的事件
  48. MAP_FLY_EVENT = {1=>[10]}
  49.  
  50. #默认地图模式 0为正常模式 1为重力模式
  51. DEFAULT_MAP_MODE = 0
  52.  
  53.  
  54. #==============================================================================
  55.  
  56. class Game_Character
  57.   #--------------------------------------------------------------------------
  58.   # ● 定义实例变量
  59.   #--------------------------------------------------------------------------
  60.   attr_reader   :id                       # ID
  61.   #===============================================================
  62.   attr_accessor :x                        # 地图 X 坐标 (理论坐标)
  63.   attr_accessor :y                        # 地图 Y 坐标 (理论坐标)
  64.   attr_accessor :real_x                   # 地图 X 坐标 (实际坐标 * 256)
  65.   attr_accessor :real_y                   # 地图 Y 坐标 (实际坐标 * 256)
  66.   attr_accessor :move_speed               #角色移动速度
  67.   attr_accessor :jump_series              #连跳次数
  68.   attr_accessor :gravitational            #重力加速度
  69.   attr_accessor :vertical_speed           #垂直速度
  70.   attr_accessor :can_fly                  #飞行开关  
  71.   attr_accessor :jump_speed               #跳跃初速度
  72.   attr_accessor :on_ladder                #是否在梯子上
  73.   attr_accessor :map_vehicle              #地图交通工具 0 无 1 为梯子 2 为踏板
  74.   attr_accessor :pedal_type               #踏板类型
  75.   attr_accessor :on_pedal                 #是否在踏板
  76.   attr_accessor :jump_character           #弹跳时的行走图
  77.   #=====================================================
  78.   #==========================================================================
  79.   # ★ 初始化对象
  80.   #==========================================================================
  81.   def initialize
  82.     @id = 0
  83.     @x = 0
  84.     @y = 0
  85.     @real_x = 0
  86.     @real_y = 0
  87.     @tile_id = 0
  88.     @character_name = ""
  89.     @character_index = 0
  90.     @opacity = 255
  91.     @blend_type = 0
  92.     @direction = 2
  93.     @pattern = 1
  94.     @move_route_forcing = false
  95.     @priority_type = 1
  96.     @through = false
  97.     @bush_depth = 0
  98.     @animation_id = 0
  99.     @balloon_id = 0
  100.     @transparent = false
  101.     @original_direction = 2               # 原朝向
  102.     @original_pattern = 1                 # 原图案
  103.     @move_type = 0                        # 移动类型
  104.     @move_speed = 4                       # 移动速度
  105.     @move_frequency = 6                   # 移动频度
  106.     @move_route = nil                     # 移动路径
  107.     @move_route_index = 0                 # 移动路径执行位置
  108.     @original_move_route = nil            # 原移动路径
  109.     @original_move_route_index = 0        # 原移动路径执行位置
  110.     @walk_anime = true                    # 步行动画
  111.     @step_anime = false                   # 踏步动画
  112.     @direction_fix = false                # 朝向固定
  113.     @anime_count = 0                      # 动画计数
  114.     @stop_count = 0                       # 停止计数
  115.     @jump_count = 0                       # 跳跃计数
  116.     @jump_peak = 0                        # 跳跃顶点计数
  117.     @wait_count = 0                       # 等待计数
  118.     @locked = false                       # 锁定标志
  119.     @prelock_direction = 0                # 锁定前的朝向
  120.     @move_failed = false                  # 移动失败标志
  121.  
  122.  
  123.  
  124.     #===========================================================
  125.     @jump_speed = JUMP_SPEED  #跳跃速度
  126.  
  127.     #@jump_height = JUMP_HEIGHT
  128.  
  129.     @jump_series = 0                #连跳次数累计
  130.  
  131.     @jump_max_series = JUME_SERIES  #最大连跳次数
  132.  
  133.     @can_fly = false
  134.  
  135.  
  136.  
  137.  
  138.     #计算重力加速度
  139.     [url=home.php?mod=space&uid=282336]@gravitational[/url] = GRAVITATIONAL
  140.  
  141.     #垂直速度为0
  142.     @vertical_speed  = 0
  143.  
  144.     #初始速度
  145.     @init_Vspeed = 0
  146.  
  147.     #着陆
  148.     @is_land = true
  149.  
  150.     #不需要继续下落的开关
  151.     @no_need_fall = false
  152.  
  153.  
  154.     #是否可以坠入悬崖
  155.     @can_falldown_screen = true
  156.  
  157.     #交通工具性质
  158.     @map_vehicle = 0            #地图交通工具 0 无  1为梯子 2 为踏板
  159.  
  160.  
  161.     #是否在梯子上
  162.     @on_ladder = false
  163.  
  164.     #踏板类型
  165.     @pedal_type = 0              # 0 为推进型踏板 1 为即落型踏板
  166.  
  167.     #是否在踏板
  168.     @on_pedal = false
  169.  
  170.     #弹跳时的行走图
  171.     @jump_character = nil
  172.  
  173.     #跳前行走图
  174.     @last_character = nil
  175.  
  176.     #乘客(踏板的情况下)
  177.     @passengers = nil
  178.  
  179.     #===========================================================
  180.  
  181.   end
  182.  
  183.   #==========================================================================
  184.   #★ 设置跳跃初速度
  185.   #==========================================================================
  186.   def set_jump_speed(speed)
  187.      @jump_speed = speed
  188.   end #def
  189.  
  190.   #==========================================================================
  191.  
  192.   #--------------------------------------------------------------------------
  193.   # ★ 判断是否在跳跃
  194.   #--------------------------------------------------------------------------
  195.   def jumping?
  196.     if $game_map.scene_mode == 0
  197.       return @jump_count > 0
  198.     else
  199.       return false  #废弃跳跃判定.主判定已放进update_falling里
  200.     end #if  
  201.   end
  202.  
  203.   #==========================================================================
  204.   # ★ 判断角色冲突
  205.   #     x : X 坐标
  206.   #     y : Y 坐标
  207.   #    包含玩家和交通工具、检测普通角色的冲突。
  208.   #==========================================================================
  209.   def collide_with_characters?(x, y)
  210.     for event in $game_map.events_xy(x, y)          # 与事件坐标一致
  211.       if($game_map.scene_mode == 1 && event.map_vehicle == 1)
  212.         return false
  213.       end  
  214.       unless event.through                          # 穿越 OFF?
  215.         return true if self.is_a?(Game_Event)       # 自己是事件
  216.         return true if event.priority_type == 1     # 对方是普通角色
  217.       end
  218.  
  219.     end
  220.     if @priority_type == 1                          # 自己是普通角色
  221.       return true if $game_player.pos_nt?(x, y)     # 与玩家的坐标一致
  222.       return true if $game_map.boat.pos_nt?(x, y)   # 与小型船坐标一致
  223.       return true if $game_map.ship.pos_nt?(x, y)   # 与大型船坐标一致
  224.     end
  225.     return false
  226.   end
  227.   #==========================================================================
  228.   # ★ 获取画面 Y 坐标
  229.   #==========================================================================
  230.   def screen_y
  231.     y = ($game_map.adjust_y(@real_y) + 8007) / 8 - 1000 + 32
  232.     #================================================
  233.     y -= 4 unless object? || $game_map.scene_mode == 1
  234.     #================================================
  235.     if $game_map.scene_mode == 0
  236.      if @jump_count >= @jump_peak
  237.        n = @jump_count - @jump_peak
  238.      else
  239.        n = @jump_peak - @jump_count
  240.      end
  241.      return y - (@jump_peak * @jump_peak - n * n) / 2
  242.    else
  243.      return y
  244.    end #if  
  245.   end
  246.   #==========================================================================
  247.   # ★ 刷新画面
  248.   #==========================================================================
  249.   def update
  250.  
  251.     if $game_map.scene_mode == 1
  252.      if falling?
  253.        update_falling
  254.      else
  255.  
  256.       #如果本身是踏板的话检查上面有没乘客
  257.       check_passenger
  258.  
  259.       if @real_y < @y*256 && !@on_ladder && !@can_fly && !on_pedal
  260.         free_fall
  261.         #update_horizontal_fly
  262.       else
  263.         if !@on_ladder && !@can_fly && !@on_pedal  #不在梯子上
  264.          @real_y = @y*256  #修正
  265.         end
  266.         @vertical_speed = 0
  267.         @init_Vspeed = 0
  268.         @jump_count = 0
  269.         if moving?
  270.           update_move
  271.         else                        # 正在停止
  272.           update_stop
  273.         end
  274.         if @wait_count > 0          # 正在等待
  275.           @wait_count -= 1
  276.         elsif @move_route_forcing   # 强制移动路径
  277.           move_type_custom
  278.         elsif not @locked           # 被锁定以外
  279.           update_self_movement
  280.          end
  281.          update_animation
  282.  
  283.        end
  284.  
  285.      end
  286.  
  287.     else
  288.      if jumping?                 # 正在跳跃
  289.       update_jump
  290.      elsif moving?               # 正在移动
  291.       update_move
  292.      else                        # 正在停止
  293.       update_stop
  294.      end
  295.      if @wait_count > 0          # 正在等待
  296.       @wait_count -= 1
  297.      elsif @move_route_forcing   # 强制移动路径
  298.       move_type_custom
  299.      elsif not @locked           # 被锁定以外
  300.       update_self_movement
  301.      end
  302.      update_animation
  303.     end #if
  304.   end
  305.   #==========================================================================
  306.   #★判断是否会下落
  307.   #==========================================================================
  308.   def falling?
  309.  
  310.     if @jump_series > 0 && !@on_ladder && @jump_character != nil
  311.       if @last_character == nil || @character_name != @jump_character[0]
  312.         @last_character = [@character_name,@character_index]
  313.       end  
  314.       set_graphic(@jump_character[0],@jump_character[1])
  315.     elsif @last_character != nil  && @last_character[0] != @character_name
  316.      set_graphic(@last_character[0],@last_character[1])
  317.     end
  318.  
  319.      if @can_fly  || @no_need_fall || @map_vehicle >= 1
  320.        return false
  321.      end
  322.  
  323.      have_ladder = false
  324.      for event in $game_map.events_xy(@x, @y)          # 与事件坐标一致
  325.        if event.map_vehicle == 1
  326.          have_ladder = true
  327.          @on_ladder = true
  328.          @is_land = true
  329.         end  
  330.      end
  331.  
  332.      if !have_ladder  
  333.        @on_ladder = false if @on_ladder
  334.      else
  335.        return false
  336.      end  
  337.  
  338.  
  339.  
  340.      dir =  @vertical_speed >= 0  ? 1 : -1
  341.      if @jump_count < 0 && @init_Vspeed < 0
  342.        dir = -1
  343.      end  
  344.  
  345.      x = @x
  346.  
  347.      if @x*256-@real_x > 0 #向右
  348.       x = (@real_x*1.0/256).floor
  349.      elsif @x*256-@real_x < 0
  350.       x = (@real_x*1.0/256).ceil
  351.      end
  352.  
  353.      result = passable?(x, @y+dir) && passable?(@x, @y+dir)
  354.  
  355.      if ((@y+dir) >= $game_map.height || @real_y/256 > $game_map.height) && @can_falldown_screen
  356.         @y = ($game_map.height+1)
  357.         @no_need_fall = true
  358.         if self.is_a?(Game_Player)
  359.           $game_switches[DEAD_SWITCHES_ID] = true
  360.         end #
  361.  
  362.      elsif (@y+dir) <= 0
  363.         result = true   
  364.      end  
  365.  
  366.  
  367.  
  368.      if @on_pedal&&result
  369.        @on_pedal = false
  370.      end
  371.  
  372.      last_state = @is_land
  373.      @is_land = !result && dir == 1
  374.  
  375.       #判断上顶或着陆事件
  376.      if !result  && (self.is_a?(Game_Player) || self.is_a?(Game_Event))
  377.        dir = -1 if @vertical_speed < 0
  378.        check_event_trigger_touch(@x,@y+dir)
  379.      end
  380.  
  381.  
  382.  
  383.      return result
  384.  
  385.   end  
  386.  
  387.   #==========================================================================
  388.   #★ 下落的更新
  389.   #==========================================================================
  390.   def update_falling
  391.      last_y = @real_y
  392.      y = (last_y/256).ceil
  393.      free_fall
  394.      dir =  @vertical_speed >= 0 ? 1 : -1
  395.      d =  (dir*@vertical_speed*1.00/256).ceil.abs
  396.      lst_i = 0
  397.  
  398.  
  399.      for i in 0..d
  400.  
  401.        if !passable?(@x, y+i*dir)
  402.  
  403.          break
  404.  
  405.        end #if
  406.  
  407.        lst_i = i
  408.  
  409.      end #for
  410.  
  411.      if  i > 0
  412.       @y = y+lst_i*dir
  413.       if !passable?(@x, @y+dir) && @y +dir > 0
  414.         @real_y = @y*256
  415.         #@vertical_speed = 0
  416.         @init_Vspeed = 0
  417.         @jump_count = 0
  418.       end
  419.      end
  420.  
  421.  
  422.      update_horizontal_fly
  423.  
  424.  
  425.   end
  426.   #==========================================================================
  427.   #★自由落体运动
  428.   #==========================================================================
  429.   def free_fall
  430.     @jump_count += 1
  431.     @vertical_speed = @init_Vspeed + @gravitational*@jump_count
  432.     @real_y = @real_y + @vertical_speed
  433.   end
  434.  
  435.   #=========================================================================
  436.   #★空中横向移动
  437.   #=========================================================================
  438.   def update_horizontal_fly
  439.     distance = 2 ** @move_speed*2   # 变换移动速度与移动距离
  440.     distance += 5 if dash?        # 跑步状态时移动速度加倍
  441.  
  442.     @real_x = [@real_x - distance, @x * 256].max if @x * 256 < @real_x
  443.     @real_x = [@real_x + distance, @x * 256].min if @x * 256 > @real_x
  444.   end
  445.   #=========================================================================
  446.   #★ 检查乘客(踏板专用)
  447.   #=========================================================================
  448.   def check_passenger
  449.       return if @map_vehicle != 2 || $game_map.scene_mode != 1
  450.       if @passengers == nil
  451.         @passengers = []
  452.       end  
  453.       if @passengers.size > 0
  454.         @passengers.clear
  455.       end
  456.       for event in $game_map.events_xy(@x, @y-1)
  457.         if  @pedal_type == 1 #即落型
  458.           @map_vehicle = 0    #设为普通角色(重力下自动掉落)
  459.           return
  460.         else
  461.            @passengers.push(event)
  462.         end  
  463.       end   
  464.       if $game_player.x == @x && $game_player.y == @y-1
  465.         if  @pedal_type == 1 #即落型
  466.           @map_vehicle = 0    #设为普通角色(重力下自动掉落)
  467.           return
  468.         else
  469.            @passengers.push($game_player)
  470.         end  
  471.  
  472.       end  
  473.  
  474.   end
  475.   #==========================================================================
  476.   #--------------------------------------------------------------------------
  477.   # ★ 跳跃时的更新
  478.   #--------------------------------------------------------------------------
  479.   def update_jump
  480.  
  481.     if $game_map.scene_mode == 0
  482.       @jump_count -= 1
  483.       @real_x = (@real_x * @jump_count + @x * 256) / (@jump_count + 1)
  484.       @real_y = (@real_y * @jump_count + @y * 256) / (@jump_count + 1)
  485.       update_bush_depth
  486.      end #if
  487.   end
  488.  
  489.  
  490.   #--------------------------------------------------------------------------
  491.   # ★ 向下移动
  492.   #     turn_ok : 此地可以更改朝向
  493.   #--------------------------------------------------------------------------
  494.   def move_down(turn_ok = true)
  495.  
  496.       if $game_map.scene_mode == 1
  497.         @on_ladder =true
  498.       end
  499.  
  500.       if passable?(@x, @y+1)                               # 可以通过
  501.        if $game_map.scene_mode == 0                        #正常模式下
  502.          turn_down
  503.        elsif $game_map.scene_mode == 1                     #重力模式
  504.          turn_up if !@can_fly                              #设置爬梯时的朝向
  505.          #是否踏板,是否有乘客
  506.          if @map_vehicle == 2 && @passengers != nil && @passengers.size > 0        
  507.             for event in @passengers
  508.                event.y = @y
  509.                event.on_pedal = true
  510.             end  
  511.          end  
  512.        end  
  513.         @y = $game_map.round_y(@y+1)
  514.         @real_y = (@y-1)*256
  515.         increase_steps
  516.         @move_failed = false
  517.  
  518.       else                                     # 不可以通过
  519.         turn_down if turn_ok
  520.         check_event_trigger_touch(@x, @y+1)    # 判断接触的事件启动
  521.         @move_failed = true
  522.       end
  523.  
  524.     #end #if
  525.   end
  526.   #--------------------------------------------------------------------------
  527.   # ★ 向左移动
  528.   #     turn_ok : 此地可以更改朝向
  529.   #--------------------------------------------------------------------------
  530.   def move_left(turn_ok = true)
  531.     if passable?(@x-1, @y)                  # 可以通过
  532.       turn_left
  533.       if $game_map.scene_mode == 1
  534.         if @map_vehicle == 2 && @passengers != nil && @passengers.size > 0        
  535.             for event in @passengers
  536.                event.x = $game_map.round_x(@x-1)
  537.                event.on_pedal = true
  538.             end  
  539.         end
  540.       end  
  541.       @x = $game_map.round_x(@x-1)
  542.       @real_x = (@x+1)*256
  543.       increase_steps
  544.       @move_failed = false
  545.     else                                    # 不可以通过
  546.       turn_left if turn_ok
  547.       check_event_trigger_touch(@x-1, @y)   # 判断接触的事件启动
  548.       @move_failed = true
  549.     end
  550.   end
  551.   #--------------------------------------------------------------------------
  552.   # ★ 向右移动
  553.   #     turn_ok : 此地可以更改朝向
  554.   #--------------------------------------------------------------------------
  555.   def move_right(turn_ok = true)
  556.     if passable?(@x+1, @y)                  # 可以通过
  557.       turn_right
  558.       if $game_map.scene_mode == 1
  559.         if @map_vehicle == 2 && @passengers != nil && @passengers.size > 0        
  560.             for event in @passengers
  561.                event.x = $game_map.round_x(@x+1)
  562.                event.on_pedal = true
  563.             end #for
  564.  
  565.         end
  566.       end  
  567.       @x = $game_map.round_x(@x+1)
  568.       @real_x = (@x-1)*256
  569.       increase_steps
  570.       @move_failed = false
  571.     else                                    # 不可以通过
  572.       turn_right if turn_ok
  573.       check_event_trigger_touch(@x+1, @y)   # 判断接触的事件启动
  574.       @move_failed = true
  575.     end
  576.   end
  577.   #--------------------------------------------------------------------------
  578.   # ★ 向上移动
  579.   #     turn_ok : 此地可以更改朝向
  580.   #--------------------------------------------------------------------------
  581.   def move_up(turn_ok = true)
  582.    if $game_map.scene_mode == 0 || ($game_map.scene_mode == 1 && (@on_ladder || @can_fly || @map_vehicle == 2))
  583.      pedal_passable = false
  584.      if @map_vehicle == 2 && $game_map.scene_mode == 1 && @passengers != nil && @passengers.size > 0
  585.            for event in @passengers
  586.              if (event.passable?(@x,@y-2))
  587.                pedal_passable = true
  588.                event.y = $game_map.round_y(@y-2)
  589.                event.on_pedal = true
  590.              end #if  
  591.            end#for  
  592.      end     
  593.      if passable?(@x, @y-1) || pedal_passable      # 可以通过
  594.        turn_up
  595.        @y = $game_map.round_y(@y-1)
  596.        @real_y = (@y+1)*256
  597.        increase_steps
  598.        @move_failed = false
  599.      else                                    # 不可以通过
  600.        turn_up if turn_ok
  601.        check_event_trigger_touch(@x, @y-1)   # 判断接触的事件启动
  602.        @move_failed = true
  603.      end
  604.  
  605.    end #if
  606.   end
  607.   #--------------------------------------------------------------------------
  608.   # ★ 向左下移动(为了不引起不必要的bug,把重力模式暂时没用到的屏蔽了)
  609.   #--------------------------------------------------------------------------
  610.   def move_lower_left
  611.    if $game_map.scene_mode == 0  
  612.     unless @direction_fix
  613.       @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  614.     end
  615.     if (passable?(@x, @y+1) and passable?(@x-1, @y+1)) or
  616.        (passable?(@x-1, @y) and passable?(@x-1, @y+1))
  617.       @x -= 1
  618.       @y += 1
  619.       increase_steps
  620.       @move_failed = false
  621.     else
  622.       @move_failed = true
  623.     end
  624.    end
  625.   end
  626.   #--------------------------------------------------------------------------
  627.   # ★ 向右下移动
  628.   #--------------------------------------------------------------------------
  629.   def move_lower_right
  630.     if $game_map.scene_mode == 0
  631.      unless @direction_fix
  632.        @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
  633.      end
  634.      if (passable?(@x, @y+1) and passable?(@x+1, @y+1)) or
  635.         (passable?(@x+1, @y) and passable?(@x+1, @y+1))
  636.        @x += 1
  637.        @y += 1
  638.        increase_steps
  639.        @move_failed = false
  640.      else
  641.        @move_failed = true
  642.      end
  643.     end #if  
  644.   end
  645.   #--------------------------------------------------------------------------
  646.   # ★ 向左上移动
  647.   #--------------------------------------------------------------------------
  648.   def move_upper_left
  649.     if $game_map.scene_mode == 0
  650.      unless @direction_fix
  651.        @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
  652.      end
  653.      if (passable?(@x, @y-1) and passable?(@x-1, @y-1)) or
  654.         (passable?(@x-1, @y) and passable?(@x-1, @y-1))
  655.        @x -= 1
  656.        @y -= 1
  657.        increase_steps
  658.        @move_failed = false
  659.      else
  660.        @move_failed = true
  661.      end
  662.     end #if  
  663.   end
  664.   #--------------------------------------------------------------------------
  665.   # ★ 向右上移动
  666.   #--------------------------------------------------------------------------
  667.   def move_upper_right
  668.     if $game_map.scene_mode == 0
  669.      unless @direction_fix
  670.        @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
  671.      end
  672.      if (passable?(@x, @y-1) and passable?(@x+1, @y-1)) or
  673.         (passable?(@x+1, @y) and passable?(@x+1, @y-1))
  674.        @x += 1
  675.        @y -= 1
  676.        increase_steps
  677.        @move_failed = false
  678.      else
  679.        @move_failed = true
  680.      end
  681.     end #if
  682.   end
  683.   #==========================================================================
  684.   #★以下这几个是默认的,但是留着方便以后进一步扩展
  685.   #==========================================================================
  686.   #--------------------------------------------------------------------------
  687.   # ★ 随机移动
  688.   #--------------------------------------------------------------------------
  689.   def move_random
  690.     case rand(4)
  691.     when 0;  move_down(false)
  692.     when 1;  move_left(false)
  693.     when 2;  move_right(false)
  694.     when 3;  move_up(false)
  695.     end
  696.   end
  697.   #--------------------------------------------------------------------------
  698.   # ★ 接近玩家
  699.   #--------------------------------------------------------------------------
  700.   def move_toward_player
  701.     sx = distance_x_from_player
  702.     sy = distance_y_from_player
  703.     if sx != 0 or sy != 0
  704.       if sx.abs > sy.abs                  # 如果横向距离长
  705.         sx > 0 ? move_left : move_right   # 左右方向优先
  706.         if @move_failed and sy != 0
  707.           sy > 0 ? move_up : move_down
  708.         end
  709.       else                                # 如果纵向距离等长
  710.         sy > 0 ? move_up : move_down      # 上下方向优先
  711.         if @move_failed and sx != 0
  712.           sx > 0 ? move_left : move_right
  713.         end
  714.       end
  715.     end
  716.   end
  717.   #--------------------------------------------------------------------------
  718.   # ★ 远离玩家
  719.   #--------------------------------------------------------------------------
  720.   def move_away_from_player
  721.     sx = distance_x_from_player
  722.     sy = distance_y_from_player
  723.     if sx != 0 or sy != 0
  724.       if sx.abs > sy.abs                  # 如果横向距离长
  725.         sx > 0 ? move_right : move_left   # 左右方向优先
  726.         if @move_failed and sy != 0
  727.           sy > 0 ? move_down : move_up
  728.         end #if
  729.       else                                # 如果纵向距离等长
  730.         sy > 0 ? move_down : move_up      # 上下方向优先
  731.         if @move_failed and sx != 0
  732.           sx > 0 ? move_right : move_left
  733.         end #if
  734.       end #if
  735.     end #if
  736.   end
  737.   #--------------------------------------------------------------------------
  738.   # ★ 前进一步
  739.   #--------------------------------------------------------------------------
  740.   def move_forward
  741.     case @direction
  742.     when 2;  move_down(false)
  743.     when 4;  move_left(false)
  744.     when 6;  move_right(false)
  745.     when 8;  move_up(false)
  746.     end
  747.   end
  748.   #--------------------------------------------------------------------------
  749.   # ★ 后退一步
  750.   #--------------------------------------------------------------------------
  751.   def move_backward
  752.     last_direction_fix = @direction_fix
  753.     @direction_fix = true
  754.     case @direction
  755.     when 2;  move_up(false)
  756.     when 4;  move_right(false)
  757.     when 6;  move_left(false)
  758.     when 8;  move_down(false)
  759.     end
  760.     @direction_fix = last_direction_fix
  761.   end
  762.   #==========================================================================
  763.   #★以上这几个是默认的,但是留着方便以后进一步扩展
  764.   #==========================================================================
  765.  
  766.   #--------------------------------------------------------------------------
  767.   # ★ 跳跃(重力模式该函数被屏蔽)
  768.   #     x_plus : X 坐标增加值
  769.   #     y_plus : Y 坐标增加值
  770.   #--------------------------------------------------------------------------
  771.   def jump(x_plus, y_plus)
  772.     if $game_map.scene_mode == 0
  773.       if x_plus.abs > y_plus.abs            # 横向距离长
  774.        x_plus < 0 ? turn_left : turn_right
  775.       elsif x_plus.abs > y_plus.abs         # 纵向距离长
  776.        y_plus < 0 ? turn_up : turn_down
  777.       end
  778.       @x += x_plus
  779.       @y += y_plus
  780.       distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round
  781.       @jump_peak = 10 + distance - @move_speed
  782.       @jump_count = @jump_peak * 2
  783.       @stop_count = 0
  784.       straighten
  785.     end #if
  786.   end
  787.  
  788.  
  789. end # class
  790.  
  791. #==============================================================================
  792. # ★ Game_Map
  793. #------------------------------------------------------------------------------
  794. #  处理地图的类。包含卷动以及可以通行的判断功能。
  795. # 本类的实例请参考 $game_map 。
  796. #==============================================================================
  797.  
  798. class Game_Map
  799.  
  800.   attr_accessor :scene_mode  #地图模式
  801.   attr_accessor :events      # 事件
  802.   #--------------------------------------------------------------------------
  803.   # ● 初始化对象
  804.   #--------------------------------------------------------------------------
  805.   def initialize
  806.     @screen = Game_Screen.new
  807.     @interpreter = Game_Interpreter.new(0, true)
  808.     @map_id = 0
  809.     @display_x = 0
  810.     @display_y = 0
  811.     @scene_mode = DEFAULT_MAP_MODE #0为正常模式 1为重力模式
  812.     create_vehicles
  813.   end
  814.   #--------------------------------------------------------------------------
  815.   # ● 设置事件
  816.   #--------------------------------------------------------------------------
  817.   def setup_events
  818.     @events = {}          # 地图事件
  819.     for i in @map.events.keys
  820.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  821.     end
  822.     @common_events = {}   # 公共事件
  823.     for i in 1...$data_common_events.size
  824.       @common_events[i] = Game_CommonEvent.new(i)
  825.     end
  826.     if @scene_mode == 1
  827.      if  MAP_VEHICLE != nil && MAP_VEHICLE.include?(@map_id)
  828.        for v in MAP_VEHICLE[@map_id]
  829.          @events[v[0]].map_vehicle = v[1]
  830.          if  v[1] == 2
  831.           #如果是踏板且有设定其类型的情况下 设置其踏板类型
  832.           @events[v[0]].pedal_type = v[2] if v.size > 2
  833.           #设置踏板移动速度与角色速度相同,解决踏板与角色脱节的bug.但仍有缺陷,鉴于RM本身地图设计的局限性,忍了!
  834.           @events[v[0]].move_speed = $game_player.move_speed
  835.          end#if
  836.         end #for  
  837.     end
  838.     if MAP_FLY_EVENT != nil && MAP_FLY_EVENT.include?(@map_id)
  839.        for v in MAP_FLY_EVENT[@map_id]
  840.          @events[v].can_fly = true
  841.        end #for
  842.      end  
  843.     end #if  
  844.   end
  845.  
  846.   #=========================================================================
  847.   # ★ 判断是否可以通行
  848.   #     x    : X 坐标
  849.   #     y    : Y 坐标
  850.   #     flag : 不能通行的点 (一般情况下为 0x01、可以在交通工具的情况下被更改)
  851.   #=========================================================================
  852.   def passable?(x, y, flag = 0x01)
  853.     for event in events_xy(x, y)            # 调用坐标一致的事件
  854.       next if event.tile_id == 0            # 没有元件图片
  855.       next if event.priority_type > 0       # 不是"在普通角色下"
  856.       next if event.through                 # 直接通过状态
  857.       pass = @passages[event.tile_id]       # 获取通行属性
  858.       next if pass & 0x10 == 0x10           # [☆] : 不受通行影响
  859.       return true if pass & flag == 0x00    # [○] : 可以通行
  860.       #=========================================================================
  861.       if($game_map.scene_mode == 1 && $game_player.on_ladder && event.map_vehicle == 1)
  862.         return true
  863.       end  
  864.       #=========================================================================
  865.       return false if pass & flag == flag   # [×] : 不可以通行
  866.     end
  867.     for i in [2, 1, 0]                      # 调用图层顺序
  868.       tile_id = @map.data[x, y, i]          # 获取元件 ID
  869.       return false if tile_id == nil        # 获取元件 ID 失败 : 不可以通行
  870.       pass = @passages[tile_id]             # 获取通行属性
  871.       next if pass & 0x10 == 0x10           # [☆] : 不受通行影响
  872.       return true if pass & flag == 0x00    # [○] : 可以通行
  873.       return false if pass & flag == flag   # [×] : 不可以通行
  874.     end
  875.     return false                            # 不可以通行
  876.   end
  877.  
  878. end #class
  879.  
  880. #==============================================================================
  881. # ★ Game_Player
  882. #------------------------------------------------------------------------------
  883. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  884. # 本类的实例请参考 $game_player。
  885. #==============================================================================
  886.  
  887. class Game_Player < Game_Character
  888.  
  889.   #--------------------------------------------------------------------------
  890.   # ★ 初始化对象
  891.   #--------------------------------------------------------------------------
  892.   def initialize
  893.     super
  894.     @vehicle_type = -1
  895.     @vehicle_getting_on = false     # 乘座动作中标志
  896.     @vehicle_getting_off = false    # 降下动作中标志
  897.     @transferring = false           # 场所移动标志
  898.     @new_map_id = 0                 # 移动目标地图 ID
  899.     @new_x = 0                      # 移动目标 X 坐标
  900.     @new_y = 0                      # 移动目标 Y 坐标
  901.     @new_direction = 0              # 移动后朝向
  902.     @walking_bgm = nil              # 记忆步行时的 BGM 用
  903.  
  904.     #=====================================================
  905.     @keypress_period = 0
  906.     @jump_character = JUMP_CHARACTER
  907.     #=====================================================
  908.  
  909.   end
  910.   #==========================================================================
  911.   #★ 刷新输入
  912.   #==========================================================================
  913.   def update_input
  914.     return if $game_map.interpreter.running?
  915.     if @is_land
  916.        @jump_series = 0
  917.     end
  918.     #按下跳跃键时
  919.     if Input.press?(JUMP_KEY)
  920.       if @jump_series < @jump_max_series && @keypress_period == 0 && (@is_land || @jump_series > 0) && @y <= $game_map.height
  921.          @init_Vspeed  = - @jump_speed  + JUMP_SERIES_WEAKEN*@jump_series
  922.          @jump_count = -1
  923.          @jump_series += 1
  924.          if  JUMP_SE != nil && JUMP_SE != ""
  925.           Audio.se_play("Audio/SE/"+JUMP_SE,100,100)
  926.          end
  927.       end
  928.       @keypress_period += 1
  929.  
  930.     else
  931.       if @keypress_period > 0
  932.        @keypress_period = 0
  933.        @init_Vspeed = 0
  934.        @jump_count = -1
  935.       end
  936.     end  
  937.  
  938.     case Input.dir4
  939.       #向下
  940.       when 2;
  941.         move_down if movable?
  942.       #向左
  943.       when 4;
  944.  
  945.         move_left if movable? || (!@is_land && flyable?)
  946.  
  947.       #向右  
  948.       when 6;
  949.  
  950.         move_right if  movable? || (!@is_land && flyable?)
  951.  
  952.  
  953.       #向上  
  954.       when 8;
  955.          move_up if  movable?
  956.  
  957.     end #case
  958.  
  959.   end
  960.   #==========================================================================
  961.   #★ 判断是否可以滑翔
  962.   #==========================================================================
  963.   def flyable?
  964.     return !(@real_x != @x * 256)
  965.  
  966.   end  
  967.   #==========================================================================
  968.   #★ 角色调入悬崖后重生(重新初始化相关重力数据)
  969.   #==========================================================================
  970.   def reborn
  971.     @no_need_fall = false
  972.   end  
  973.   #==========================================================================
  974.  
  975.   #--------------------------------------------------------------------------
  976.   # ★ 刷新画面
  977.   #--------------------------------------------------------------------------
  978.   def update
  979.     last_real_x = @real_x
  980.     last_real_y = @real_y
  981.     last_moving = moving?
  982.     if $game_map.scene_mode == 1 #重力模式
  983.      update_input
  984.     else  
  985.      move_by_input
  986.     end
  987.     super
  988.     update_scroll(last_real_x, last_real_y)
  989.     update_vehicle
  990.     update_nonmoving(last_moving)
  991.   end
  992.  
  993.   #==========================================================================
  994.   #★以下这几个是默认的,但是留着方便以后进一步扩展
  995.   #==========================================================================
  996.  
  997.   #--------------------------------------------------------------------------
  998.   # ● 乘降交通工具
  999.   #--------------------------------------------------------------------------
  1000.   def get_on_off_vehicle
  1001.     return false unless movable?
  1002.     if in_vehicle?
  1003.       return get_off_vehicle
  1004.     else
  1005.       return get_on_vehicle
  1006.     end
  1007.   end
  1008.   #--------------------------------------------------------------------------
  1009.   # ● 乘座交通工具
  1010.   #    前提是当前没有乘座交通工具。
  1011.   #--------------------------------------------------------------------------
  1012.   def get_on_vehicle
  1013.     front_x = $game_map.x_with_direction(@x, @direction)
  1014.     front_y = $game_map.y_with_direction(@y, @direction)
  1015.     if $game_map.airship.pos?(@x, @y)             # 与飞行船重合了吗?
  1016.       get_on_airship
  1017.       return true
  1018.     elsif $game_map.ship.pos?(front_x, front_y)   # 正面有大型船?
  1019.       get_on_ship
  1020.       return true
  1021.     elsif $game_map.boat.pos?(front_x, front_y)   # 正面有小型船?
  1022.       get_on_boat
  1023.       return true
  1024.     end
  1025.     return false
  1026.   end
  1027.   #--------------------------------------------------------------------------
  1028.   # ● 乘座小型船
  1029.   #--------------------------------------------------------------------------
  1030.   def get_on_boat
  1031.     @vehicle_getting_on = true        # 乘座中标志
  1032.     @vehicle_type = 0                 # 设置交通工具类型
  1033.     force_move_forward                # 前进一步
  1034.     @walking_bgm = RPG::BGM::last     # 记忆步行时 BGM 用
  1035.     $game_map.boat.get_on             # 乘座处理
  1036.   end
  1037.   #--------------------------------------------------------------------------
  1038.   # ● 乘座大型船
  1039.   #--------------------------------------------------------------------------
  1040.   def get_on_ship
  1041.     @vehicle_getting_on = true        # 乘座
  1042.     @vehicle_type = 1                 # 设置交通工具类型
  1043.     force_move_forward                # 前进一步
  1044.     @walking_bgm = RPG::BGM::last     # 记忆步行时 BGM 用
  1045.     $game_map.ship.get_on             # 乘座处理
  1046.   end
  1047.   #--------------------------------------------------------------------------
  1048.   # ● 乘座飞行船
  1049.   #--------------------------------------------------------------------------
  1050.   def get_on_airship
  1051.     @vehicle_getting_on = true        # 开始乘座动作
  1052.     @vehicle_type = 2                 # 设置交通工具类型
  1053.     @through = true                   # 穿越 ON
  1054.     @walking_bgm = RPG::BGM::last     # 记忆步行时 BGM 用
  1055.     $game_map.airship.get_on          # 乘座处理
  1056.   end
  1057.   #--------------------------------------------------------------------------
  1058.   # ● 降下交通工具
  1059.   #    前提是现在乘座了交通工具。
  1060.   #--------------------------------------------------------------------------
  1061.   def get_off_vehicle
  1062.     if in_airship?                                # 飞行船
  1063.       return unless airship_land_ok?(@x, @y)      # 无法着陆?
  1064.     else                                          # 小型船·大型船
  1065.       front_x = $game_map.x_with_direction(@x, @direction)
  1066.       front_y = $game_map.y_with_direction(@y, @direction)
  1067.       return unless can_walk?(front_x, front_y)   # 无法靠岸?
  1068.     end
  1069.     $game_map.vehicles[@vehicle_type].get_off     # 降下处理
  1070.     if in_airship?                                # 飞行船
  1071.       @direction = 2                              # 面朝下
  1072.     else                                          # 小型船·大型船
  1073.       force_move_forward                          # 前进一步
  1074.       @transparent = false                        # 解除透明
  1075.     end
  1076.     @vehicle_getting_off = true                   # 开始降下动作
  1077.     @move_speed = 4                               # 还原移动速度
  1078.     @through = false                              # 穿越 OFF
  1079.     @walking_bgm.play                             # 还原步行时的 BGM
  1080.     make_encounter_count                          # 初始化遇敌率
  1081.   end
  1082.  
  1083.   #==========================================================================
  1084.   #★以上这几个是默认的,但是留着方便以后进一步扩展
  1085.   #==========================================================================
  1086. end #class
  1087.  
  1088. 就是这个脚本了{:2_279:} 本人脚本盲,求助
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 13:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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