질문과 답변

Extra Form

=begin
■移動ルート機能ぱわーあっぷ RGSS2 DAIpage■ v0.6

●機能と使い方●
 移動ルートの設定に
  ・最短距離移動(障害物も考慮)
  ・指定エリア内ランダム移動(マップ機能のエリアを使用)
 などを追加します。
 また、移動タイプが「ランダム」でトリガーが「決定ボタン」、プライオリティが
 「通常キャラと同じ」のイベントがプレイヤーに押されていると、
 押された方向に動きます。町中など、狭いところでプレイヤーの通行を邪魔している
 場合などに使えます。

 移動ルートの設定、または自律移動の「カスタム」内のスクリプトで指定します。

【指定位置に向けて最短移動ルートで一歩移動】
 ※ x, yに目標座標を指定。

  target_p_move_auto(x, y)
 
【指定エリア内ランダム移動】お前ここから出てくるなって時に。
 ※ idでエリアを指定。

  move_type_area_random(id)
 
【指定キャラクターに近づく】
 ※ idに目標キャラクターIDを指定。0でプレイヤー。

  target_c_move_auto(id)

 
【通行可能な限り前進、通行不可でランダムに方向転換】

  search_front

 
●再定義している箇所●
  Game_Character、Game_Playerをエイリアス。

 ※同じ箇所を変更するスクリプトと併用した場合は競合する可能性があります。

●参考●
このスクリプトの一部の機能は以下のサイト様のものを参考にVX用に再構築しております。

RPGツクールシステム研究室
http://suppy1632.hp.infoseek.co.jp/

=end
#============================================================================
# カスタマイズポイント
#============================================================================
module DAI_Move
 
  # 指定位置へ最短距離移動時の再計算間隔歩数。
  # 少ないほど精度は高いが重くなる。
  P = 2
 
  # ランダム移動イベントがプレイヤーから遠ざかる機能を使用。
  E = true
 
end

