variable draw item


『とりあえず必要な分だけ書き込む draw_item 拡張版』・・・の拡張版 ※コッソリとWindow_selectable 機能拡張に対応しています。 ※このスクリプトの原作者はmomomo様です。 変更点 2009:05:02 ・ショップで購入/売却後のカーソル位置とカーソル表示位置にずれがあったのを修正 ・カーソル位置より上の項目が再描画されないバグを修正
#==============================================================================
# variable draw item by 貪藻矢射妥←
#------------------------------------------------------------------------------
# 
# アイテムが大量にある場合、draw_itemでは全てを表示してからキー操作を受け付ける
# ので時間がかかってイライラする・・・と、いう現象を軽減しようといったスクリプト
# 
# ※注意
#  このスクリプトはmomomo様の日記にあった
#  『とりあえず必要な分だけ書き込む draw_item 拡張版』をヒントにしています。
# 
# ※注意その2
# 
# draw_item_vを使用するclassにおいて
# include VDIを行うのは当然なのですが、それ以外に
# 
# initialize処理 にて
# @draw_item_num = 2     # 一度に描画する数(必ずしも2である必要はない)
# @draw_ok = Array.new() # 描画完了フラグ配列
# 
# を、追加し、
# refresh処理 にて
# @draw_counter = 0(あるいはreset_array)
# 
# を、追加し、そのclass内部のどこかにある
# 
# for i in 0...@item_max
#   draw_item(i)
# end
# 
# を draw_item_v に変更してください。
# 
# また、アクター切り替えやカテゴリ切り替えの処理
# (if Input.trigger?(Input::L)とか・・・)、やシーンを閉じる際にて
# @[なんとか]_window.reset_array
# 
# を追加しておかないと一度表示したものはたとえアクターやカテゴリが切り替わって
# も表示されたとみなされ描画しないので何も表示がなくなります。
# 
# そして、切り替えではなく、単にリフレッシュを行う場合は
# @dmp_swi = @[なんとか]_window.index
# @[なんとか]_window.reset_array
# @[なんとか]_window.refresh
# @[なんとか]_window.index = @dmp_swi
# 
# の処理にしないと表示されない項目が発生します。
# 
#==============================================================================
# 変更履歴
# 2009:05:02
# ・ショップで購入/売却後のカーソル位置とカーソル表示位置にずれがあったのを修正
# ・カーソル位置より上の項目が再描画されないバグを修正

module VDI
  
  #----------------------------------------------------------------------------
  # ● update処理
  # 
  #  この処理、実は意外に重要なの。
  # 
  #----------------------------------------------------------------------------
  def update
    super()
    draw_item_v
  end
  
  #----------------------------------------------------------------------------
  # ● variable draw_item
  # 
  #  draw済みか否かを設定する配列をデータの数だけ持ち、drawしたらそのIDに
  #  対応する配列にtrueを書き込み、以後、配列にtrueが入っている場合は
  #  draw処理を行わないことで大幅に処理の軽減を行う。
  # 
  #----------------------------------------------------------------------------
  def draw_item_v
    # はじめて描画済み配列を持った際のみに初期化を行う。
    if @draw_ok == nil
      @draw_ok = Array.new(@data.size)
      @draw_ok[0] = false
    end
  
    @page_item_max = self.page_row_max * @column_max
    @item_minimam = [@item_max, @page_item_max].min
    
    # 1番最初の項目から1番底の項目へ移った際のための処理
    if (Input.repeat?(Input::UP) || ((@column_max >= 2) && 
      Input.repeat?(Input::LEFT))) && @draw_counter < @item_minimam
      
      @draw_counter = @item_max - @item_minimam - @column_max
    elsif(@index != -1)
      @draw_counter = @index
    end
    # 描画開始位置の設定(実はいい加減)
    # ↑と、いうのは本当の開始位置ではなく、カーソル現在位置から描画できる最大行
    #  を引いたものを使用しているため
    draw_first = [@draw_counter - @page_item_max, 0].max
    
    # 描画されていないものは描画しとく
    for i in draw_first...(@draw_counter + @item_minimam)
      if @draw_ok[i] != true && i < @item_max
        draw_item(i)
        @draw_ok[i] = true
      end
    end
  end
  
  #----------------------------------------------------------------------------
  # ● reset_array処理
  # 
  #  アクターやカテゴリが切り替わった際に描画済みフラグを初期化する
  # 
  #----------------------------------------------------------------------------
  def reset_array
    if @data != nil
      for i in 0..@data.size
        if @draw_ok[i] == true
          @draw_ok[i] = false
        end
      end
      if @index == -1
        @index = 0
      end
      @draw_counter = 0
    end
  end
end
〜使い方〜 variable draw itemを使いたいclassにて include VDI を追加。 initialize処理 にて @draw_item_num = 2 # 一度に描画する数(必ずしも2である必要はない) @draw_ok = Array.new() # 描画完了フラグ配列 を、追加。 refresh処理 にて @draw_counter = 0(あるいはreset_array) を追加。 そのclass内部のどこかにある for i in 0...@item_max draw_item(i) end を draw_item_v に変更してください。 また、アクター切り替えやカテゴリ切り替えの処理 (if Input.trigger?(Input::L)とか・・・)、やシーンを閉じる際にて @[なんとか]_window.reset_array を追加しておかないと一度表示したものはたとえアクターやカテゴリが切り替わって も表示されたとみなされ描画しないので何も表示がなくなります。(多分・・・) そして、切り替えではなく、単にリフレッシュを行う場合は @dmp_swi = @[なんとか]_window.index @[なんとか]_window.reset_array @[なんとか]_window.refresh @[なんとか]_window.index = @dmp_swi の処理にしないと表示されない項目が発生します。 ※実はものすごく使いづらいスクリプトのような気がする。 そのうちサンプルプロジェクトでも用意します。
戻る