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

Project1

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

[已经解决] 八方行走

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
7 小时
注册时间
2013-10-27
帖子
28
跳转到指定楼层
1
发表于 2013-11-2 14:55:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
我找了几个不错的人物行走图,但图片是由八个方向的,该怎么让角色可以向八个方向行走?顺便求一个VA的脚本教程,作为脚本白制作总很麻烦{:2_263:}

Lv5.捕梦者

梦石
0
星屑
22963
在线时间
8639 小时
注册时间
2011-12-31
帖子
3367
2
发表于 2013-11-2 16:12:11 | 只看该作者
本帖最后由 tseyik 于 2013-11-2 18:05 编辑

先把圖放上来看看
八方向行走




RUBY 代码复制
  1. #==============================================================================
  2. # ■ 注釈取得スクリプト (VX Ace用)
  3. #------------------------------------------------------------------------------
  4. # 製作者     : CanariAlternate
  5. # サイト名   : カルトの鳥篭
  6. # サイトURL  : [url]http://canarialt.blog.fc2.com[/url]
  7. #------------------------------------------------------------------------------
  8. # ■ 概要 : 注釈を取得する処理を定義する。
  9. #
  10. # ■ 必須 : なし
  11. #
  12. # ■ 位置 : 「Game_Event」より下
  13. #------------------------------------------------------------------------------
  14. # ■ 注釈での設定方法
  15. #   以下の例のように実行内容の1行目から注釈以外のコマンドまでの注釈のどこかに
  16. #   キーワードを記述すると有効(結果を反転してる場合には無効)になります。
  17. #
  18. #             例 : 実行内容
  19. #                   ◆注釈:キーワードA キーワードC
  20. #                   :    :キーワードG キーワードF
  21. #                   :    :キーワードE
  22. #                   ◆注釈:キーワードD
  23. #                   :    :キーワードH キーワードB
  24. #                   ◆変数の操作などの注釈以外のイベントコマンド
  25. #                   ◆注釈:ここ以下に書いても無視される。
  26. #                   ◆
  27. #
  28. # ※キーワードとなる文字列の設定は正規表現です。詳しいことはヘルプを「正規表現」で検索すると出てきます。
  29. #   簡単に言うと / で囲まれた文字列があるかないかで判定します。
  30. #   \ とか ! みたいな記号を使いたい時はヘルプを参照して下さい。
  31. #   設定例、/\[キーワード\]/  #=>  [キーワード]
  32. #
  33. # ※キーワードを記述すると有効と無効が切り替わります。初期状態は無効です。
  34. #   例 : 初期状態を反転, 記述したイベントの全ての頁を反転, 記述した頁のみを反転
  35. #   まず  「初期状態を反転」                  で有効に
  36. #   次に  「記述したイベントの全ての頁を反転」で無効に
  37. #   最後に「記述した頁のみを反転」            で有効に
  38. #------------------------------------------------------------------------------
  39. # 更新履歴 : 2012/10/05 Ver1.00 コードを共通処理スクリプトに統一
  40. #            2012/10/06 Ver1.01 コードを共通処理スクリプトから分離
  41. #            2012/10/08 Ver1.02 コードの整理
  42. #            2013/02/19 Ver1.03 共通処理スクリプトの廃止による変更を施した。
  43. #==============================================================================
  44.  
  45. $imported ||= {}
  46. $imported[:CanariAlternate_EventNote] = true
  47.  
  48. #==============================================================================
  49. # ■ Calt
  50. #------------------------------------------------------------------------------
  51. #  CanariAlternateが製作したスクリプトの管理用モジュール
  52. #==============================================================================
  53. module Calt
  54.   #--------------------------------------------------------------------------
  55.   # ● イベントコマンドから注釈を取得 [新規]
  56.   #--------------------------------------------------------------------------
  57.   def self.Read_EventNote(list)
  58.     return String.new unless list && list[i = 0].code == 108
  59.     note = list[i].parameters[0]
  60.     note += "\n#{list[i].parameters[0]}" while [108, 408].include?(list[i += 1].code)
  61.     return note
  62.   end
  63. end
  64.  
  65. #==============================================================================
  66. # ■ Game_Event
  67. #------------------------------------------------------------------------------
  68. #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
  69. # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
  70. #==============================================================================
  71. class Game_Event < Game_Character
  72.   #--------------------------------------------------------------------------
  73.   # ● イベントページの設定をセットアップ [追加]
  74.   #--------------------------------------------------------------------------
  75.   alias setup_page_settings_EventNote setup_page_settings
  76.   def setup_page_settings
  77.     setup_page_settings_EventNote
  78.     setup_note_settings
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # ● イベントページ更新時に注釈から設定を取得 [新規]
  82.   #--------------------------------------------------------------------------
  83.   def setup_note_settings
  84.     # 注釈の取得処理はここに追加
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # ● 1頁目の注釈にキーワードが含まれているか判定 [新規]
  88.   #--------------------------------------------------------------------------
  89.   def whole_note_include?(keyword)
  90.     return @event.pages[0].event_note =~ keyword ? true : false
  91.   end
  92.   #--------------------------------------------------------------------------
  93.   # ● この頁の注釈にキーワードが含まれているか判定 [新規]
  94.   #--------------------------------------------------------------------------
  95.   def event_note_include?(keyword)
  96.     return @page.event_note =~ keyword ? true : false
  97.   end
  98. end
  99.  
  100. #==============================================================================
  101. # ■ RPG::Event::Page
  102. #------------------------------------------------------------------------------
  103. #  イベントページのデータクラス。
  104. #==============================================================================
  105. class RPG::Event::Page
  106.   #--------------------------------------------------------------------------
  107.   # ● 取得する注釈内容を変更 [新規]
  108.   #--------------------------------------------------------------------------
  109.   attr_writer   :event_note
  110.   #--------------------------------------------------------------------------
  111.   # ● この頁の注釈を取得 [新規]
  112.   #--------------------------------------------------------------------------
  113.   def event_note
  114.     return @event_note ||= Calt::Read_EventNote(@list)
  115.   end
  116. end

