【解決済み】スキルウインドウのページ数を記憶させたい

かにん
記事: 5
登録日時: 2021年6月25日(金) 23:34

【解決済み】スキルウインドウのページ数を記憶させたい

投稿記事by かにん » 2022年2月17日(木) 02:22

以前に、下記URLのトピックにて「スキルウインドウの表示変更」についてご教示いただきました、かにんと申します。
viewtopic.php?f=43&t=11517

有識者様からご教示いただき、拙作に合わせた改変をさせていただき、制作にあたっておりましたが、当時想定していなかった問題がが発生してしまいました。
VXAceではアクターが最期に選択したスキルを記憶し、次にスキルウインドウを開いた際に記憶したスキルを指すようになっています。
しかし、「スキルウインドウのページ番号」はデフォルトにはないメソッドであるため、記憶されません。

スクリプトによって、

スキルウインドウ1ページ目
1個目のスキル
2個目のスキル



8個目のスキル

2ページ目
9個目のスキル
10個目のスキル



16個目のスキル

3ページ目
17個目のスキル
18個目のスキル



24個目のスキル

このように、スキルの数だけページが増え、左右キーでページを切り替えてスキルを選択する仕組みになっています。
そこで、例えば該当アクターが12個目のスキルを使用したとします。
12個目のスキルは2ページ目に表示されます。
しかし、コマンド再選択時、ページ数は記憶されていないため、スキルウインドウは1ページ目の内容を描画します。
当然1ページ目に12個目のスキルはないため、カーソルはウインドウ外を指すという状態です。

この挙動が発生してしまうのは、間に別のスキルタイプを選択した時です。
スキルタイプ1の12個目のスキルを選択して使用→次ターンにスキルタイプ2を選択してからコマンド選択に戻る→スキルタイプ1を再選択する・・・不具合発生
スキルタイプ1の12個目のスキルを選択して使用→次ターンにアイテムを選択してからコマンド選択に戻る→スキルタイプ1を再選択する・・・正常
スキルタイプ1の12個目のスキルを選択して使用→次ターンに直行でスキルタイプ1を再選択・・・正常

スキルタイプ別に最終使用スキルを記憶するスクリプトを配布されている方がいらっしゃったので、それを試してもみたのですが、結局表示されるページが1ページ目で変わらないため、挙動を直すことはできませんでした。

そこで、最後に使用したスキルの他に、最後に使用したスキルが表示されているページ数も記憶し、この挙動を改善しようと試みました。
スキルを記憶している仕組みを自分なりに分析し、同じ要領でページを記憶させようとしたのですが、どうしても上手くいきませんでした。

改善策を御教示いただける方がいらっしゃいましたら、ご助力いただけますと幸いです。
尚、上記URLにてご教授いただいたスクリプトを拙作様に改造している箇所がございますので、今現在のコードを貼り付けさせていただきます。cursor_down、cursor_upに手を加えています。改変箇所を元通りにしても同様の挙動でしたので、恐らくここが原因ではないとは思うのですが、もしも悪さをしているようでしたら改変していただけると幸いです。


コード: 全て選択

