第19回 選択可能なウィンドウ

 2008-11-30
今回は、選択ウィンドウを作ってみましょう。


選択可能なウィンドウを作るには、Window_Selectable クラスを使用します。
このクラスを継承するにあたり、下記の変数の意味を理解しておくことが必要です。
@item_max
 項目数を格納しておく変数です。 この範囲内でカーソルが移動します。
@column_max
 横に並べる項目数です。
@index
 現在カーソルがある項目の番号です。 負数の場合は、カーソルを表示しません。
@spacing
 項目と項目の間隔です。


■ 最低限の選択可能ウィンドウ
では、確認に必要な最低限のメソッドのみ定義してみましょう。
# まず、Window_Selectable クラスを継承したクラスを用意
class Window_Test < Window_Selectable
#------------------------------------------------------------------
# ● オブジェクト初期化
#------------------------------------------------------------------

 def initialize
  super(147, 120, 250, 176)
  # 項目数を決める
  @item_max = 6
  # カーソルの初期位置
  @index = 0
 end
end
# ウィンドウを操作するためのシーン
class Scene_Test < Scene_Base
#------------------------------------------------------------------
# ● 開始処理
#------------------------------------------------------------------

 def start
  super
  @test_window = Window_Test.new
 end
#------------------------------------------------------------------
# ● フレーム更新
#------------------------------------------------------------------

 def update
  super
  # これをしてあげないと、カーソルが動きません。
  @test_window.update
 end
end
あとは、イベントコマンド「スクリプト」でシーンを切り替えてあげてください。
$scene = Scene_Test.new

■ 項目を表示してみる
次は項目を表示してみます。
#------------------------------------------------------------------
# ● リフレッシュ
#------------------------------------------------------------------

def refresh
 self.contents.clear
 self.contents.font.color = normal_color
 cmd = ["コマンド1", "コマンド2", "コマンド3", "4", "5", "6"]
 @item_max = cmd.size
 for i in 0...@item_max
  self.contents.draw_text(0, WLH * i, 218, WLH, cmd[i])
 end
end

ただ項目を表示して選択するだけのものでしたら、
このような簡単なものでかまいません。
行ごとに表示内容が変わるようなものなら、
コマンドウィンドウの様に1行単位で描画する処理のほうが便利です。

では、Window_Test#initialize の最後に refresh を追加してください。
@item_max は refresh で設定するので、消してしまってもかまいません。
def initialize
 super(147, 120, 250, 176)
 @index = 0
 refresh
end

■ 項目を選択・処理する
さて、項目の処理の方法は大きく分けると2つあって、
Scene クラスに定義するか、Window クラスにするかですね。
Scene に定義するのは、Window クラス間で処理やその結果を共有?したいときとか?
Window の場合は、そのインスタンス内でしか処理結果が必要でないときとかかな?
例を挙げてみましたが、必ずしもそうした方が良いというものではありません。
使っていれば、最善の方法が思いつくようになると思います。それまでの参考程度に。

今回は、Window の方に定義します。
どの項目が選択されたのかを調べるには、@index を参照します。
この変数の値で処理を分岐すればいいわけです。
すみません。サンプルでは分岐させていません。
#------------------------------------------------------------------
# ● フレーム更新
#------------------------------------------------------------------

def update
 super
 if Input.trigger?(Input::C)
  Sound.play_decision
  print "キミが選んだのは、コマンド#{@index + 1}だね☆"
 end
end

■ 元の画面に戻る
この処理は、Scene クラスに定義します。
生成したインスタンスを terminate メソッドで全て消去します。
#------------------------------------------------------------------
# ● 終了処理
#------------------------------------------------------------------

def terminate
 super
 @test_window.dispose
end
#------------------------------------------------------------------
# ● フレーム更新
#------------------------------------------------------------------

def update
 super
 if Input.trigger?(Input::B)
  Sound.play_cancel
  $scene = Scene_Map.new
  return
 end
 @test_window.update
end
見た感じ terminate メソッドが使われていない気がしますが、
このメソッドは、シーン($scene)が切り替わった際に呼び出されます。


最終的には、こうなりました。
#==============================================================================
# ■ Window_Test
#==============================================================================
class Window_Test < Window_Selectable
  def initialize
    super(147, 120, 250, 176)
    @index = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    cmd = ["コマンド1", "コマンド2", "コマンド3", "4", "5", "6"]
    @item_max = cmd.size
    for i in 0...@item_max
      self.contents.draw_text(0, WLH * i, 218, WLH, cmd[i])
    end
  end
  #--------------------------------------------------------------------------
  # ● フレームの更新
  #--------------------------------------------------------------------------
  def update
    super
    if Input.trigger?(Input::C)
      Sound.play_decision
      print "キミが選んだのは、コマンド#{@index + 1}だね☆"
    end
  end
end

#==============================================================================
# ■ Scene_Test
#==============================================================================
class Scene_Test < Scene_Base
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    @test_window = Window_Test.new
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    @test_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレームの更新
  #--------------------------------------------------------------------------
  def update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      $scene = Scene_Map.new
      return
    end
    @test_window.update
  end
end

コメント




 

 ※ コメント内にURLを含めるには、バッククォート(`)をURLの直前に付け加えてください。


管理人のみ閲覧許可 [?]

トラックバック
トラックバックURL:
http://cacaosoft.blog42.fc2.com/tb.php/128-422604ca
≪ トップページへこのページの先頭へ  ≫
カレンダー
01 << 2017/03 >> 02
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -

カテゴリー
最近の記事
02/28 お返事
02/14 お返事
01/21 お返事
01/12 更新情報
11/28 お返事

最近のコメント
03/16 お返事
01/21 お返事
11/30 z座標
11/20 z座標
08/03 お返事

タグクラウド

リンク