#==============================================================================
# ■ Game_Character
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :move_type
  attr_reader   :stop_count
  attr_reader   :move_frequency
  #--------------------------------------------------------------------------
  # ● 目的地までの最短経路を作成
  #--------------------------------------------------------------------------
  def search_route(target_x, target_y, type = 0)
    @route_count = 0
    @target_route = []
    return false if target_x == @x and target_y == @y
    @openlist = [@x * 1000 + @y, target_x * 1000 + target_y]
    @closelist = {@x * 1000 + @y=>0, target_x * 1000 + target_y=>1}
    @lootlist = [[],[]]
    @pointer = 0
    while @pointer < @openlist.length
      for i in 1..4
        a = way(i)
        b = @openlist[@pointer]
        c = @lootlist[@pointer]
        if @closelist.include?(a)
          if @closelist[a] != @closelist[b]
            if @closelist[a] == 0
              half_route = c
              half_route.push 5 - i
              perfect_route = @lootlist[@openlist.index(a)]
            else
              half_route = @lootlist[@openlist.index(a)]
              perfect_route = c
              perfect_route.push i
            end
            half_route.reverse!
            perfect_route += half_route
            @target_route = perfect_route
            return @target_route
          end
        else
          if type == 0
            newloot(a, b, c, i) if dir_passable?(b / 1000, b % 1000, i * 2)
          else
            newloot(a, b, c, i) if dir_e_passable?(b / 1000, b % 1000, i * 2)
          end
        end
      end
      @pointer += 1
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 座標変換
  #--------------------------------------------------------------------------
  def way(i)
    case i
    when 1 ; a = @openlist[@pointer] + 1
    when 2 ; a = @openlist[@pointer] - 1000
    when 3 ; a = @openlist[@pointer] + 1000
    when 4 ; a = @openlist[@pointer] - 1
    end
    return a
  end
  #--------------------------------------------------------------------------
  # ● 経路追加
  #--------------------------------------------------------------------------
  def newloot(a, b, c, i)
    @openlist.push a
    @closelist[a] = @closelist[b]
    loot = c.dup
    if @closelist[a] == 0
      loot.push i
    else
      loot.push 5 - i
    end
    @lootlist.push loot
  end
  #--------------------------------------------------------------------------
  # ● 指定座標から指定方向への通行可能判定
  #--------------------------------------------------------------------------
  def dir_passable?(x, y, d)
    case d
    when 2 ; a = passable?(x, y + 1)
    when 4 ; a = passable?(x - 1, y)
    when 6 ; a = passable?(x + 1, y)
    when 8 ; a = passable?(x, y - 1)
    end
    return a
  end
  #--------------------------------------------------------------------------
  # ● キャラクターとの衝突を考えない指定方向への通行可能判定
  #--------------------------------------------------------------------------
  def dir_e_passable?(x, y, d)
    case d
    when 2 ; a = e_passable?(x, y + 1)
    when 4 ; a = e_passable?(x - 1, y)
    when 6 ; a = e_passable?(x + 1, y)
    when 8 ; a = e_passable?(x, y - 1)
    end
    return a
  end
  #--------------------------------------------------------------------------
  # ● キャラクターとの衝突を考えない通行可能判定
  #--------------------------------------------------------------------------
  def e_passable?(x, y)
    x = $game_map.round_x(x)
    y = $game_map.round_y(y)
    return false unless $game_map.valid?(x, y)
    return true if @through or debug_through?
    return false unless map_passable?(x, y)
    return true
  end
  #--------------------------------------------------------------------------
  # ● 最短移動ルートの配列に従い移動(イベントコマンド:スクリプト専用)
  #--------------------------------------------------------------------------
  def target_route_move(x, y)
    if search_route(x, y, 0) == false
      search_route(x, y, 1)
    else
      search_route(x, y)
    end
    move_route = RPG::MoveRoute.new
    for i in 0...@target_route.length
      move_route.list[i] = RPG::MoveCommand.new
      move_route.list[i].code = @target_route[i]
    end
    force_move_route(move_route)
    @target_route = []
    return
  end
  #--------------------------------------------------------------------------
  # ● 最短移動ルートの配列に従い一歩だけ移動(移動ルートの指定専用)
  #--------------------------------------------------------------------------
  def target_p_move_auto(x, y)
    if @route_count == DAI_Move::P or @target_route == nil
      if search_route(x, y, 0) == false
        search_route(x, y, 1)
      else
        search_route(x, y)
      end
    end
    case @target_route[@route_count]
    when 1 ; move_down
    when 2 ; move_left
    when 3 ; move_right
    when 4 ; move_up
    end
    @route_count += 1
    return
  end
  #--------------------------------------------------------------------------
  # ● 指定キャラクターに近づく(移動ルートの指定専用)
  #--------------------------------------------------------------------------
  def target_c_move_auto(id)
    if id == 0
      target = $game_player
    else
      target = $game_map.events[id]
    end
    return if target == nil
    target_p_move_auto(target.x, target.y)
  end
  #--------------------------------------------------------------------------
  # ● 通行可能な限り前進、通行不可でランダムに方向転換
  #--------------------------------------------------------------------------
  def search_front
    unless moving?
      if dir_passable?(@x, @y, @direction)
        move_forward
      else
        turn_random
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動タイプ : エリア内ランダム
  #--------------------------------------------------------------------------
  def move_type_area_random(id)
    case rand(6)
    when 0..1;  move_area_random(id)
    when 2..4;  move_forward if dir_passable_in_area?(@direction, id)
    when 5;     @stop_count = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● エリア内をランダムに移動
  #--------------------------------------------------------------------------
  def move_area_random(id)
    a = in_area_passable?(id)
    return if a.empty?
    b = rand(a.size)
    case a[b]
    when 2 ; move_down(false)
    when 4 ; move_left(false)
    when 6 ; move_right(false)
    when 8 ; move_up(false)
    end
  end
  #--------------------------------------------------------------------------
  # ● エリア内の通行可能な方向を取得
  #--------------------------------------------------------------------------
  def in_area_passable?(id)
    a = []
    a.push 2 if dir_passable_in_area?(2, id)
    a.push 4 if dir_passable_in_area?(4, id)
    a.push 6 if dir_passable_in_area?(6, id)
    a.push 8 if dir_passable_in_area?(8, id)
    return a
  end
  #--------------------------------------------------------------------------
  # ● 指定方向がエリア内で通行可能か?
  #--------------------------------------------------------------------------
  def dir_passable_in_area?(d, id)
    case d
    when 2
      return $game_map.in_area?(id, @x, @y + 1) && dir_passable?(@x, @y, 2)
    when 4
      return $game_map.in_area?(id, @x - 1, @y) && dir_passable?(@x, @y, 4)
    when 6
      return $game_map.in_area?(id, @x + 1, @y) && dir_passable?(@x, @y, 4)
    when 8
      return $game_map.in_area?(id, @x, @y - 1) && dir_passable?(@x, @y, 8)
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動タイプ : カスタム
  #--------------------------------------------------------------------------
  alias dai_custom_move_move_type_custom move_type_custom
  def move_type_custom
    return if @move_route.list[@move_route_index] == nil
    dai_custom_move_move_type_custom
  end
end
#==============================================================================
# ■ Game_Player
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 接触イベントの起動判定
  #--------------------------------------------------------------------------
  alias dai_custom_move_check_event_trigger_touch check_event_trigger_touch
  def check_event_trigger_touch(x, y)
    for event in $game_map.events_xy(x, y)
      if event.trigger == 0 && event.priority_type == 1 && DAI_Move::E &&
      event.move_type == 1 && event.stop_count > 30 * (4 - event.move_frequency)
        event.move_away_from_player
      end
    end
    dai_custom_move_check_event_trigger_touch(x, y)
  end
