查看: 4373|回复: 5

[已经过期] 推箱問題

[复制链接]
梦石
0
星屑
50
在线时间
158 小时
注册时间
2016-1-7
回帖
102
发表于 2016-3-29 04:54:11 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 燕征 于 2016-3-31 03:36 编辑

我照著[RMXP发布] 五合一推箱子【更新15.8.20】範例
使用該範例提供的腳本、公共事件、事件設定(設置成只推,不可重疊,使用的開關號碼、公共事件號碼換了)
想做出推箱的關卡

註:事件只有設置主角左前的石頭及石頭正前方的洞

但洞完全只有路障功能,而石頭會神奇地被隔空踹走,請問是還有什麼地方沒有注意到嗎@@?

[fold=此方法使用之推箱腳本: 推箱子-只推+推拉-可重疊][pre lang="ruby"]#==============================================================================
#==============================================================================
# ■ [XP] 推箱子-只推+推拉-可重叠
#------------------------------------------------------------------------------
# ★ 说明
#    * 推箱子游戏用脚本
#    * 只支持”直接推箱子“及“按着确定键拉箱子”
#    * 可重叠事件
#    * 可设定“只推”或“可推拉”
#    * 有两处可以自己设定,分别是”第30行“及“第136行”
#------------------------------------------------------------------------------
#    更新作者:蝉岭Cicada
#    许可协议:FSL
#------------------------------------------------------------------------------
# ★ 历史版本
#
#    - 1.2.0000  by  20150820
#      * 修改;简化脚本和公共事件
#
#    - 1.1.0000  by  20150720
#      * 修改;集成“只推”与“推拉”、“重叠”与”不重叠“
#
#    - 1.0.0000  by  20150719
#      * 初版;
#
#------------------------------------------------------------------------------
$ccdscript ||= {}
$ccdscript[:ccd20150820] = "1.1.0000.20150720"
module FSL
  module CCD
#------------------------------------------------------------------------------
# ◆ 设定部分
#------------------------------------------------------------------------------
   
   
    OVER = 0
   
   
    # 重叠开关:
    # 1 为 开
    # 0 为 关
    # 不需要时建议关,避免卡
   
   
    PUSHONLY = 1
   
   
    # 只推开关:
    # 1 为 开
    # 0 为 关
    # 只能推,不能拉。推的过程中,按确定键可以停止。
   
   
    SE_NAME = "041-Knock02"          #  "音效名称"
   
   
    SE_VOICE = 80                    # 音量
   
   
    SE_TEMPLE = 100                  # 节拍
   
   
    # 推拉音效:
    # 通用音效
    # 依次是 "音效名称"、音量、 节拍
   
   
#------------------------------------------------------------------------------
# 设定结束
#------------------------------------------------------------------------------
    # 请勿更改
    SE = RPG::AudioFile.new(SE_NAME, SE_VOICE, SE_TEMPLE)
  end #end module CCD