class Window_BattleSkill < Window_SkillList
  # --------------------------------------------------------------------------
  # ○ オブジェクト初期化
  #     info_viewport : 情報表示用ビューポート
  #--------------------------------------------------------------------------
  alias :_old_initialze :initialize
  def initialize(help_window, info_viewport)
    _old_initialze(help_window, info_viewport)
    self.arrows_visible = false
  end
  #--------------------------------------------------------------------------
  # ○ カーソル位置が画面内になるようにスクロール
  #--------------------------------------------------------------------------
  def ensure_cursor_visible
  end
  #--------------------------------------------------------------------------
  # ○ カーソル位置が画面内になるようにスクロール
  #--------------------------------------------------------------------------
  def col_max
    return 1
  end
  def page_row_max
    return 8
  end
  #--------------------------------------------------------------------------
  # ● ページの最大数を取得
  #--------------------------------------------------------------------------
  def page_max
    page_max = item_max / (col_max * page_row_max)
    page_max += 1 if (col_max * page_row_max * page_max) < item_max
    page_max
  end
  #--------------------------------------------------------------------------
  # ● 現在ページを取得
  #--------------------------------------------------------------------------
  def page
    index / (col_max * page_row_max)
  end
  #--------------------------------------------------------------------------
  # ○ カーソルを下に移動
  #--------------------------------------------------------------------------
  def cursor_down(wrap = false)
    if index + 1 == item_max
      select(page * 8)
    elsif index == 7
      select(0)
    elsif index == 15
      select(8)
    elsif index == 23
      select(16)
    elsif index == 31
      select(24)
    elsif index == 39
      select(32)
    elsif index == 47
      select(40)
    elsif index == 55
      select(48)
    elsif index == 63
      select(56)
    elsif index == 71
      select(64)
    elsif index == 79
      select(72)
    else
      super unless (page == page_max - 1) ? (index == item_max - 1) : (col_max * (page_row_max - 1)) <= (index % (col_max * page_row_max))
    end
  end
  #--------------------------------------------------------------------------
  # ○ カーソルを上に移動
  #--------------------------------------------------------------------------
  def cursor_up(wrap = false)
   last_page = (item_max - 1) / (col_max * page_row_max)
    if page == last_page && index % (col_max * page_row_max) / col_max == 0
      select(item_max - 1)
    elsif index == 0
      select(7)
    elsif index == 8
      select(15)
    elsif index == 16
      select(23)
    elsif index == 24
      select(31)
    elsif index == 32
      select(39)
    elsif index == 40
      select(47)
    elsif index == 48
      select(55)
    elsif index == 56
      select(63)
    elsif index == 64
      select(71)
    elsif index == 72
      select(79)
    else
    super unless index % (col_max * page_row_max) / col_max == 0
    end
  end
  #--------------------------------------------------------------------------
  # ○ カーソルを右に移動
  #--------------------------------------------------------------------------
  def cursor_right(wrap = false)
    index % col_max == (col_max - 1) || index == (item_max - 1) ? cursor_pagedown : super
  end
  #--------------------------------------------------------------------------
  # ○ カーソルを左に移動
  #--------------------------------------------------------------------------
  def cursor_left(wrap = false)
    index % col_max == 0 ? cursor_pageup : super
  end
  #--------------------------------------------------------------------------
  # ○ カーソルを 1 ページ後ろに移動
  #--------------------------------------------------------------------------
  def cursor_pagedown
    unless top_row + page_row_max < row_max
      self.top_row = 0
      select(index % (col_max * page_row_max))
    else
      super
    end
  end
  #--------------------------------------------------------------------------
  # ○ カーソルを 1 ページ前に移動
  #--------------------------------------------------------------------------
  def cursor_pageup
    unless top_row > 0
      last_page = (item_max - 1) / (col_max * page_row_max)
      self.top_row = page_row_max * last_page
      select([last_page * col_max * page_row_max + index, item_max-1].min)
    else
      super
    end
  end
end
最後に編集したユーザー かにん on 2022年2月18日(金) 22:32 [ 編集 1 回目 ]

名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: スキルウインドウのページ数を記憶させたい

投稿記事by 名無し蛙 » 2022年2月18日(金) 03:04

だれだろーと思ったら自分でした。
どうも御無沙汰しています。
軽くチェックする限りensure_cursor_visibleを空にしている事の弊害だと思いますけど
当時の自分は何を考えていたんでしょうね?(他人事)
多分、本来は適切に改変しないといけないところを削除して一旦作業止めて様子見したまま?

まず当のバグに関してはensure_cursor_visibleの中身を書くだけで解決すると思います。

コード: 全て選択

  #--------------------------------------------------------------------------
  # ○ カーソル位置が画面内になるようにスクロール
  #--------------------------------------------------------------------------
  def ensure_cursor_visible
    self.top_row = page * page_row_max
  end
ページの記憶というか注釈の通り
復帰時に適切な位置にスクロールする処理を白紙にしたままだったのが原因ですね。
本来のウィンドウの表示方法から
スクロールの挙動を弄って疑似的にページを表現しているスクリプトなので。

スキルタイプ毎のスキル位置の記憶に関しては
ツクールの仕様の問題なので今回の件とは関係無いですけど
検索して見つけたリック氏制作の「最終使用スキル個別記憶」等と併用可能だと思います。
内容見る限り自分が実装しても似たようなモノになるでしょうね。
かにん
記事: 5
登録日時: 2021年6月25日(金) 23:34

Re: スキルウインドウのページ数を記憶させたい

投稿記事by かにん » 2022年2月18日(金) 22:31

名無し蛙様

前回に引き続きご助力賜り、誠に有難うございます。
早速書き換えてみたところ、無事に不具合が修正されました。
自分の考え方が見当違いであったことも発覚し、お恥ずかしい限りです。
もっと勉強させていただきます。

いただきました回答をもって、解決済みとさせていただきます。
前回ご回答いただいてから月日が経っているにも関わらず、親身にご対応いただきましたこと、重ねてお礼申し上げます。

“VX / Ace:質問” へ戻る