【解決済み】バトルスキルウインドウの表示変更

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

【解決済み】バトルスキルウインドウの表示変更

投稿記事by かにん » 2021年6月25日(金) 23:44

バトル時にスキルを選択する際のウインドウのレイアウトを変更したいのですが、御教示いただきたく存じます。

スキルの数が増えると、中間にあるスキルを選ぶのに時間がかかってしまいます。
そこで、左右キーでページを切り替えて表示する方式に変更したいと考えています。


1ページ目
1個目のスキル
2個目のスキル
3個目のスキル



8個目のスキル

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



16個目のスキル

想定する挙動
1.1(9)個目のスキルにカーソルがあった状態で上キーを押すと8(16)個目のスキルに移動
2.8(16)個目のスキルにカーソルがあった状態で下キーを押すと1(9)個目のスキルに移動
3.左右キーを押すことでページを切り替え

このような形式で、スキルの総数に合わせてページが作成される仕組みにしたいと思っています。


cursor_leftやcursor_rightを定義すればいいのかな、とか
表示行数を指定すればいいのかな、とか
自分なりにやってみたのですが、想定通りの挙動を作ることができませんでした。

御教示いただける方がいらっしゃいましたら、よろしくお願いいたします。
最後に編集したユーザー かにん on 2021年6月27日(日) 23:28 [ 編集 1 回目 ]

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

Re: バトルスキルウインドウの表示変更

投稿記事by 名無し蛙 » 2021年6月26日(土) 12:00

一つ一つ要素を書き出していけばそれ程難しくない気がしますね。
まず
1.カーソル移動に伴う自動スクロール処理の無効化
2.スクロール用矢印の非表示化
3.index == 0の時、上を押すとindex=item_max - 1に
4.index == item_max - 1の時、下を押すとindex = 0に
5.index % 2 == 0の時左を押すとcursor_pageupの処理を
6.index % 2 == 1の時右を押すとcursor_pagedownの処理を

多分、変更を要するポイントはこの6つくらいでは。
それで試しに実装してみたんですけど思ったよりも違和感があったので調整したら若干別物になりましたね。
横スライド操作を軸にするなら上下キーで縦スライドを加えるのは直感的ではない…まぁ参考例という事で。
あまりリファクタリングしてないので実行環境のitemの数やcol/rowの違いによってバグる可能性もあり。
あとは表示スペースを少し拡張してcontentsに書き込むか
修飾spriteを使うかして現在ページ数/最大ページ数も表記した方が親切ですね。

コード: 全て選択

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 cursor_down(wrap = false)
    super unless index % (col_max * page_row_max) / ((page_row_max - 1) * col_max) == 1
  end
  #--------------------------------------------------------------------------
  # ○ カーソルを上に移動
  #--------------------------------------------------------------------------
  def cursor_up(wrap = false)
    super unless index % (col_max * page_row_max) / col_max == 0
  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 / (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
かにん
記事: 5
登録日時: 2021年6月25日(金) 23:34

Re: バトルスキルウインドウの表示変更

投稿記事by かにん » 2021年6月26日(土) 17:02

名無し蛙様

御教示いただきまして誠にありがとうございます。
デフォルトであるcol_max=2の状態では、想定通りの動作になることを確認いたしました。

ここからは私個人の希望になってしまうのですが、
col_max=1の場合でも動作するようにしていただくことは可能でしょうか。
col_max=1の状態でもおおむね動作するのですが、アクターが覚えている一番最後のスキルにカーソルがあった状態で下キーを押すと、次のような挙動になってしまいます。

・ウインドウの表示は1番最後のページのままの状態
・スキルカーソルは、そのアクターが覚えている一番最初のスキルに合っているとみなされている
(カーソルが画面外に消えている、ヘルプウインドウの表示が一番最初のスキルのものになっている)
・スキル数がページ数×page_row_maxの倍数になっている時は発生しない
(page_row_maxが8だとすると、習得スキル数が8,16,24……の時は発生せず、それ以外の時に上記現象が発生する)

自力での解決を試みましたが、原因を特定することができませんでした。

デフォルト状態であれば問題なく動作しますので、難しい内容であれば流していただいて構いません。
個人的な要望なので厚かましいことではございますが、もし御教示いただけましたら幸いです。
名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: バトルスキルウインドウの表示変更

投稿記事by 名無し蛙 » 2021年6月27日(日) 01:38

数字弄りしてると自分でもよく分からなくなってきますねぇ。
他の部分も含めて一応境界線テストを重ねました。まだバグは残ってる可能性はあります。
面倒になってゴリ押ししている部分もあるので多分最適解ではありません。
やってる事はただの算数遊びなので
ご自分でもp命令使って変数の遷移を確認した方が良いと思います。

コード: 全て選択

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
    self.top_row = page * page_row_max
  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)
    super unless (page == page_max - 1) ? (index == item_max - 1) : (col_max * (page_row_max - 1)) <= (index % (col_max * page_row_max))
  end
  #--------------------------------------------------------------------------
  # ○ カーソルを上に移動
  #--------------------------------------------------------------------------
  def cursor_up(wrap = false)
    super unless index % (col_max * page_row_max) / col_max == 0
  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

追記:2022/2/19
http://tm.lucky-duet.com/viewtopic.php?f=43&t=12432
バグがあったので問題箇所を修正しました。
最後に編集したユーザー 名無し蛙 on 2022年2月19日(土) 02:39 [ 編集 1 回目 ]
かにん
記事: 5
登録日時: 2021年6月25日(金) 23:34

Re: バトルスキルウインドウの表示変更

投稿記事by かにん » 2021年6月27日(日) 23:28

名無し蛙 様

個人的な要望にご対応いただき、誠にありがとうございます。
私の想定通りの挙動になることを確認できました。
作成いただいたスクリプトと自分の修正案を比べながら、足りなかった知識を学ばせていただこうと思います。

この質問は解決済みとさせていただきます。
作成いただいたスクリプトを使用した作品を公開する際には、名無し蛙 様のお名前をクレジットさせていただきたく思います。
改めまして、丁寧なご対応をいただきましたこと、深く感謝申し上げます。

“VX / Ace:質問” へ戻る