end #end modul FSL
#==============================================================================
#==============================================================================
class Game_Player < Game_Character
  
  # include
  include FSL
  
  #------------------------------------------------------------------------
  # 重叠的 判断、开关开启、事件触发 及 说明
  #------------------------------------------------------------------------
  @@lambda_over = lambda{|tx, ty, event_move|
    $game_map.events.values.each do |target|
      if target.x == $game_player.x + tx && target.y == $game_player.y + ty &&
         target.list[0].code==108 &&
         ( # 有 4 种重叠的情况:
         
           # 1.不指定:
           #   在目标的第1行,注释上 0
           #   可被所有箱子重叠
           target.list[0].parameters[0] == 0.to_s ||
           
           # 2.指定事件ID:
           #   在目标的第1行,注释上 指定的事件ID
           #   只可被唯一箱子重叠
           target.list[0].parameters[0] == @@event.id.to_s ||
           
           # 3.指定图形:
           #   在目标的第1、2、3行,注释上 想重叠的箱子的 文件名、面向、图形
           #   面向:上下左右 依次是 2、4、6、8
           #   图形:由左至右 依次是 0、1、2、3
           #   可被相同的图形的箱子重叠
           if target.list.size >=3
             [target.list[0].parameters[0],
             target.list[1].parameters[0],
             target.list[2].parameters[0]] ==
            [@@event.character_name,
             @@event.direction.to_s,
             @@event.pattern.to_s];end ||
           # 4.指定复数个事件ID:
           #   在目标的第1行,注释上 指定的事件ID
           #   只可被指定的复数个箱子重叠
           #   ID间,以 "|" 隔开
           #   如:2|3|5
           target.list[0].parameters[0].split("|").include?(@@event.id.to_s) if
           target.list[0].parameters[0].class == String
         ) # 以上判断
        # 事件移动实现
        event_move.call
        #--------------------------------------------------------------------
        # ◆ 自定义部分(自行发挥)
        #--------------------------------------------------------------------
        
        
        $game_self_switches[[$game_map.map_id, @@event.id, "A"]] = true
        $game_self_switches[[$game_map.map_id, target.id, "A"]] = true

        
        $game_switches[28] = true
        
        
        # 预设:
        # 开启 "事件" 及 "目标" 的 "独立开关A"
        # 开关[28] 为 ON (重叠判定开关)
        
        
        $game_map.need_refresh = true
        
        
        # 刷新地图
        
        
        # 以下参考:
        # $game_self_switches[] = true
        # $game_switches[] = true
        # $game_variables[] = -1
        
        
        #--------------------------------------------------------------------
        # 自定义结束
        #--------------------------------------------------------------------
      end # end if
    end # end do
  } # end lambda
  #------------------------------------------------------------------------
  # 重叠的设定结束
  #------------------------------------------------------------------------
      
  def update
    last_moving = moving?
    unless moving? or $game_system.map_interpreter.running? or
           @move_route_forcing or $game_temp.message_window_showing
           
      # Event
      event = @@event = $game_system.map_interpreter.event
      
      # 箱子和主角速度相等
      ps = $game_player.instance_variable_get(:@move_speed)
      es = event.instance_variable_get(:@move_speed)
      if ps != es
        event.instance_variable_set(:@move_speed, ps)
      end
      
      # 音效
      se = lambda{event.list[-2].code == 250 ? $game_system.se_play(event.list[-2].parameters[0]) : $game_system.se_play(FSL::CCD::SE)}
      
      case Input.dir4
      when 2
        if $game_switches[27] == true
          # 下拉
          if FSL::CCD::PUSHONLY == 0 && Input.press?(Input::C)
            if $game_player.y > event.y && passable?(@x, @y, 2)
              se.call
              event.y += 1
              move_down
            end #end if
          # 下推
          elsif !Input.press?(Input::C)
            if $game_player.y < event.y && passable?(@x, @y + 1, 2)
              se.call
              event.y += 1
            elsif FSL::CCD::OVER == 1
              @@lambda_over.call(0, 2, lambda{event.y += 1})
            end #end if
            move_down
          end #end if
        else
          move_down
        end #end if
      when 4
        if $game_switches[27] == true
          # 左拉
          if FSL::CCD::PUSHONLY == 0 && Input.press?(Input::C)
            if $game_player.x < event.x && passable?(@x, @y, 4)
              se.call
              event.x -= 1
              move_left
            end #end if
          # 左推
          elsif !Input.press?(Input::C)
            if $game_player.x > event.x && passable?(@x - 1, @y, 4)
              se.call
              event.x -= 1
            elsif FSL::CCD::OVER == 1
              @@lambda_over.call(-2, 0, lambda{event.x -= 1})
            end #end if
            move_left
          end #end if
        else
          move_left
        end #end if
      when 6
        if $game_switches[27] == true
          # 右拉
          if FSL::CCD::PUSHONLY == 0 && Input.press?(Input::C)
            if $game_player.x > event.x && passable?(@x, @y, 6)
              se.call
              event.x += 1
              move_right
            end #end if
          # 右推
          elsif !Input.press?(Input::C)
            if $game_player.x < event.x && passable?(@x + 1, @y, 6)
              se.call
              event.x += 1
            elsif FSL::CCD::OVER == 1
              @@lambda_over.call(2, 0, lambda{event.x += 1})
            end #end if
            move_right
          end #end if
        else
          move_right
        end #end if
      when 8
        if $game_switches[27] == true
          if FSL::CCD::PUSHONLY == 0 && Input.press?(Input::C)
            # 上拉
            if $game_player.y < event.y && passable?(@x, @y, 8)
              se.call
              event.y -= 1
              move_up
            end #end if
          # 上推
          elsif !Input.press?(Input::C)
            if $game_player.y > event.y && passable?(@x, @y - 1, 8)
              se.call
              event.y -= 1
            elsif FSL::CCD::OVER == 1
              @@lambda_over.call(0, -2, lambda{event.y -= 1})
            end #end if
            move_up
          end #end if
        else
          move_up
        end #end if
      end #end case
    end#end unless
    last_real_x = @real_x
    last_real_y = @real_y
    super
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
      $game_map.scroll_down(@real_y - last_real_y)
    end
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
      $game_map.scroll_left(last_real_x - @real_x)
    end
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
      $game_map.scroll_right(@real_x - last_real_x)
    end
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
      $game_map.scroll_up(last_real_y - @real_y)
    end
    unless moving?
      if last_moving
        result = check_event_trigger_here([1,2])
        if result == false
          unless $DEBUG and Input.press?(Input::CTRL)
            if @encounter_count > 0
              @encounter_count -= 1
            end
          end
        end
      end
      if Input.trigger?(Input::C)
        check_event_trigger_here([0])
        check_event_trigger_there([0,1,2])
      end
    end
  end #end def
end #end class
class Game_Character; attr_accessor :x; attr_accessor :y; end
class Interpreter; attr_accessor :event_id
  def x; $game_map.events[event_id].x; end
  def y; $game_map.events[event_id].y; end
  def event; $game_map.events[event_id]; end
end
#==============================================================================
#==============================================================================
[/pre][/fold]

推鄉測試.rar

356.17 KB, 下载次数: 78

梦石
0
星屑
50
在线时间
158 小时
注册时间
2016-1-7
回帖
102
 楼主| 发表于 2016-3-30 02:28:31 | 显示全部楼层
本帖最后由 燕征 于 2016-3-31 03:33 编辑

我又換參考【其他】推箱子、滑行效果RGSS分享的範例+RPG製作大師教學 - 製作推箱子、倉庫番小遊戲終點的設置方法作一些小改動
於是可以實踐特定石頭移到特定黑洞上就不能再移動這件事
做法是
1.引入第一個連接的腳本:箱子、滑行
2.某石頭事件:p1讓他可以被推, p2讓他不能被推
[fold]
[/fold]
3.某洞事件:p1判斷某石頭是否進洞, p2因為有填石頭故洞消失(不寫的話因為p1沒有設觸發條件會GG)
[fold]
[/fold]

雖然可以用了,但除了原來問的第一種設置為何有問題我還是想知道外
這邊的做法我也有新的問題: 這作法只能針對特定石頭,然而我希望能做成對任意石頭都有效
圖3的條件分歧裡我用特定石頭和該事件x,y座標來判斷,不知道有沒有什麼方法可以換成我希望的對任意石頭有效呢?
(這邊還要說一下,原本我以為"與事件接觸"就是指事件接觸事件然後這樣就只需在洞設置消除接觸的石頭事件就好,然而這都是場誤會QQ而且我還是不知道如何獲取撞來的那顆石頭的事件ID)
回复

使用道具 举报

梦石
0
星屑
50
在线时间
158 小时
注册时间
2016-1-7
回帖
102
 楼主| 发表于 2016-3-31 02:35:05 | 显示全部楼层
本帖最后由 燕征 于 2016-3-31 03:32 编辑