RUBY 代码复制
  1. #==============================================================================
  2. # ■ プレイヤーの8方向移動+斜め歩行グラに対応+その他 (VX Ace用)
  3. #------------------------------------------------------------------------------
  4. # 製作者     : CanariAlternate
  5. # サイト名   : カルトの鳥篭
  6. # サイトURL  : [url]http://canarialt.blog.fc2.com[/url]
  7. #------------------------------------------------------------------------------
  8. # ■ 概要 : 移動関連の機能を詰め込んだスクリプトです。
  9. #           必要な機能だけ追加するように設定することも出来ます。
  10. #           「プレイヤー操作拡張」「斜め向き画像の実装」「ダッシュの入力を反転」「斜めの通行可能判定」
  11. # ■ 必須 : 「注釈取得スクリプト」※斜め歩行グラフィックを使用しない場合は不要
  12. #
  13. # ■ 位置 : 「イベント起動判定拡張」より下
  14. #           「注釈取得スクリプト」より下
  15. #------------------------------------------------------------------------------
  16. # ■ 機能 : プレイヤーの8方向移動&斜め移動でスムーズに移動など
  17. #           臼井の会様にて配布されている斜め歩行グラフィックに対応
  18. #           走行状態をダッシュのデフォルトにする。
  19. #           プレイヤーの移動操作禁止と許可をスイッチで切り替える。
  20. #           斜めの通行可能判定をオートタイル(A1タイル)を考慮したものに変更
  21. #------------------------------------------------------------------------------
  22. # 更新履歴 : 2013/07/08 Ver1.00 複数のスクリプトを再設計し、これにまとめた。
  23. #            2013/07/10 Ver1.01 斜め向きでの起動不可が機能していないバグを修正した。
  24. #            2013/07/10 Ver1.02 スクリプトの設定に関する説明を修正した。
  25. #==============================================================================
  26.  
  27. $imported ||= {}
  28. $imported[:CanariAlternate_MoveSystems] = true
  29.  
  30. #==============================================================================
  31. # ■ Calt
  32. #------------------------------------------------------------------------------
  33. #  CanariAlternateが製作したスクリプト用のモジュールです。
  34. #==============================================================================
  35. module Calt
  36.   #----------------------------------------------------------------------------
  37.   # ◆プレイヤーの8方向移動を使用するか
  38.   DiagonalMovePlayer = true   # true / false
  39.   #
  40.   # 設定した番後のスイッチがONの時は8方向移動を禁止(0の場合は常にOFF)
  41.   DiagonalMoveProhibition = 0 # スイッチ番号
  42.   #
  43.   # 設定した番号のスイッチがONの時は斜め方向の移動に失敗した場合に
  44.   # 滑るように縦または横に移動する機能を無効化(0の場合は常にOFF)
  45.   DiagonalMoveSlide = 0       # スイッチ番号
  46.   #
  47.   # そのキーを押している間は斜め移動しか出来なくなるキーを設定(nil を設定で無効)
  48.   # キー候補一覧 :SHIFT :CTRL :ALT :A :B :C :X :Y :Z :L :R :F5 :F6 :F7 :F8 :F9
  49.   DiagonalMoveOnlyKey = :ALT  # Inputモジュールの定数
  50.   #
  51.   # そのキーを押している間は移動はせず方向転換をするキーを設定(nil を設定で無効)
  52.   # キー候補一覧 :SHIFT :CTRL :ALT :A :B :C :X :Y :Z :L :R :F5 :F6 :F7 :F8 :F9
  53.   ChangeTurnModeKey = :CTRL   # Inputモジュールの定数
  54.   #----------------------------------------------------------------------------
  55.   # ◆斜め歩行グラフィックを使用するか
  56.   DiagonalCharacterGraphic = true # true / false
  57.   #
  58.   # 斜め向きでの起動不可のキーワード
  59.   # ※プレイヤーに斜めの歩行グラフィックを用意すると斜め方向からイベントを起動出来るようになります。
  60.   # 一部のイベントは斜め方向から起動されると都合が悪い場合があります。(例えば、扉など)
  61.   # イベントの実行内容の先頭に注釈でキーワードを記述することで斜め方向から起動出来なくなります。
  62.   DiagonalNotStartNote    = /\[斜め向きでの起動不可\]/  # 記述した頁に適用
  63.   DiagonalNotStartAllNote = /\<斜め向きでの起動不可\>/  # 全ての頁に適用(1頁目に記述)
  64.   DiagonalNotStartReverse = false                       # 全てのイベントの初期状態を反転
  65.   #
  66.   # 斜め歩行グラフィック画像の名前
  67.   # ※この名前の画像を用意すると斜めを向いた時にその画像になる
  68.   #
  69.   # ◇画像名の先頭に $ がついている場合(1キャラ分の画像)
  70.   #   初期設定では斜め向き画像の名前は 画像名-X となる。
  71.   #   例えば、$mainActor に斜め画像をつけたければ $mainActor-X という画像を用意する。
  72.   DiagonalCharacterName      = "%s-X"
  73.   #
  74.   # ◇画像名の先頭に $ がついていない場合(8キャラ分の画像)
  75.   #   初期設定では斜め向き画像の名前は $画像名-X-番号 となる。
  76.   #   番号は 1~8 でどのキャラの斜め画像か指定する。1 2 3 4
  77.   #                                                 5 6 7 8
  78.   #   例えば、actor5 の4番のキャラに斜め画像をつけたければ $actor5-X-4 という画像を用意する。
  79.   DiagonalCharacterIndexName = "$%s-X-%s"
  80.   #----------------------------------------------------------------------------
  81.   # ◆走行状態をダッシュのデフォルトにするを使用するか
  82.   DashDefaultDash = true  # true / false
  83.   #
  84.   # 設定した番号のスイッチがONの時は歩行がデフォルトになる(0の場合は常にOFF)
  85.   DashDefaultWalk = 0     # スイッチ番号
  86.   #----------------------------------------------------------------------------
  87.   # ◆プレイヤーの移動操作禁止を使用するか
  88.   PlayerImpossibleOperation = true  # true / false
  89.   #
  90.   # 設定した番号のスイッチがONの時はプレイヤーの移動操作を禁止(0の場合は常にOFF)
  91.   MoveByInputProhibition = 0        # スイッチ番号
  92.   #----------------------------------------------------------------------------
  93.   # ◆斜めの通行可能判定をオートタイル(A1タイル)を考慮したものに変更を使用するか
  94.   DiagonalMoveNatural = true  # true / false
  95.   #
  96.   # 斜め通過を許可する地形タグ(A1タイルに設定した場合は元々が許可なので禁止に)
  97.   # ここで設定した地形タグを設定したタイルは斜め通過を許可(A1タイルは禁止)する。
  98.   DiagonalMoveNaturalTag = [] # 例 [1, 2, 5]
  99.   #----------------------------------------------------------------------------
  100. end
  101.  
  102. ###############################################################################
  103. # ■ プレイヤーの8方向移動に関する変更
  104. ###############################################################################
  105. if Calt::DiagonalMovePlayer
  106. #==============================================================================
  107. # ■ Game_CharacterBase
  108. #------------------------------------------------------------------------------
  109. #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ
  110. # ラフィックなどの基本的な情報を保持します。
  111. #==============================================================================
  112. class Game_CharacterBase
  113.   #--------------------------------------------------------------------------
  114.   # ● キャラクターの斜め画像の有無を取得 [新規]
  115.   #--------------------------------------------------------------------------
  116.   def character_diagonal
  117.     return false
  118.   end
  119. end
  120.  
  121. #==============================================================================
  122. # ■ Game_Player
  123. #------------------------------------------------------------------------------
  124. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  125. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  126. #==============================================================================
  127. class Game_Player < Game_Character
  128.   #--------------------------------------------------------------------------
  129.   # ● 方向ボタン入力による移動処理 [◆再定義]
  130.   #--------------------------------------------------------------------------
  131.   def move_by_input
  132.     return if !movable? || $game_map.interpreter.running?
  133.     if $game_switches[Calt::DiagonalMoveProhibition]
  134.       move_4_way  # 斜め移動を禁止のスイッチがON (4方向移動)
  135.     else
  136.       move_8_way  # 斜め移動を禁止のスイッチがOFF(8方向移動)
  137.     end
  138.   end
  139.   #--------------------------------------------------------------------------
  140.   # ● 4方向移動の処理 [新規]
  141.   #--------------------------------------------------------------------------
  142.   def move_4_way
  143.     if Calt::ChangeTurnModeKey && Input.press?(Calt::ChangeTurnModeKey)
  144.       set_direction(Input.dir4) if Input.dir4 > 0 # 方向転換
  145.     else
  146.       move_straight(Input.dir4) if Input.dir4 > 0 # 移動処理
  147.     end
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ● 8方向移動の処理 [新規]
  151.   #--------------------------------------------------------------------------
  152.   def move_8_way
  153.     if Calt::ChangeTurnModeKey && Input.press?(Calt::ChangeTurnModeKey)
  154.       if character_diagonal
  155.         # 方向転換(斜め画像あり)
  156.         if Input.dir8 > 0
  157.           if Calt::DiagonalMoveOnlyKey && Input.press?(Calt::DiagonalMoveOnlyKey)
  158.             set_direction(Input.dir8) if Input.dir8 % 2 == 1  # 方向転換(斜めのみ)
  159.           else
  160.             set_direction(Input.dir8)                         # 方向転換8方向
  161.           end
  162.         end
  163.       else
  164.         set_direction(Input.dir4) if Input.dir4 > 0 # 方向転換(斜め画像なし)
  165.       end
  166.     else
  167.       # 移動処理8方向
  168.       if (d = Input.dir8) > 0
  169.         case d
  170.         when 1 ; move_diagonal_select(4, 2)
  171.         when 3 ; move_diagonal_select(6, 2)
  172.         when 7 ; move_diagonal_select(4, 8)
  173.         when 9 ; move_diagonal_select(6, 8)
  174.         else
  175.           # 移動処理4方向
  176.           unless Calt::DiagonalMoveOnlyKey && Input.press?(Calt::DiagonalMoveOnlyKey)
  177.             move_straight(d)
  178.           end
  179.         end
  180.       end
  181.     end
  182.   end
  183.   #--------------------------------------------------------------------------
  184.   # ● 滑り移動の有無を判定して適当な方の斜め移動を実行 [新規]
  185.   #--------------------------------------------------------------------------
  186.   def move_diagonal_select(horz, vert)
  187.     if $game_switches[Calt::DiagonalMoveSlide] ||
  188.        Calt::DiagonalMoveOnlyKey && Input.press?(Calt::DiagonalMoveOnlyKey)
  189.       move_diagonal(horz, vert)       # 滑り移動は無効
  190.     else
  191.       move_diagonal_slide(horz, vert) # 滑り移動は有効
  192.     end
  193.   end
  194.   #--------------------------------------------------------------------------
  195.   # ● 移動成功か判定(滑り移動付き斜めに移動の処理用) [新規]
  196.   #--------------------------------------------------------------------------
  197.   def move_succeed_slide?
  198.     return true if @move_succeed                  # 普通に移動成功の場合
  199.     return true if $game_map.any_event_starting?  # イベントを起動準備中の場合
  200.     return true if $game_map.interpreter.running? # イベントを実行中の場合
  201.     return false
  202.   end
  203.   #--------------------------------------------------------------------------
  204.   # ● 滑り移動付き斜めに移動(プレイヤー操作専用) [新規]
  205.   #--------------------------------------------------------------------------
  206.   def move_diagonal_slide(horz, vert, turn_ok = true)
  207.     old_direction = @direction  # 現在の向きを記憶
  208.     if Calt::DiagonalCharacterGraphic
  209.       move_diagonal(horz, vert, turn_ok)  # 斜めグラを使用する場合
  210.     else
  211.       move_diagonal(horz, vert)           # 斜めグラを使用しない場合
  212.     end
  213.     new_direction = @direction  # 新しい向きを記憶
  214.     unless move_succeed_slide?
  215.       if old_direction == 2 || old_direction == 8
  216.         direction1 = horz  # 現在、縦の場合は横優先
  217.         direction2 = vert
  218.       elsif old_direction == 4 || old_direction == 6
  219.         direction1 = vert  # 現在、横の場合は縦優先
  220.         direction2 = horz
  221.       else
  222.         direction1 = vert  # 現在、斜めの場合は縦優先
  223.         direction2 = horz
  224.       end
  225.       if passable?(x, y, direction1)
  226.         move_straight(direction1, turn_ok)  # 移動可能なので移動
  227.         #@direction = new_direction if Calt::DiagonalCharacterGraphic  # 向きを斜めに戻す
  228.       elsif passable?(x, y, direction2)
  229.         move_straight(direction2, turn_ok)  # 移動可能なので移動
  230.         #@direction = new_direction if Calt::DiagonalCharacterGraphic  # 向きを斜めに戻す
  231.       else
  232.         # 縦横ともに移動不可なのでイベントの起動を試行
  233.         move_straight(direction1, turn_ok)
  234.         move_straight(direction2, turn_ok) unless move_succeed_slide?
  235.         # 縦横ともに起動不可の場合は向きを戻す
  236.         @direction = new_direction unless move_succeed_slide?
  237.       end
  238.     end
  239.   end
  240. end
  241. end
  242.  
  243. ###############################################################################
  244. # ■ 斜め歩行グラフィックに関する変更
  245. ###############################################################################
  246. if Calt::DiagonalCharacterGraphic
  247. #==============================================================================
  248. # ■ Game_Map
  249. #------------------------------------------------------------------------------
  250. #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
  251. # このクラスのインスタンスは $game_map で参照されます。
  252. #==============================================================================
  253. class Game_Map
  254.   #--------------------------------------------------------------------------
  255.   # ● 特定の方向に 1 マスずらした X 座標の計算(ループ補正なし)[追加]
  256.   #--------------------------------------------------------------------------
  257.   alias x_with_direction_MoveSystems x_with_direction
  258.   def x_with_direction(x, d)
  259.     d = d == 1 || d == 7 ? 4 : 6 if d % 2 == 1 && d != 5 # dをx方向に変換
  260.     x_with_direction_MoveSystems(x, d)
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # ● 特定の方向に 1 マスずらした Y 座標の計算(ループ補正なし)[追加]
  264.   #--------------------------------------------------------------------------
  265.   alias y_with_direction_MoveSystems y_with_direction
  266.   def y_with_direction(y, d)
  267.     d = d == 1 || d == 3 ? 2 : 8 if d % 2 == 1 && d != 5 # dをy方向に変換
  268.     y_with_direction_MoveSystems(y, d)
  269.   end
  270.   #--------------------------------------------------------------------------
  271.   # ● 特定の方向に 1 マスずらした X 座標の計算(ループ補正あり)[追加]
  272.   #--------------------------------------------------------------------------
  273.   alias round_x_with_direction_MoveSystems round_x_with_direction
  274.   def round_x_with_direction(x, d)
  275.     d = d == 1 || d == 7 ? 4 : 6 if d % 2 == 1 && d != 5 # dをx方向に変換
  276.     round_x_with_direction_MoveSystems(x, d)
  277.   end
  278.   #--------------------------------------------------------------------------
  279.   # ● 特定の方向に 1 マスずらした Y 座標の計算(ループ補正あり)[追加]
  280.   #--------------------------------------------------------------------------
  281.   alias round_y_with_direction_MoveSystems round_y_with_direction
  282.   def round_y_with_direction(y, d)
  283.     d = d == 1 || d == 3 ? 2 : 8 if d % 2 == 1 && d != 5 # dをy方向に変換
  284.     round_y_with_direction_MoveSystems(y, d)
  285.   end
  286.   #--------------------------------------------------------------------------
  287.   # ● 通常キャラの通行可能判定 [追加]
  288.   #--------------------------------------------------------------------------
  289.   alias passable_MoveSystems? passable?
  290.   def passable?(x, y, d, *args)
  291.     if d % 2 == 1 && d != 5
  292.       horz = d == 1 || d == 7 ? 4 : 6
  293.       vert = d == 1 || d == 3 ? 2 : 8
  294.       x2 = round_x_with_direction(x, horz)
  295.       y2 = round_y_with_direction(y, vert)
  296.       return (passable_MoveSystems?(x, y, vert, *args) &&
  297.               passable_MoveSystems?(x, y2, 10 - vert, *args) &&
  298.               passable_MoveSystems?(x, y2, horz, *args)) ||
  299.              (passable_MoveSystems?(x, y, horz, *args) &&
  300.               passable_MoveSystems?(x2, y, 10 - horz, *args) &&
  301.               passable_MoveSystems?(x2, y, vert, *args))
  302.     else
  303.       return passable_MoveSystems?(x, y, d, *args)
  304.     end
  305.   end
  306. end
  307.  
  308. #==============================================================================
  309. # ■ Game_CharacterBase
  310. #------------------------------------------------------------------------------
  311. #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ
  312. # ラフィックなどの基本的な情報を保持します。
  313. #==============================================================================
  314. class Game_CharacterBase
  315.   #--------------------------------------------------------------------------
  316.   # ● 公開インスタンス変数
  317.   #--------------------------------------------------------------------------
  318.   attr_reader :character_diagonal  # キャラクターの斜め画像の有無を取得
  319.                                    # ■変数への直接アクセスによる取得は禁止■
  320.   #--------------------------------------------------------------------------
  321.   # ● 公開メンバ変数の初期化 [追加]
  322.   #--------------------------------------------------------------------------
  323.   alias init_public_members_MoveSystems init_public_members
  324.   def init_public_members
  325.     init_public_members_MoveSystems
  326.     @character_diagonal = false
  327.   end
  328.   #--------------------------------------------------------------------------
  329.   # ● 斜め向きか判定 [新規]
  330.   #--------------------------------------------------------------------------
  331.   def direction_diagonal?(d = @direction)
  332.     return d % 2 == 1 && d != 5
  333.   end
  334.   #--------------------------------------------------------------------------
  335.   # ● 斜め画像の有無を設定 [新規]
  336.   #--------------------------------------------------------------------------
  337.   def set_character_diagonal(flag)
  338.     @character_diagonal = flag
  339.     unless @character_diagonal
  340.       # 斜め向きの画像が無い場合の処理
  341.       if direction_diagonal?
  342.         @direction = @direction > 5 ? 8 : 2
  343.       end
  344.       if direction_diagonal?(@prelock_direction)
  345.         @prelock_direction = @prelock_direction > 5 ? 8 : 2
  346.       end
  347.     end
  348.   end
  349.   #--------------------------------------------------------------------------
  350.   # ● 指定方向に向き変更 [◆再定義]
  351.   #--------------------------------------------------------------------------
  352.   def set_direction(d)
  353.     if character_diagonal || !direction_diagonal?(d)
  354.       @direction = d if !@direction_fix && d != 0
  355.     elsif !@direction_fix && d != 0
  356.       @direction = d > 5 ? 8 : 2
  357.     end
  358.     @stop_count = 0
  359.   end
  360.   #--------------------------------------------------------------------------
  361.   # ● 通行可能判定 [追加]
  362.   #--------------------------------------------------------------------------
  363.   alias passable_MoveSystems? passable?
  364.   def passable?(x, y, d)
  365.     if direction_diagonal?(d)
  366.       horz = d == 1 || d == 7 ? 4 : 6
  367.       vert = d == 1 || d == 3 ? 2 : 8
  368.       diagonal_passable?(x, y, horz, vert)  # 斜め向きの時は斜めの判定を実行
  369.     else
  370.       passable_MoveSystems?(x, y, d)
  371.     end
  372.   end
  373.   #--------------------------------------------------------------------------
  374.   # ● まっすぐに移動 [追加]
  375.   #--------------------------------------------------------------------------
  376.   alias move_straight_MoveSystems move_straight
  377.   def move_straight(d, turn_ok = true)
  378.     if direction_diagonal?(d)
  379.       horz = d == 1 || d == 7 ? 4 : 6
  380.       vert = d == 1 || d == 3 ? 2 : 8
  381.       move_diagonal(horz, vert, turn_ok) # 斜め向きの時は斜め移動を実行
  382.     else
  383.       move_straight_MoveSystems(d, turn_ok)
  384.     end
  385.   end
  386.   #--------------------------------------------------------------------------
  387.   # ● 斜めに移動 [◆再定義]
  388.   #--------------------------------------------------------------------------
  389.   def move_diagonal(horz, vert, turn_ok = true) # 向き変更の可否を追加
  390.     @move_succeed = diagonal_passable?(x, y, horz, vert)
  391.     if @move_succeed
  392.       set_direction_diagonal(horz, vert)  # 向き変更
  393.       @x = $game_map.round_x_with_direction(@x, horz)
  394.       @y = $game_map.round_y_with_direction(@y, vert)
  395.       @real_x = $game_map.x_with_direction(@x, reverse_dir(horz))
  396.       @real_y = $game_map.y_with_direction(@y, reverse_dir(vert))
  397.       increase_steps
  398.     elsif turn_ok
  399.       set_direction_diagonal(horz, vert)  # 向き変更
  400.       check_event_trigger_touch_front if character_diagonal  # 斜め画像がある
  401.     end
  402.   end
  403.   #--------------------------------------------------------------------------
  404.   # ● 向きの変更(斜め向き) [新規]
  405.   #--------------------------------------------------------------------------
  406.   def set_direction_diagonal(horz, vert)
  407.     if character_diagonal
  408.       d = horz == 4 ? (vert == 2 ? 1 : 7) : (vert == 2 ? 3 : 9)
  409.       set_direction(d)  # 斜め画像があれば斜めを向く
  410.     else
  411.       set_direction(horz) if @direction == reverse_dir(horz)
  412.       set_direction(vert) if @direction == reverse_dir(vert)
  413.     end
  414.   end
  415. end
  416.  
  417. #==============================================================================
  418. # ■ Game_Character
  419. #------------------------------------------------------------------------------
  420. #  主に移動ルートなどの処理を追加したキャラクターのクラスです。Game_Player、
  421. # Game_Follower、GameVehicle、Game_Event のスーパークラスとして使用されます。
  422. #==============================================================================
  423. class Game_Character < Game_CharacterBase
  424.   #--------------------------------------------------------------------------
  425.   # ● 距離に最適な向きを向く [新規]
  426.   #--------------------------------------------------------------------------
  427.   def set_diagonal_distance_xy_from(sx, sy)
  428.     # distance_x_from, distance_y_fromの返り値をそれぞれsx, syに入れて使う。
  429.     sxabs = sx.abs
  430.     syabs = sy.abs
  431.     if sx == 0 || sy == 0 || (sxabs - syabs).abs * 2 >= sxabs + syabs
  432.       if sxabs > syabs
  433.         set_direction(sx > 0 ? 4 : 6)
  434.       elsif sy != 0
  435.         set_direction(sy > 0 ? 8 : 2)
  436.       end
  437.     else
  438.       set_direction_diagonal(sx > 0 ? 4 : 6, sy > 0 ? 8 : 2)
  439.     end
  440.   end
  441.   #--------------------------------------------------------------------------
  442.   # ● ジャンプ [追加]
  443.   #--------------------------------------------------------------------------
  444.   alias jump_MoveSystems jump
  445.   def jump(x_plus, y_plus)
  446.     jump_MoveSystems(x_plus, y_plus)
  447.     set_diagonal_distance_xy_from(-x_plus, -y_plus) if character_diagonal
  448.   end
  449.   #--------------------------------------------------------------------------
  450.   # ● キャラクターに近づく(斜め移動可) [追加]
  451.   #--------------------------------------------------------------------------
  452.   alias move_toward_character_MoveSystems move_toward_character
  453.   def move_toward_character(character)
  454.     return move_toward_character_MoveSystems(character) unless character_diagonal
  455.     sx = distance_x_from(character.x)
  456.     sy = distance_y_from(character.y)
  457.     if sx == 0 || sy == 0
  458.       if sx.abs > sy.abs
  459.         move_straight(sx > 0 ? 4 : 6)
  460.         move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0
  461.       elsif sy != 0
  462.         move_straight(sy > 0 ? 8 : 2)
  463.         move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0
  464.       end
  465.     else
  466.       move_diagonal(sx > 0 ? 4 : 6, sy > 0 ? 8 : 2)
  467.       if !@move_succeed
  468.         if sx.abs > sy.abs
  469.           move_straight(sx > 0 ? 4 : 6)
  470.           move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0
  471.         elsif sy != 0
  472.           move_straight(sy > 0 ? 8 : 2)
  473.           move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0
  474.         end
  475.       end
  476.     end
  477.   end
  478.   #--------------------------------------------------------------------------
  479.   # ● キャラクターから遠ざかる(斜め移動可) [追加]
  480.   #--------------------------------------------------------------------------
  481.   alias move_away_from_character_MoveSystems move_away_from_character
  482.   def move_away_from_character(character)
  483.     return move_away_from_character_MoveSystems(character) unless character_diagonal
  484.     sx = distance_x_from(character.x)
  485.     sy = distance_y_from(character.y)
  486.     if sx == 0 || sy == 0
  487.       if sx.abs > sy.abs
  488.         move_straight(sx > 0 ? 6 : 4)
  489.         move_straight(sy > 0 ? 2 : 8) if !@move_succeed && sy != 0
  490.       elsif sy != 0
  491.         move_straight(sy > 0 ? 2 : 8)
  492.         move_straight(sx > 0 ? 6 : 4) if !@move_succeed && sx != 0
  493.       end
  494.     else
  495.       move_diagonal(sx > 0 ? 6 : 4, sy > 0 ? 2 : 8)
  496.       if !@move_succeed
  497.         if sx.abs > sy.abs
  498.           move_straight(sx > 0 ? 6 : 4)
  499.           move_straight(sy > 0 ? 2 : 8) if !@move_succeed && sy != 0
  500.         elsif sy != 0
  501.           move_straight(sy > 0 ? 2 : 8)
  502.           move_straight(sx > 0 ? 6 : 4) if !@move_succeed && sx != 0
  503.         end
  504.       end
  505.     end
  506.   end
  507.   #--------------------------------------------------------------------------
  508.   # ● キャラクターの方を向く(斜め向き可) [追加]
  509.   #--------------------------------------------------------------------------
  510.   alias turn_toward_character_MoveSystems turn_toward_character
  511.   def turn_toward_character(character)
  512.     return turn_toward_character_MoveSystems(character) unless character_diagonal
  513.     sx = distance_x_from(character.x)
  514.     sy = distance_y_from(character.y)
  515.     set_diagonal_distance_xy_from(sx, sy)
  516.   end
  517.   #--------------------------------------------------------------------------
  518.   # ● キャラクターの逆を向く(斜め向き可) [追加]
  519.   #--------------------------------------------------------------------------
  520.   alias turn_away_from_character_MoveSystems turn_away_from_character
  521.   def turn_away_from_character(character)
  522.     return turn_away_from_character_MoveSystems(character) unless character_diagonal
  523.     sx = distance_x_from(character.x)
  524.     sy = distance_y_from(character.y)
  525.     set_diagonal_distance_xy_from(-sx, -sy)
  526.   end
  527.   #--------------------------------------------------------------------------
  528.   # ● 右に 90 度回転 [◆再定義]
  529.   #--------------------------------------------------------------------------
  530.   def turn_right_90
  531.     case @direction
  532.     when 2;  set_direction(4)
  533.     when 4;  set_direction(8)
  534.     when 6;  set_direction(2)
  535.     when 8;  set_direction(6)
  536.     when 1;  set_direction(7)
  537.     when 3;  set_direction(1)
  538.     when 7;  set_direction(9)
  539.     when 9;  set_direction(3)
  540.     end
  541.   end
  542.   #--------------------------------------------------------------------------
  543.   # ● 左に 90 度回転 [◆再定義]
  544.   #--------------------------------------------------------------------------
  545.   def turn_left_90
  546.     case @direction
  547.     when 2;  set_direction(6)
  548.     when 4;  set_direction(2)
  549.     when 6;  set_direction(8)
  550.     when 8;  set_direction(4)
  551.     when 1;  set_direction(3)
  552.     when 3;  set_direction(9)
  553.     when 7;  set_direction(1)
  554.     when 9;  set_direction(7)
  555.     end
  556.   end
  557.   #--------------------------------------------------------------------------
  558.   # ● 右に 45 度回転 [新規]
  559.   #--------------------------------------------------------------------------
  560.   def turn_right_45
  561.     return turn_right_90 unless character_diagonal
  562.     case @direction
  563.     when 1;  set_direction(4)
  564.     when 2;  set_direction(1)
  565.     when 3;  set_direction(2)
  566.     when 4;  set_direction(7)
  567.     when 6;  set_direction(3)
  568.     when 7;  set_direction(8)
  569.     when 8;  set_direction(9)
  570.     when 9;  set_direction(6)
  571.     end
  572.   end
  573.   #--------------------------------------------------------------------------
  574.   # ● 左に 45 度回転 [新規]
  575.   #--------------------------------------------------------------------------
  576.   def turn_left_45
  577.     return turn_left_90 unless character_diagonal
  578.     case @direction
  579.     when 1;  set_direction(2)
  580.     when 2;  set_direction(3)
  581.     when 3;  set_direction(6)
  582.     when 4;  set_direction(1)
  583.     when 6;  set_direction(9)
  584.     when 7;  set_direction(4)
  585.     when 8;  set_direction(7)
  586.     when 9;  set_direction(8)
  587.     end
  588.   end
  589.   #--------------------------------------------------------------------------
  590.   # ● 右に 135 度回転 [新規]
  591.   #--------------------------------------------------------------------------
  592.   def turn_right_135
  593.     return turn_right_90 unless character_diagonal
  594.     case @direction
  595.     when 1;  set_direction(8)
  596.     when 2;  set_direction(7)
  597.     when 3;  set_direction(4)
  598.     when 4;  set_direction(9)
  599.     when 6;  set_direction(1)
  600.     when 7;  set_direction(6)
  601.     when 8;  set_direction(3)
  602.     when 9;  set_direction(2)
  603.     end
  604.   end
  605.   #--------------------------------------------------------------------------
  606.   # ● 左に 135 度回転 [新規]
  607.   #--------------------------------------------------------------------------
  608.   def turn_left_135
  609.     return turn_left_90 unless character_diagonal
  610.     case @direction
  611.     when 1;  set_direction(6)
  612.     when 2;  set_direction(9)
  613.     when 3;  set_direction(8)
  614.     when 4;  set_direction(3)
  615.     when 6;  set_direction(7)
  616.     when 7;  set_direction(2)
  617.     when 8;  set_direction(1)
  618.     when 9;  set_direction(4)
  619.     end
  620.   end
  621.   #--------------------------------------------------------------------------
  622.   # ● 右か左に 45 度回転 [新規]
  623.   #--------------------------------------------------------------------------
  624.   def turn_right_or_left_45
  625.     case rand(2)
  626.     when 0;  turn_right_45
  627.     when 1;  turn_left_45
  628.     end
  629.   end
  630.   #--------------------------------------------------------------------------
  631.   # ● 右か左に 135 度回転 [新規]
  632.   #--------------------------------------------------------------------------
  633.   def turn_right_or_left_135
  634.     case rand(2)
  635.     when 0;  turn_right_135
  636.     when 1;  turn_left_135
  637.     end
  638.   end
  639.   #--------------------------------------------------------------------------
  640.   # ● ランダムに方向転換(斜め向き可) [追加]
  641.   #--------------------------------------------------------------------------
  642.   alias turn_random_MoveSystems turn_random
  643.   def turn_random
  644.     return turn_random_MoveSystems unless character_diagonal
  645.     d = 1 + rand(8)
  646.     d += 1 if d > 4
  647.     set_direction(d)
  648.   end
  649.   #--------------------------------------------------------------------------
  650.   # ● ランダムに移動(斜め向き可) [追加]
  651.   #--------------------------------------------------------------------------
  652.   alias move_random_MoveSystems move_random
  653.   def move_random
  654.     return move_random_MoveSystems unless character_diagonal
  655.     d = 1 + rand(8)
  656.     d += 1 if d > 4
  657.     move_straight(d, false)
  658.   end
  659. end
  660.  
  661. #==============================================================================
  662. # ■ Game_Player
  663. #------------------------------------------------------------------------------
  664. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  665. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  666. #==============================================================================
  667. class Game_Player < Game_Character
  668.   #--------------------------------------------------------------------------
  669.   # ● 歩行グラフィック 斜め画像の有無を取得 [新規]
  670.   #--------------------------------------------------------------------------
  671.   def character_diagonal
  672.     return @character_diagonal if @vehicle_type == :walk  # 歩行の場合は通常通り
  673.     # プレイヤーに斜め画像が無い場合は処理が面倒なので乗り物に斜め画像があっても無効
  674.     return @character_diagonal && vehicle.character_diagonal # 乗り物に搭乗中はその乗り物
  675.   end
  676.   #--------------------------------------------------------------------------
  677.   # ● 斜めに移動 [◆再定義]
  678.   #--------------------------------------------------------------------------
  679.   def move_diagonal(horz, vert, turn_ok = true) # 向き変更の可否を追加
  680.     @followers.move if diagonal_passable?(@x, @y, horz, vert)
  681.     super
  682.   end
  683. end
  684.  
  685. #==============================================================================
  686. # ■ Game_Event
  687. #------------------------------------------------------------------------------
  688. #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
  689. # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
  690. #==============================================================================
  691. class Game_Event < Game_Character
  692.   #--------------------------------------------------------------------------
  693.   # ● 公開インスタンス変数
  694.   #--------------------------------------------------------------------------
  695.   attr_accessor :diagonal_dont_start      # 斜め向きでのイベント起動不可
  696.   #--------------------------------------------------------------------------
  697.   # ● 公開メンバ変数の初期化 [追加]
  698.   #--------------------------------------------------------------------------
  699.   alias init_public_members_MoveSystems2 init_public_members
  700.   def init_public_members
  701.     init_public_members_MoveSystems2
  702.     @diagonal_dont_start = false
  703.   end
  704.   #--------------------------------------------------------------------------
  705.   # ● 斜め向きでのイベント起動不可か判定 [新規]
  706.   #--------------------------------------------------------------------------
  707.   def diagonal_dont_start?
  708.     event_result = event_note_include?(Calt::DiagonalNotStartNote)
  709.     whole_result = whole_note_include?(Calt::DiagonalNotStartAllNote)
  710.     return event_result ^ whole_result ^ Calt::DiagonalNotStartReverse
  711.   end
  712.   #--------------------------------------------------------------------------
  713.   # ● 注釈から設定を取得する処理 [追加]
  714.   #--------------------------------------------------------------------------
  715.   alias setup_page_settings_MoveSystems setup_page_settings
  716.   def setup_page_settings
  717.     setup_page_settings_MoveSystems
  718.     @diagonal_dont_start = diagonal_dont_start?
  719.   end
  720.   unless $imported[:CanariAlternate_EventEveryone]
  721.     #--------------------------------------------------------------------------
  722.     # ● イベント起動 [追加]
  723.     #--------------------------------------------------------------------------
  724.     alias start_MoveSystems start
  725.     def start
  726.       return if $game_player.direction_diagonal? && @diagonal_dont_start
  727.       start_MoveSystems
  728.     end
  729.   else
  730.     #--------------------------------------------------------------------------
  731.     # ● イベント起動(イベント起動判定拡張との競合回避バージョン) [追加]
  732.     #--------------------------------------------------------------------------
  733.     alias start_MoveSystems start
  734.     def start
  735.       @invoker_event ||= $game_player # 明示されてない場合はプレイヤーが実行者
  736.       if @invoker_event.direction_diagonal? && @diagonal_dont_start
  737.         @invoker_event = nil if @invoker_event  # 処理終了時に初期化
  738.         return
  739.       end
  740.       start_MoveSystems
  741.     end
  742.   end
  743. end
  744.  
  745. #==============================================================================
  746. # ■ Sprite_Character
  747. #------------------------------------------------------------------------------
  748. #  キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを
  749. # 監視し、スプライトの状態を自動的に変化させます。
  750. #==============================================================================
  751. class Sprite_Character < Sprite_Base
  752.   #--------------------------------------------------------------------------
  753.   # ● 転送元ビットマップの更新 [◆再定義]
  754.   #--------------------------------------------------------------------------
  755.   def update_bitmap
  756.     if graphic_changed?
  757.       @tile_id = @character.tile_id
  758.       @character_name = @character.character_name
  759.       @character_index = @character.character_index
  760.       if @tile_id > 0
  761.         set_tile_bitmap
  762.         @cross_character_name = nil  # 初期化
  763.         @character.set_character_diagonal(false)  # 斜め画像無しを設定
  764.       else
  765.         set_character_bitmap
  766.         @cross_character_name = get_cross_character_name # 斜め向き画像名の取得
  767.       end
  768.       @cross_bitmap = false  # 初期化
  769.     end
  770.   end
  771.   #--------------------------------------------------------------------------
  772.   # ● 斜め向き画像名の取得 [新規]
  773.   #--------------------------------------------------------------------------
  774.   def get_cross_character_name
  775.     if @character_name =~ /^\!?\$./
  776.       setting = Calt::DiagonalCharacterName
  777.       cross_name = sprintf(setting, @character_name)
  778.     else
  779.       setting = Calt::DiagonalCharacterIndexName
  780.       index = @character.character_index
  781.       cross_name = sprintf(setting, @character_name, index + 1)
  782.     end
  783.     begin
  784.       Cache.character(cross_name) # 取得を試みて失敗なら斜め画像は存在しない
  785.     rescue
  786.       @character.set_character_diagonal(false)  # 斜め画像無しを設定
  787.       return nil
  788.     end
  789.     @character.set_character_diagonal(true) # 斜め画像有りを設定
  790.     return cross_name
  791.   end
  792.   #--------------------------------------------------------------------------
  793.   # ● 斜め向きキャラクターのビットマップを設定 [新規]
  794.   #--------------------------------------------------------------------------
  795.   def set_cross_character_bitmap
  796.     unless @cross_character_name
  797.       p "エラー:斜め向き画像が存在しないキャラが斜め向きになっています!!"
  798.       return
  799.     end
  800.     self.bitmap = Cache.character(@cross_character_name)
  801.     @cw = bitmap.width / 3
  802.     @ch = bitmap.height / 4
  803.     self.ox = @cw / 2
  804.     self.oy = @ch
  805.   end
  806.   #--------------------------------------------------------------------------
  807.   # ● 転送元矩形の更新 [◆再定義]
  808.   #--------------------------------------------------------------------------
  809.   def update_src_rect
  810.     if @tile_id == 0
  811.       d = @character.direction
  812.       if @character.direction_diagonal?
  813.         index = 0
  814.         unless @cross_bitmap
  815.           set_cross_character_bitmap  # 斜め向き画像をセット
  816.           @cross_bitmap = true
  817.         end
  818.         d = case d
  819.         when 1; 2 # 左斜め下(1行目)
  820.         when 7; 4 # 左斜め上(2行目)
  821.         when 3; 6 # 右斜め下(3行目)
  822.         when 9; 8 # 右斜め上(4行目)
  823.         end
  824.       else
  825.         index = @character.character_index
  826.         if @cross_bitmap
  827.           set_character_bitmap  # 通常の画像をセット
  828.           @cross_bitmap = false
  829.         end
  830.       end
  831.       pattern = @character.pattern < 3 ? @character.pattern : 1
  832.       sx = (index % 4 * 3 + pattern) * @cw
  833.       sy = (index / 4 * 4 + (d - 2) / 2) * @ch
  834.       self.src_rect.set(sx, sy, @cw, @ch)
  835.     end
  836.   end
  837. end
  838. end
  839.  
  840. ###############################################################################
  841. # ■ 走行状態をダッシュのデフォルトにするに関する変更
  842. ###############################################################################
  843. if Calt::DashDefaultDash
  844. #==============================================================================
  845. # ■ Game_Player
  846. #------------------------------------------------------------------------------
  847. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  848. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  849. #==============================================================================
  850. class Game_Player < Game_Character
  851.   #--------------------------------------------------------------------------
  852.   # ● ダッシュ状態判定 [◆再定義]
  853.   #--------------------------------------------------------------------------
  854.   def dash?
  855.     return false if @move_route_forcing || $game_map.disable_dash? || vehicle
  856.     return Input.press?(:A) ^ !$game_switches[Calt::DashDefaultWalk]
  857.   end
  858. end
  859. end
  860.  
  861. ###############################################################################
  862. # ■ プレイヤーの移動操作禁止に関する変更
  863. ###############################################################################
  864. if Calt::PlayerImpossibleOperation
  865. #==============================================================================
  866. # ■ Game_Player
  867. #------------------------------------------------------------------------------
  868. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  869. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  870. #==============================================================================
  871. class Game_Player < Game_Character
  872.   #--------------------------------------------------------------------------
  873.   # ● ダッシュ状態判定 [追加]
  874.   #--------------------------------------------------------------------------
  875.   alias dash_MoveSystems? dash?
  876.   def dash?
  877.     return false if $game_switches[Calt::MoveByInputProhibition]
  878.     return dash_MoveSystems?
  879.   end
  880.   #--------------------------------------------------------------------------
  881.   # ● 方向ボタン入力による移動処理 [追加]
  882.   #--------------------------------------------------------------------------
  883.   alias move_by_input_MoveSystems move_by_input
  884.   def move_by_input
  885.     return if $game_switches[Calt::MoveByInputProhibition]
  886.     move_by_input_MoveSystems
  887.   end
  888. end
  889. end
  890.  
  891. ###############################################################################
  892. # ■ 斜めの通行可能判定をオートタイル(A1タイル)を考慮したものに変更に関する変更
  893. ###############################################################################
  894. if Calt::DiagonalMoveNatural
  895. #==============================================================================
  896. # ■ Game_CharacterBase
  897. #------------------------------------------------------------------------------
  898. #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ
  899. # ラフィックなどの基本的な情報を保持します。
  900. #==============================================================================
  901. class Game_CharacterBase
  902.   #--------------------------------------------------------------------------
  903.   # ● 定数
  904.   #--------------------------------------------------------------------------
  905.   AutoTile_UpLeft    = {34=>:T, 35=>:T, 42=>:T, 43=>:T, 46=>:T} # 左上が通行可のパターン
  906.   AutoTile_UpRight   = {36=>:T, 37=>:T, 42=>:T, 45=>:T, 46=>:T} # 右上が通行可のパターン
  907.   AutoTile_DownLeft  = {40=>:T, 41=>:T, 43=>:T, 44=>:T, 46=>:T} # 左下が通行可のパターン
  908.   AutoTile_DownRight = {38=>:T, 39=>:T, 44=>:T, 45=>:T, 46=>:T} # 右下が通行可のパターン
  909.   #--------------------------------------------------------------------------
  910.   # ● 斜めの通行可能判定 [◆再定義]
  911.   #--------------------------------------------------------------------------
  912.   def diagonal_passable?(x, y, horz, vert)
  913.     x2 = $game_map.round_x_with_direction(x, horz)
  914.     y2 = $game_map.round_y_with_direction(y, vert)
  915.     route_vert = passable?(x, y, vert) && passable?(x, y2, horz)  # 縦横ルート
  916.     route_horz = passable?(x, y, horz) && passable?(x2, y, vert)  # 横縦ルート
  917.     return true if route_vert && route_horz # 全ルート通行可能
  918.     if map_passable?(x, y, horz) && map_passable?(x, y, vert) &&
  919.        map_passable?(x2, y2, reverse_dir(horz)) &&
  920.        map_passable?(x2, y2, reverse_dir(vert)) &&
  921.        !collide_with_characters?(x2, y2)
  922.       # 現在地と移動先は斜めに通行可
  923.       if route_vert || passable_tile?(x, y2, horz, vert, false)
  924.         if route_horz || passable_tile?(x2, y, horz, vert, true)
  925.           return true
  926.         end
  927.       end
  928.     end
  929.     return false # 通行不可
  930.   end
  931.   #--------------------------------------------------------------------------
  932.   # ● 斜めの通行可能判定(タイル判定) [新規]
  933.   #--------------------------------------------------------------------------
  934.   def passable_tile?(x, y, horz, vert, route_horz=false)
  935.     $game_map.all_tiles(x, y).each do |tile_id|
  936.       flag = $game_map.tileset.flags[tile_id]
  937.       next if flag & 0x10 != 0          # [☆] : 通行に影響しない
  938.       if tile_id.between?(2048, 2815)   # A1タイル(海・水辺など)
  939.         return false if Calt::DiagonalMoveNaturalTag.include?(flag >> 12) # 通行不可
  940.         auto_id = (tile_id - 2048) % 48 # オートタイルのパターンを取得
  941.         auto_id_list = auto_id_list_A1_tile(horz, vert, route_horz)
  942.         return false unless auto_id_list[auto_id] # 通行不可
  943.       else
  944.         unless diagonal_passable_tile?(flag, horz, vert, route_horz)
  945.           return false unless Calt::DiagonalMoveNaturalTag.include?(flag >> 12) # 通行不可
  946.         end
  947.       end
  948.       return false if collide_with_characters?(x, y) # イベントとの衝突判定
  949.       return true # 通行可
  950.     end
  951.     return false  # 通行不可
  952.   end
  953.   #--------------------------------------------------------------------------
  954.   # ● 通行可能なA1タイルの配列を取得 [新規]
  955.   #--------------------------------------------------------------------------
  956.   def auto_id_list_A1_tile(horz, vert, route_horz)
  957.     if horz == 4 # 方向とルートに対応する通行可のパターンを取得
  958.       if vert == 2
  959.         return route_horz ? AutoTile_DownRight : AutoTile_UpLeft
  960.       else
  961.         return route_horz ? AutoTile_UpRight : AutoTile_DownLeft
  962.       end
  963.     else
  964.       if vert == 2
  965.         return route_horz ? AutoTile_DownLeft : AutoTile_UpRight
  966.       else
  967.         return route_horz ? AutoTile_UpLeft : AutoTile_DownRight
  968.       end
  969.     end
  970.   end
  971.   #--------------------------------------------------------------------------
  972.   # ● 斜め通行可能なタイルか判定 [新規]
  973.   #--------------------------------------------------------------------------
  974.   def diagonal_passable_tile?(flag, horz, vert, route_horz)
  975.     corner_flag = if horz == 4
  976.       vert == 2 ? (route_horz ? 0x05 : 0x0a) : (route_horz ? 0x0c : 0x03)
  977.     else
  978.       vert == 2 ? (route_horz ? 0x03 : 0x0c) : (route_horz ? 0x0a : 0x05)
  979.     end
  980.     return flag & corner_flag == 0x00 ? true : false
  981.   end
  982. end
  983. end