end
#==============================================================================
# ■ Game_Map
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # ● エリア内判定
  #--------------------------------------------------------------------------
  def in_area?(id, x, y)
    area = $data_areas[id]
    return false if area == nil
    return false if $game_map.map_id != area.map_id
    return false if x < area.rect.x
    return false if y < area.rect.y
    return false if x >= area.rect.x + area.rect.width
    return false if y >= area.rect.y + area.rect.height
    return true
  end
end


여기에서 어디가 오류가 있는지 그리고 혹시 가능하시다면 오류수정하신걸 댓글로 알려주세요.

Comment '4'
  • ?
    AltusZeon 2014.08.07 17:41

    해당 스크립트는 RGSS2(VX) 스크립트입니다.
    일반적으로 VX Ace에서는 사용이 불가능합니다.

    도움될만한 스레가 있기에 아래에 링크를 적어둡니다.
    http://forums.rpgmakerweb.com/index.php?/topic/11130-is-it-possible-convert-this-script-for-rgss3-for-example-there-is-in-the-witchs-house/

  • ?
    고투더퓨처 2014.08.08 00:36
    아.....
    한번 홈페이지에 들어가 봤는데 영어라 해석이 잘 안되네요....ㅠㅠ
    내용을 어느정도 보니 어떤 외국분이 이문제 때문에 해결이 되었다는 내용은 있네요...ㅜㅜ
    혹시 어떻게 해야하는지 나중에 한번 가르켜 줄수 있나요????........
  • ?
    AltusZeon 2014.08.08 03:00

    해당 스크립트를 대체할 수 있는 비슷한 Path Finding System Script가 VX Ace에도 있다는 내용입니다.
    http://forums.rpgmakerweb.com/index.php?/topic/1640-near-fantasticas-path-finder-v1-for-rpg-maker-vx-ace/
    http://forums.rpgmakerweb.com/index.php?/topic/7659-ses-event-movement-path-finding-patrol-routes-and-more/

  • ?
    고투더퓨처 2014.08.10 17:39
    아 답이 늦었네요....
    감사합니다 ^^.
    한번 시도해버고 나중에 안되면 글을 올리겠습니다...^^

List of Articles
종류 분류 제목 글쓴이 날짜 조회 수
공지 묻고 답하기 가이드 습작 2014.06.14 12441
RMVX 타이틀 메뉴 바꾸기.. 여전히 안되네요 ㅠ 2 펜슬 2011.02.10 890
RMXP 타이틀 메뉴 변경 질문 1 알피지가좋아요 2013.08.16 1071
RMVX 타이틀 메뉴 사각 상자 없애기 2 file 비첼 2013.12.23 1190
RMVX 타이틀 메뉴 순서 바꾸는 방법 있나요? 1 상생 2012.01.08 2526
RMVXA 타이틀 메뉴 추가 2 u-ni 2016.03.13 330
RMVX 타이틀 메뉴 추가 방법 & 타이틀 메뉴 선택 시 팝업 뜨게하는 방법 1 mihael0539 2012.01.18 2882
RMXP 타이틀 메뉴 추가를 어떻게 하나요? 1 작삼 2014.10.26 951
RMVXA 타이틀 메뉴들의 텍스트를 가운데로 정렬하고 싶어요 1 mono1109 2014.06.20 1440
기타 RMMV 타이틀 메뉴를 추가하고싶습니다. 2 Jmyu 2019.04.01 194
플러그인 추천 RMMV 타이틀 메뉴에 이미지 모음 앨범 만드는 방법 3 훈레기 2019.01.17 303
RMVXA 타이틀 메뉴의 간격과 투명도(타이틀만) 1 file 고로야기 2015.02.21 373
플러그인 사용 RMMV 타이틀 메뉴의 모습을 바꾸고 싶습니다 7 file 소녀160 2019.05.04 927
RMVX 타이틀 메뉴의 위치를 변경하고싶어요 1 file 곰개 2014.10.11 678
RMVX 타이틀 메뉴이름 4 234324 2011.08.30 1657
RMVX 타이틀 메뉴창을 바꾸고 싶습니다. 페포릴 2016.01.17 260
RMVX 타이틀 바꾸기. 2 하령 2012.03.01 2580
RMXP 타이틀 배경 노래바꾸는법 1 김빅밤 2010.09.19 1124
RMVXA 타이틀 배경 엔딩별로 바꿔지기 2 file 아툥아용 2018.12.13 179
RMXP 타이틀 배경의 설정 2 file 제프 2014.05.17 892
RMVX 타이틀 브금을 바꾸는 방법 1 옥타브_소프라노 2014.10.09 458
Board Pagination Prev 1 ... 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 ... 516 Next
/ 516