我暫定至少可以正常使用的方法二了,但坑的設置上我發現如果設置為"可被穿透"
那麼這簡直是個大bug...因為主角也可以走上去了,但不設可被穿透,石頭就不能推上去...
這到底該怎麼解?

不知道會不會起到作用,不過還是附一下方法二使用的推箱腳本:

[fold=腳本: 箱子、滑行]
  1. #===================================================================
  2. #箱子、滑行 V1.01
  3. #BY 金也安里
  4. #===================================================================

  5. =begin
  6. ====================================
  7. ●功能:
  8. ====================================

  9. 簡單用腳本實現箱子、滑行事件、角色滑
  10. 行效果
  11. ====================================
  12. ●設置方法:
  13. ====================================

  14. 1.普通箱子事件頁
  15.  ◆腳本:box

  16.   進階設定
  17.   ◆腳本:box(移動速度,移動時動畫)
  18.   # 移動速度為 0 時使用自定義設置
  19.   # 移動時動畫為 0 使用自定義設置

  20.   
  21. 2.滑行箱子事件頁
  22.  ◆腳本:run_box

  23.   進階設定
  24.   ◆腳本:run_box(移動速度,移動時動畫)
  25.   # 移動速度為 0 時使用自定義設置
  26.   # 移動時動畫為 0 使用自定義設置

  27.   
  28. 3.滑行時,碰到地形標誌為 1 的區塊停下腳步
  29.   設定方法 資料庫>>圖塊>>地形數值設定
  30.   效果參考地圖 MAP001 的灰色區塊地板
  31.   
  32.   
  33. 4.其他設定詳見下面自定義設置

  34. =end

  35. module Anly_Mol
  36.   
  37.   #====================================
  38.   #● 自定義設置
  39.   #====================================
  40.   
  41.   # 角色滑行設定
  42.   RUN_PLAYER_SWI = 1        # 角色滑行開關
  43.   # 當此開關為被開啟時,角色行動模式轉變成滑行
  44.   # 關閉時,角色轉為正常移動,速度為滑行前的正常速度

  45.   RUN_PLAYER_MOVE_SPEED = 6 # 角色滑行速度
  46.   
  47.   # 一般箱子設定
  48.   BOX_MOVE_SPEED = 5 #箱子速度
  49.   BOX_ANI = false    #箱子是否移動時動畫
  50.   
  51.   # 滑行箱子設定
  52.   R_BOX_MOVE_SPEED = 5  #箱子速度
  53.   R_BOX_ANI = false     #箱子是否移動時動畫

  54. end



  55. class Interpreter
  56.   def box(spe=0,ani=0)
  57.     $game_map.events[@event_id].move_speed = spe == 0 ?
  58.     Anly_Mol::BOX_MOVE_SPEED : spe
  59.     $game_map.events[@event_id].walk_anime = ani == 0 ?
  60.     Anly_Mol::BOX_ANI : ani
  61.     case $game_player.direction
  62.     when 2
  63.       $game_map.events[@event_id].move_down
  64.     when 4
  65.       $game_map.events[@event_id].move_left
  66.     when 6
  67.       $game_map.events[@event_id].move_right
  68.     when 8
  69.       $game_map.events[@event_id].move_up
  70.     end
  71.   end
  72.   def run_box(spe=0,ani=0)
  73.     $game_map.events[@event_id].move_speed = spe == 0 ?
  74.     Anly_Mol::R_BOX_MOVE_SPEED : spe
  75.     $game_map.events[@event_id].walk_anime = ani == 0 ?
  76.     Anly_Mol::R_BOX_ANI : ani
  77.     case $game_player.direction
  78.     when 2
  79.       $game_map.events[@event_id].bmove_down
  80.     when 4
  81.       $game_map.events[@event_id].bmove_left
  82.     when 6
  83.       $game_map.events[@event_id].bmove_right
  84.     when 8
  85.       $game_map.events[@event_id].bmove_up
  86.     end
  87.   end
  88. end

  89. class Game_Player < Game_Character
  90.   #--------------------------------------------------------------------------
  91.   # ● 畫面更新
  92.   #--------------------------------------------------------------------------
  93.   def update
  94.     # 本地變量記錄移動訊息
  95.     last_moving = moving?
  96.     # 移動中、事件執行中、強制移動路線中、
  97.     # 訊息視窗一個也不顯示的時候
  98.     unless moving? or $game_system.map_interpreter.running? or
  99.            @move_route_forcing or $game_temp.message_window_showing
  100.       # 如果方向鍵被按下、主角就朝那個方向移動
  101.       if $game_switches[Anly_Mol::RUN_PLAYER_SWI] == true
  102.         case Input.dir4
  103.         when 2
  104.           bmove_down
  105.         when 4
  106.           bmove_left
  107.         when 6
  108.           bmove_right
  109.         when 8
  110.           bmove_up
  111.         end
  112.       else
  113.         @move_speed = @last_sp if
  114.           @move_speed != @last_sp
  115.         case Input.dir4
  116.         when 2
  117.           move_down
  118.         when 4
  119.           move_left
  120.         when 6
  121.           move_right
  122.         when 8
  123.           move_up
  124.         end
  125.       end
  126.     end
  127.     # 本地變量記憶座標
  128.     last_real_x = @real_x
  129.     last_real_y = @real_y
  130.     super
  131.     # 角色向下移動、畫面上的位置在中央下方的情況下
  132.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  133.       # 畫面向下捲動
  134.       $game_map.scroll_down(@real_y - last_real_y)
  135.     end
  136.     # 角色向左移動、畫面上的位置在中央左方的情況下
  137.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  138.       # 畫面向左捲動
  139.       $game_map.scroll_left(last_real_x - @real_x)
  140.     end
  141.     # 角色向右移動、畫面上的位置在中央右方的情況下
  142.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  143.       # 畫面向右捲動
  144.       $game_map.scroll_right(@real_x - last_real_x)
  145.     end
  146.     # 角色向上移動、畫面上的位置在中央上方的情況下
  147.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  148.       # 畫面向上捲動
  149.       $game_map.scroll_up(last_real_y - @real_y)
  150.     end
  151.     # 不在移動中的情況下
  152.     unless moving?
  153.       # 上次主角移動中的情況
  154.       if last_moving
  155.         # 與同位置的事件接觸就判斷為事件啟動
  156.         result = check_event_trigger_here([1,2])
  157.         # 沒有可以啟動的事件的情況下
  158.         if result == false
  159.           # 除錯模式為 ON 並且按下 CTRL 鍵的情況下除外
  160.           unless $DEBUG and Input.press?(Input::CTRL)
  161.             # 遇敵計算數值下降
  162.             if @encounter_count > 0
  163.               @encounter_count -= 1
  164.             end
  165.           end
  166.         end
  167.       end
  168.       # 按下 C 鍵的情況下
  169.       if Input.trigger?(Input::C)
  170.         # 判斷為同位置以及正面的事件啟動
  171.         check_event_trigger_here([0])
  172.         check_event_trigger_there([0,1,2])
  173.       end
  174.     end
  175.   end
  176. end

  177. class Game_Event < Game_Character
  178.   attr_accessor :move_speed
  179.   attr_accessor :walk_anime
  180.   attr_accessor :set_box
  181.   def initialize(map_id, event)
  182.     super()
  183.     @set_box = false
  184.     @map_id = map_id
  185.     @event = event
  186.     @id = @event.id
  187.     @erased = false
  188.     @starting = false
  189.     @through = true
  190.     # 初期位置的移動
  191.     moveto(@event.x, @event.y)
  192.     refresh
  193.   end
  194.   #--------------------------------------------------------------------------
  195.   # ● 更新
  196.   #--------------------------------------------------------------------------
  197.   alias add_refresh refresh
  198.   def refresh
  199.     add_refresh
  200.     if @list != nil
  201.       for i in 0...@list.size
  202.         if @list[i].parameters[0].is_a?(String)
  203.           if(/box/ =~ @list[i].parameters[0]) != nil
  204.             @set_box = true
  205.           end
  206.         end
  207.       end
  208.     end
  209.   end
  210. end

  211. class Game_Player < Game_Character
  212.   def check_event_trigger_touch(x, y)
  213.     result = false
  214.     # 事件執行中的情況下
  215.     if $game_system.map_interpreter.running?
  216.       return result
  217.     end
  218.     # 全事件的循環
  219.     for event in $game_map.events.values
  220.       # 事件座標與目標一致的情況下
  221.       if event.x == x and event.y == y
  222.         if [1,2].include?(event.trigger) or event.set_box == true
  223.           # 跳躍中以外的情況下、啟動判斷是正面的事件
  224.           if not event.jumping? and not event.over_trigger?
  225.             event.start
  226.             result = true
  227.           end
  228.         end
  229.       end
  230.     end
  231.     return result
  232.   end
  233. end

  234. class Game_Character
  235.   #--------------------------------------------------------------------------
  236.   # ● 初始化目標
  237.   #--------------------------------------------------------------------------
  238.   alias initialize_old initialize
  239.   def initialize
  240.     initialize_old
  241.     @last_sp = @move_speed
  242.   end
  243.   def run_tag(x,y)
  244.     return $game_map.terrain_tag(x,y)
  245.   end
  246.   #--------------------------------------------------------------------------
  247.   # ● 向下移動
  248.   #     turn_enabled : 本場地位置變更許可標誌
  249.   #--------------------------------------------------------------------------
  250.   def bmove_down(turn_enabled = true)
  251.     # 面向下
  252.     if turn_enabled
  253.       turn_down
  254.     end
  255.     if self.is_a?(Game_Player)
  256.       if run_tag(@x,@y+1) != 1
  257.         @move_speed = Anly_Mol::RUN_PLAYER_MOVE_SPEED if
  258.         @move_speed != Anly_Mol::RUN_PLAYER_MOVE_SPEED
  259.       else
  260.         @move_speed = @last_sp
  261.       end
  262.     end
  263.     if passable?(@x, @y, 2)
  264.       # 面向下
  265.       turn_down
  266.       # 更新座標
  267.       @y += 1
  268.       # 增加步數
  269.       increase_steps
  270.     else
  271.       # 接觸事件的啟動判斷
  272.       check_event_trigger_touch(@x, @y+1)
  273.     end
  274.     # 可以通行的場合
  275.     while terrain_tag != 1 && passable?(@x, @y, 2)
  276.       # 面向下
  277.       turn_down
  278.       # 更新座標
  279.       @y += 1
  280.       # 增加步數
  281.       increase_steps
  282.     end
  283.   end
  284.   #--------------------------------------------------------------------------
  285.   # ● 向左移動
  286.   #     turn_enabled : 本場地位置更改許可標誌
  287.   #--------------------------------------------------------------------------
  288.   def bmove_left(turn_enabled = true)
  289.     # 面向左
  290.     if turn_enabled
  291.       turn_left
  292.     end
  293.     if self.is_a?(Game_Player)
  294.       if run_tag(@x-1,@y) != 1
  295.         @move_speed = Anly_Mol::RUN_PLAYER_MOVE_SPEED if
  296.         @move_speed != Anly_Mol::RUN_PLAYER_MOVE_SPEED
  297.       else
  298.         @move_speed = @last_sp
  299.       end
  300.     end
  301.     if passable?(@x, @y, 4)
  302.       # 面向左
  303.       turn_left
  304.       # 更新座標
  305.       @x -= 1
  306.       # 增加步數
  307.       increase_steps
  308.     else
  309.       # 接觸事件的啟動判斷
  310.       check_event_trigger_touch(@x-1, @y)
  311.     end
  312.     # 可以通行的情況下
  313.     while terrain_tag != 1 && passable?(@x, @y, 4)
  314.       # 面向左
  315.       turn_left
  316.       # 更新座標
  317.       @x -= 1
  318.       # 增加步數
  319.       increase_steps
  320.     end
  321.   end
  322.   #--------------------------------------------------------------------------
  323.   # ● 向右移動
  324.   #     turn_enabled : 本場地位置更改許可標誌
  325.   #--------------------------------------------------------------------------
  326.   def bmove_right(turn_enabled = true)
  327.     # 面向右
  328.     if turn_enabled
  329.       turn_right
  330.     end
  331.     if self.is_a?(Game_Player)
  332.       if run_tag(@x+1,@y) != 1
  333.         @move_speed = Anly_Mol::RUN_PLAYER_MOVE_SPEED if
  334.         @move_speed != Anly_Mol::RUN_PLAYER_MOVE_SPEED
  335.       else
  336.         @move_speed = @last_sp
  337.       end
  338.     end
  339.     if passable?(@x, @y, 6)
  340.       # 面向右
  341.       turn_right
  342.       # 更新座標
  343.       @x += 1
  344.       # 增加步數
  345.       increase_steps
  346.     else
  347.       # 接觸事件的啟動判斷
  348.       check_event_trigger_touch(@x+1, @y)
  349.     end
  350.     # 可以通行的場合
  351.     while terrain_tag != 1 && passable?(@x, @y, 6)
  352.       # 面向右
  353.       turn_right
  354.       # 更新座標
  355.       @x += 1
  356.       # 增加步數
  357.       increase_steps
  358.     end
  359.   end
  360.   #--------------------------------------------------------------------------
  361.   # ● 向上移動
  362.   #     turn_enabled : 本場地位置更改許可標誌
  363.   #--------------------------------------------------------------------------
  364.   def bmove_up(turn_enabled = true)
  365.     # 面向右
  366.     if turn_enabled
  367.       turn_up
  368.     end
  369.     if self.is_a?(Game_Player)
  370.       if run_tag(@x,@y-1) != 1
  371.         @move_speed = Anly_Mol::RUN_PLAYER_MOVE_SPEED if
  372.         @move_speed != Anly_Mol::RUN_PLAYER_MOVE_SPEED
  373.       else
  374.         @move_speed = @last_sp
  375.       end
  376.     end
  377.     if passable?(@x,@y,8)
  378.       # 面向右
  379.       turn_up
  380.       # 更新座標
  381.       @y -= 1
  382.       # 增加步數
  383.       increase_steps
  384.     else
  385.       # 接觸事件的啟動判斷
  386.       check_event_trigger_touch(@x, @y-1)
  387.     end
  388.     # 可以通行的場合
  389.     while terrain_tag != 1 && passable?(@x, @y, 8)
  390.       # 面向上
  391.       turn_up
  392.       # 更新座標
  393.       @y -= 1
  394.       # 增加步數
  395.       increase_steps
  396.     end
  397.   end
  398. end
  399. #==============================================================================
  400. #轉載此腳本 請保留此行文字  BY RMXP小屋  金也安里
  401. #http://www.wretch.cc/blog/hauhauchen/
  402. #==============================================================================