评分

参与人数 1星屑 +66 收起 理由
熊喵酱 + 66 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

3
发表于 2013-11-2 16:17:45 | 只看该作者
据我所知还没有比较好的VA新手脚本教程,可以看看图书馆里面的
八方行走脚本:
(插入到【插件脚本】以下,【Main】以上)
  1. #==============================================================================
  2. # ■ VXAce-RGSS3-26 8方向移動 [Ver.1.0.0]          by Claimh
  3. #------------------------------------------------------------------------------
  4. # 8方向の移動が可能となります。
  5. # 斜め移動ができない時に縦or横に移動できる場合は縦or横に移動するようになります。
  6. #==============================================================================

  7. class Game_Player < Game_Character
  8.   #--------------------------------------------------------------------------
  9.   # ● 方向ボタン入力による移動処理
  10.   #--------------------------------------------------------------------------
  11.   def move_by_input
  12.     return if !movable? || $game_map.interpreter.running?
  13.     if [1, 3, 7, 9].include?(Input.dir8)
  14.       case Input.dir8
  15.       when 1; move_diagonal(4, 2)
  16.       when 3; move_diagonal(6, 2)
  17.       when 7; move_diagonal(4, 8)
  18.       when 9; move_diagonal(6, 8)
  19.       end
  20.       return if @move_succeed
  21.     end
  22.     move_straight(Input.dir4) if Input.dir4 > 0
  23.   end
  24. end


  25. class Game_CharacterBase
  26.   #--------------------------------------------------------------------------
  27.   # ● 斜めに移動
  28.   #     horz : 横方向(4 or 6)
  29.   #     vert : 縦方向(2 or 8)
  30.   #--------------------------------------------------------------------------
  31.   alias move_diagonal_8dir move_diagonal
  32.   def move_diagonal(horz, vert)
  33.     if !passable?(@x, @y, horz) and !passable?(@x, @y, vert)
  34.       @move_succeed = false
  35.       return
  36.     end
  37.     return move_straight(horz) if passable?(@x, @y, horz) and !passable?(@x, @y, vert)
  38.     return move_straight(vert) if !passable?(@x, @y, horz) and passable?(@x, @y, vert)
  39.     move_diagonal_8dir(horz, vert)
  40.   end
  41. end