复制代码
[/fold]
回复

使用道具 举报

梦石
0
星屑
50
在线时间
158 小时
注册时间
2016-1-7
回帖
102
 楼主| 发表于 2016-3-31 03:31:08 | 显示全部楼层
本帖最后由 燕征 于 2016-4-7 02:18 编辑

以上都是我另外弄新檔案單獨跑測試,現在我把東西先整合回專案裡就出現了問題
拿掉上面的推箱腳本就可不會有錯,放回去就會拼命錯



[fold=被衝突到的腳本 ◆Arpg_Game_Event(問題說是在35行)][pre lang="ruby"]#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 定義實例變量
  #--------------------------------------------------------------------------
  attr_reader   :trigger                  # 目標
  attr_reader   :list                     # 執行內容
  attr_reader   :starting                 # 啟動中標誌
  attr_accessor :attack_type              # 攻擊形態
  attr_accessor :attack_range             # 攻擊射程   
  #--------------------------------------------------------------------------
  # ● 初始化目標
  #--------------------------------------------------------------------------
  def initialize(map_id, event)
    super()
    @map_id = map_id
    @event = event
    @id = @event.id
    @erased = false
    @starting = false
    @through = true
    @attack_type = @event.attack_type
    @attack_range = @event.attack_range
    @event_enemy = []
    # 初期位置的移動
    moveto(@event.x, @event.y)
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 讀取敵人
  #--------------------------------------------------------------------------
  def enemy
    return @event_enemy[0]
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def refresh
    # 初始化本地變量 new_page
    new_page = nil
    # 如果不暫時清除
    unless @erased
      # 從編號大的事件頁按順序調查
      for page in @event.pages.reverse
        # 可以參考事件條件 c
        c = page.condition
        # 確認開關條件 1
        if c.switch1_valid
          if $game_switches[c.switch1_id] == false
            next
          end
        end
        # 確認開關條件 2
        if c.switch2_valid
          if $game_switches[c.switch2_id] == false
            next
          end
        end
        # 確認變量條件
        if c.variable_valid
          if $game_variables[c.variable_id] < c.variable_value
            next
          end
        end
        # 確認獨立開關條件
        if c.self_switch_valid
          key = [@map_id, @event.id, c.self_switch_ch]
          if $game_self_switches[key] != true
            next
          end
        end
        # 設定本地變量 new_page
        new_page = page
        # 放棄循環
        break
      end
    end
    # 與上次同一事件頁的情況下
    if new_page == @page
      # 過程結束
      return
    end
    # @page 設置為現在的事件頁
    @page = new_page
    # 清除啟動中標誌
    clear_starting
    # 沒有滿足條件的頁面的時候
    if @page == nil
      # 設定各實例變量
      @tile_id = 0
      @character_name = ""
      @character_hue = 0
      @move_type = 0
      @through = true
      @trigger = nil
      @list = nil
      @interpreter = nil
      @event_enemy = []
      # 過程結束
      return
    end
    # 設定各實例變量
    @tile_id = @page.graphic.tile_id
    @character_name = @page.graphic.character_name
    @character_hue = @page.graphic.character_hue
    if @original_direction != @page.graphic.direction
      @direction = @page.graphic.direction
      @original_direction = @direction
      @prelock_direction = 0
    end
    if @original_pattern != @page.graphic.pattern
      @pattern = @page.graphic.pattern
      @original_pattern = @pattern
    end
    @opacity = @page.graphic.opacity
    @blend_type = @page.graphic.blend_type
    @move_type = @page.move_type
    @move_speed = @page.move_speed
    @move_frequency = @page.move_frequency
    @move_route = @page.move_route
    @move_route_index = 0
    @move_route_forcing = false
    @walk_anime = @page.walk_anime
    @step_anime = @page.step_anime
    @direction_fix = @page.direction_fix
    @through = @page.through
    @always_on_top = @page.always_on_top
    @trigger = @page.trigger
    @list = @page.list
    @interpreter = nil
    if @event.enemy_id != 0
      # 讀取第一個註解
      if @list != nil
        for i in 0...@list.size
          if @list.parameters[0].is_a?(String)
            if @list.parameters[0] == "enemy"
              # 設置敵人
              @event_enemy[0] = Game_Enemy.new(@event.enemy_id,@id)
            end
          end
        end
      end
    end
    # 目標是 [平行處理] 的情況下
    if @trigger == 4
      # 生成平行處理用編譯器
      @interpreter = Interpreter.new
    end
    # 自動事件啟動判斷
    check_event_trigger_auto
  end  
end  [/pre][/fold]

也試過把推箱腳本放到下面衝突的那個腳本之上,結果可以進去,但整個遊戲都動不了
後來把方法一相關的腳本及公共事件設置刪掉後,遊戲可以動,但是人物一直處於無視地圖不可行走的滑行狀態,搞得我只能貼著地圖的四邊走
我想這應該是推箱腳本的滑行設定有關吧...總之我就去把51行的設置1改成0了(雖然我覺得原來設成1是代表正常走路QQ)
這時候衝突會發生在下方腳本的38行

所以我又覺得是一定是因為走路的設置發生了什麼事情
於是乾脆把推箱腳本的51行和覺得相關的115-140行都註解掉,這時一開遊戲就會直接給錯誤提示


為了不耽誤後續的關卡進度,所以我就在把"51行的設置1改成0"的情況下先把主角初始位置弄到下一張地圖去試試看能不能先至少跑劇情
結果雖然是可以跑,但是我的arpg打怪腳本好像已經死光了...怪依舊可以打(有時吧...我把前面還可以順利打怪的複製過來改掉圖片指令內容沒動,自己新造的連打都不能,複製過來改的可以打),但怪物卻不能追著玩家跑了
並且在這個情況下,回去推箱子那張地圖,主角也可以好好走路了...
我實在不知道這個情況下要怎麼破,連問題出在哪都不知道,線索也不知道要給些什麼,夠不夠