复制代码
萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
7 小时
注册时间
2013-10-27
帖子
28
4
 楼主| 发表于 2013-11-2 16:53:58 | 只看该作者
本帖最后由 白梦 于 2013-11-2 16:56 编辑

好了谢谢你们的答复与热情的帮助

点评

另外回复的时候记得@一下别人,不然除非守在电脑前,别人根本不知道你回复了,毕竟这是你的主题  发表于 2013-11-2 16:55
这个和版本无关,代码都是英文,中文和日文都只是注释  发表于 2013-11-2 16:55
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
7 小时
注册时间
2013-10-27
帖子
28
5
 楼主| 发表于 2013-11-2 17:01:13 | 只看该作者
唔,你们两个给我的脚本效果差不多,为什么一个这么长?顺便问一句怎么@别人啊......
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

6
发表于 2013-11-2 17:09:14 | 只看该作者
白梦 发表于 2013-11-2 17:01
唔,你们两个给我的脚本效果差不多,为什么一个这么长?顺便问一句怎么@别人啊...... ...


啊……虽然功能是一样的,但是我的那个(简短的)只是单纯地实现八方移动,而没有使用不同行走图,所以满足楼主要求的是长的那个…………
——————————————
回复 可以提醒到对方
@ 也是同样的功能

评分

参与人数 1星屑 +66 收起 理由
熊喵酱 + 66 认可答案

查看全部评分

萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
7 小时
注册时间
2013-10-27
帖子
28
7
 楼主| 发表于 2013-11-2 17:14:45 | 只看该作者
谢谢,不过看看我的等级o(︶︿︶)o 唉~~(掩目长谈)虽然你的脚本不能满足我的需求,但还是很感谢你。话说同是学生伤不起啊~~一周两天我就不说了

点评

教育局的都是坑  发表于 2013-11-2 17:36
我们这个周六放假了……据说这几天教育局抓得紧……  发表于 2013-11-2 17:27

评分

参与人数 1星屑 +15 收起 理由
熊喵酱 + 15 主動認可獎勵

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
7 小时
注册时间
2013-10-27
帖子
28
8
 楼主| 发表于 2013-11-3 16:41:27 | 只看该作者
tseyik 发表于 2013-11-2 16:12
先把圖放上来看看
八方向行走

话说第708行有问题啊,刚刚还好好的,第二次打开就出问题了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 16:00

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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