這樣子不管我用法一還是法二都無解....求幫助QQ

[fold=這次的衝突腳本 ◆Arpg_Game_Character ][pre lang="ruby"]#==============================================================================
# ■ Game_Character
#==============================================================================
class Game_Character
  attr_accessor :damage_pop            # 損傷標誌
  attr_accessor :damage                # 損傷值
  attr_accessor :sp_damage             # SP損傷值  
  attr_accessor :critical              # 會心一擊標誌
  attr_accessor :delay_count           # delay_count
  attr_accessor :actor_count           # actor_count  
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  alias arpgdamage initialize
  def initialize
    @damage_pop = false
    @damage = nil
    @sp_damage = nil
    @critical = false
    @delay_count = 0
    @actor_count = 0
    arpgdamage
  end
  #--------------------------------------------------------------------------
  # ● 更新畫面
  #--------------------------------------------------------------------------
  def update
    # 跳躍中、移動中、停止中的分歧
    if jumping?
      update_jump
    elsif moving?
      update_move
    else
      update_stop
    end
    # 動畫計算數值超過最大值的情況下
    # ※最大值等於基本值減去移動速度 * 1 的值
    if @anime_count > 18 - @move_speed * 2
      # 停止動畫為 OFF 並且在停止中的情況下
      if not @step_anime and @stop_count > 0
        # 還原為原來的圖形
        @pattern = @original_pattern
      # 停止動畫為 ON 並且在移動中的情況下
      else
        # 更新圖形
        @pattern = (@pattern + 1) % 4
      end
      # 清除動畫計算數值
      @anime_count = 0
    end
    if @delay_count > 0
      @delay_count -= 1
    end
    if @actor_count > 0
      @actor_count -= 1
    end   
    # 等待中的情況下
    if @wait_count > 0
      # 減少等待計算數值
      @wait_count -= 1
      return
    end
    # 強制移動路線的場合
    if @move_route_forcing
      # 自定義移動
      move_type_custom
      return
    end
    # 事件執行待機中並且為鎖定狀態的情況下
    if @starting or lock?
      # 不做規則移動
      return
    end
    # 如果停止計算數值超過了一定的值(由移動頻率算出)
    if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
      # 移動類型分歧
      case @move_type
      when 1  # 隨機
        move_type_random
      when 2  # 接近
        move_type_toward_player
      when 3  # 自定義
        move_type_custom
      end
    end
    # 讀取帶頭角色
    actor = $game_party.actors[0]
    if actor == nil
      return
    end
    # 角色沒死時
    unless actor.dead?
      # 執行ARPG我方事件
      arpg_actor_start  
      # ARPG敵事件死亡或不存在參數清除
      if self.is_a?(Game_Event)
        unless self.arpg_enemy?
          @delay_count = 0 if @delay_count != 0
          @actor_count = 0 if @actor_count != 0
          @attack_mode = [false,0] if @attack_mode != [false,0]        
        end
        # 執行ARPG敵人事件
        arpg_event_start
      end
    # 角色死亡時gameover
    else
      $game_temp.gameover = true
    end
  end
  #-------------------------------------------------------------------
  # ● 執行ARPG我方事件
  #---------------------------------------------------------------------
  def arpg_actor_start
    # 寫入角色
    actor = $game_party.actors[0]
    # 進行角色的狀態自然解除
    if self.is_a?(Game_Player)
      if Graphics.frame_count % 20 == 0
        actor.remove_states_auto
      end
    end
    # 事件執行中與角色不存在就強制返回
    if $game_system.map_interpreter.running? or actor == nil  
      return
    end
    # 角色延遲計數>0強制返回
    if @actor_count > 0
      return
    end   
    # 角色無法行動時
    if actor.restriction == 4
      return
    end
    # 角色混亂時
    if actor.restriction == 2 or actor.restriction == 3  
      # 目標是我方時
      if self.is_a?(Game_Player)
        # 我方普攻我方
        actor.arpg_attack_effect(actor,self)
      end
      return
    end
    # 參數初始
    sx = $game_player.x
    sy = $game_player.y
    skill_id = 0
    item_id = 0
    type = actor.attack_type
    range = actor.attack_range
    push_check = false
    start_check = false
    # 按C鍵時(普攻)
    if Input.press?(Input::C)
      push_check = true
    end
    # 開關2開啟時
    if $game_switches[2]
      # 按1鍵時(技能1=變數1的值)與還沒按鈕時
      if Kboard.press?($R_Key_1) && ! push_check
        if actor.arpg_skill_can_use?($game_variables[1])
          skill_id = $game_variables[1]
          push_check = true
        end
      end
      # 按2鍵時(技能2=變數2的值)與還沒按鈕時
      if Kboard.press?($R_Key_2) && ! push_check
        if actor.arpg_skill_can_use?($game_variables[2])
          skill_id = $game_variables[2]
          push_check = true
        end
      end
      # 按3鍵時(技能3=變數3的值)與還沒按鈕時
      if Kboard.press?($R_Key_3) && ! push_check
        if actor.arpg_skill_can_use?($game_variables[3])
          skill_id = $game_variables[3]
          push_check = true
        end
      end     
      # 按4鍵時(技能4=變數4的值)與還沒按鈕時
      if Kboard.press?($R_Key_4) && ! push_check
        if actor.arpg_skill_can_use?($game_variables[4])
          skill_id = $game_variables[4]
          push_check = true
        end
      end           
    end
    # 使用技能的情況
    if skill_id != 0
      # 寫入技能對象
      scope = $data_skills[skill_id].scope
      # 技能是對我方
      if scope >= 3
        # 目標是我方時
        if self.is_a?(Game_Player)        
          # 對我方使用技能
          actor.arpg_skill_effect(actor,$data_skills[skill_id],self)
        end
        return
      end
      type = $data_skills[skill_id].type
      range = $data_skills[skill_id].range
    end
    # 開關3開啟與目標是我方時
    if $game_switches[3] && self.is_a?(Game_Player)
      # 按Q鍵時(道具1=變數5的值)與還沒按鈕時
      if Kboard.press?($R_Key_Q) && ! push_check
        if $game_party.arpg_item_can_use?($game_variables[5])
          item_id = $game_variables[5]
          push_check = true
        end
      end           
      # 按W鍵時(道具2=變數6的值)與還沒按鈕時
      if Kboard.press?($R_Key_W) && ! push_check
        if $game_party.arpg_item_can_use?($game_variables[6])
          item_id = $game_variables[6]
          push_check = true
        end
      end           
      # 按E鍵時(道具3=變數7的值)與還沒按鈕時
      if Kboard.press?($R_Key_E) && ! push_check
        if $game_party.arpg_item_can_use?($game_variables[7])
          item_id = $game_variables[7]
          push_check = true
        end
      end           
      # 按R鍵時(道具4=變數8的值)與還沒按鈕時
      if Kboard.press?($R_Key_R) && ! push_check
        if $game_party.arpg_item_can_use?($game_variables[8])
          item_id = $game_variables[8]
          push_check = true
        end
      end   
      # 能使用道具的情況
      if $game_party.arpg_item_can_use?(item_id)
        # 我方使用道具
        actor.arpg_item_effect($data_items[item_id])
        return
      end
    end
    # 目標是我方與不是敵人就強制返回
    if self.is_a?(Game_Player) or ! self.arpg_enemy?
      return
    end
    # 定義敵人
    enemy = self.enemy   
    # 按下按鈕時
    if push_check
      # 直線判斷
      if type == 0
        for i in 0..range
          case $game_player.direction
          when 2 # 向下
            if @x == sx && @y == sy + i
              if self.list != nil
                start_check = true
                break
              end
            end
          when 4 # 向左
            if @x == sx - i && @y == sy
              if self.list != nil
                start_check = true
                break
              end
            end
          when 6 # 向右
            if @x == sx + i && @y == sy
              if self.list != nil
                start_check = true
                break
              end
            end
          when 8 # 向上
            if @x == sx && @y == sy - i
              if self.list != nil
                start_check = true
                break
              end
            end
          end
        end
      end
      # 矩形判斷
      if type == 1
        # 製作矩陣資料
        data = []
        w = range
        h = range*2
        for i in 0..h
          for j in 0..h
            data.push([(sx-w)+i,(sy-w)+j])
          end
        end
        # 敵人座標在矩陣資料內時
        if data.include?([@x,@y])
          if self.list != nil
            start_check = true
          end
        end
      end
      # 功擊成立時
      if start_check
        # 普攻時
        if skill_id == 0
          # 執行普攻敵方
          enemy.arpg_attack_effect(actor,self)
        # 技能時  
        else
          # 執行技能攻擊敵方
          enemy.arpg_skill_effect(actor,$data_skills[skill_id],self)
        end        
      end
    end
  end  
  #-------------------------------------------------------------------
  # ● 執行ARPG敵人事件
  #---------------------------------------------------------------------
  def arpg_event_start
    # 事件執行中的情況下
    if $game_system.map_interpreter.running?
      return
    end   
    # 不是敵人就強制返回
    unless self.arpg_enemy?
      return
    end
    # 定義敵人
    enemy = self.enemy
    # 進行敵人的狀態自然解除
    if Graphics.frame_count % 20 == 0
      enemy.remove_states_auto
    end        
    # 延遲計數>0強制返回
    if @delay_count > 0
      return
    end   
    # 寫入角色
    actor = $game_party.actors[0]
    # 敵人或角色不存在強制返回
    if enemy == nil or actor == nil
      return
    end
    # 敵人無法行動時強制返回
    if enemy.restriction == 4
      return
    end
    # 敵人移動模式選擇
    p_range = $game_variables[ENEMYRANGE]
    p1_range = (@x-$game_player.x).abs+(@y-$game_player.y).abs
    @move_type = @page.move_type
    # 如果停止計算數值超過了一定的值(由移動頻率算出)
    if @stop_count > (40 - 6 * 2) * (6 - 6)
      # 判斷主角在偵查範圍內
      if p1_range <= p_range
        # 向主角移動
        move_toward_player
        @move_type = 0
      end
    end
    # 生成敵人行動
    enemy.make_action(enemy.turn)
    enemy.turn += 1   
    # 初始化參數
    range = 1
    sx = $game_player.x
    sy = $game_player.y
    skill_id = 0
    type = enemy.attack_type
    range = enemy.attack_range
    scope = 1
    start_check = false
    # 檢查敵人行動條件
    case enemy.current_action.kind
    when 1 # 技能
      skill_id = enemy.current_action.skill_id
      # 不能使用技能的情況就將skill_id設為0
      unless enemy.arpg_skill_can_use?(skill_id)
        skill_id = 0
      end      
    end
    # 使用技能的情況
    if skill_id != 0
      # 寫入技能對象
      scope = $data_skills[skill_id].scope
      # 技能是攻擊型
      if scope < 3
        # 敵方沒有混亂時
        if enemy.restriction != 2 && enemy.restriction != 3        
          type = $data_skills[skill_id].type
          range = $data_skills[skill_id].range
        # 敵方混亂時  
        else
          # 敵人對自己使用技能
          enemy.arpg_skill_effect(enemy,$data_skills[skill_id],self)
          return
        end
      # 技能是回復輔助型
      else
        ko = false
        # 讀取技能附加狀態
        p_atates = $data_skills[skill_id].plus_state_set
        # 檢查敵人是否已擁有附加狀態?
        for i in p_atates
          unless enemy.states.include?(i)
            ko = true
            break
          end
        end
        # 敵人沒有技能要附加的狀態
        if ko
          # 敵人對自己使用技能
          enemy.arpg_skill_effect(enemy,$data_skills[skill_id],self)
          return
        # 敵人狀態已附加  
        else
          # 敵人有少血
          if enemy.hp < enemy.maxhp
            # 敵人對自己使用技能
            enemy.arpg_skill_effect(enemy,$data_skills[skill_id],self)
          end
          return
        end
      end      
    end
    # 直線判斷
    if type == 0
      for i in 0..range
        case @direction
        when 2 # 向下
          if sx == @x && sy == @y + i
            if self.list != nil
              start_check = true
              break
            end
          end
        when 4 # 向左
          if sx == @x - i && sy == @y
            if self.list != nil
              start_check = true
              break
            end
          end
        when 6 # 向右
          if sx == @x + i && sy == @y         
            if self.list != nil
              start_check = true
              break
            end
          end
        when 8 # 向上
          if sx == @x && sy == @y - i
            if self.list != nil
              start_check = true
              break
            end
          end
        end
      end
    end
    # 矩形判斷
    if type == 1
      # 製作矩陣資料
      data = []
      w = range
      h = range*2
      for i in 0..h
        for j in 0..h
          data.push([(@x-w)+i,(@y-w)+j])
        end
      end
      # 我方座標在矩陣資料內時
      if data.include?([sx,sy])
        if self.list != nil
          start_check = true
        end
      end
    end
    # 確認行動時
    if start_check
      # 普攻時
      if skill_id == 0
        # 執行普攻我方
        actor.arpg_attack_effect(enemy,self)
      # 技能時  
      else
        # 執行技能攻擊我方
        actor.arpg_skill_effect(enemy,$data_skills[skill_id],self)
      end
    end
  end
#--------------------------------------------------------------------------
# ● ARPG敵人的判斷
#--------------------------------------------------------------------------  
  def arpg_enemy?
    if self.is_a?(Game_Event)
      if self.enemy != nil
        if self.enemy.hp > 0
          return true
        end
      end
    end
    return false
  end
end[/pre][/fold]
回复

使用道具 举报

梦石
0
星屑
50
在线时间
158 小时
注册时间
2016-1-7
回帖
102
 楼主| 发表于 2016-4-6 01:24:06 | 显示全部楼层
最後我使用事件來實作推的功能

設在要被推的東西上

要達到進洞(或者某位置)的功能化,洞的設置同2F的機關1的設置(限定某物對某位置)
但這種方法會出現的問題是因為被推的東西設置成可被穿透,所以往不可通行的地方(比如牆壁)推,他就進牆了,偶而操作快一點人也可以進石頭

方法勉勉強強可以解決燃眉之急,然而還是希望可以把之前用過的2個方法的問題都解掉。
回复

使用道具 举报

梦石
0
星屑
56
在线时间
10 小时
注册时间
2015-10-8
回帖
21
发表于 2016-4-6 21:13:36 | 显示全部楼层
虽然我无法结局你的问题但是还是希望您能点击上面的<>按钮把代码框起来然后再折叠

点评

抱歉我沒注意到最後一篇沒有套到<>,已編輯修正  发表于 2016-4-7 02:19
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部