RGSS2メモ > サ●ラLIPS


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

サ●ラ対戦っぽいやつ。

RGSSの練習がてらに打ち込む。

配布できるレベルじゃないのと、各システムを理解していないことを含め、

きちんとした形の配布は見送り。


導入方法。

コモンイベント

…を作る。

time = game_variables[制限時間の設定]

で必要な変数を引っ張ってきた後に

$scene = Scene_Question.new(time) して

ウェイト。

$game_variables[答え番号を受け取りたい変数] = Scene_Question.answer

$game_variables[のこり回答時間を受け取りたい変数] = Scene_Question.time

でコモンイベントおわり。

#==============================================================================
# ■ Scene_Question,
#------------------------------------------------------------------------------
#  はじめてのスクリプト弄り,サクラ対戦のような制限時間付質問
#   回答時間も得られた方がいい。
#==============================================================================

class Scene_Question < Scene_Base
  @@answer = -1
  @@bar_bitmap = Bitmap.new("Graphics/System/bar.png")
  @@questions = nil
  @@amount = 0
  #--
  # クラスに登録された回答を返す
  #  -1 回答エラー
  #  99 時間切れ
  # 100 無回答(キャンセルキー)
  #--
  def self.answer
    return @@answer
  end
  
  #--
  # ● 達成タイム(パーセント表記)
  #--
  def self.time
    return sprintf("%.2f",@@amount/60.0)
  end
  #--
  # ● Questionリストのセッター,コモンイベントを呼ぶ前にセットする
  #      question_list : 文字列配列
  #--
  def self.questions=(question_list)
    @@questions = question_list
  end
  
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     menu_index : コマンドのカーソル初期位置
  #     wait_time  : 回答制限時間ゲーム内フレーム数で指定,-1で無限
  #--------------------------------------------------------------------------
  def initialize(wait_time=0,menu_index = 0)
    @menu_index = menu_index
    @@answer = -1
    @question_list = @@questions
    @inf_time = (wait_time == 0) ? true : false
    @max_time = @time = wait_time
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    create_command_window
    if not @inf_time
      create_mehta #inftimeであればメータの用意はいらない
    end
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_menu_background
    @command_window.dispose
    if not @inf_time
      @mehta.dispose
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    update_menu_background
        
    #時間切れ判定
    if not @inf_time 
      @time -= 1
      if @time <= 0
        @@answer = 99
        $scene = Scene_Map.new
      end
    end
    
    #infタイムでないならメータのカウントダウン
    if not @inf_time
      mehta_update
    end
    
    @command_window.update
    if @command_window.active
      update_command_selection
    end
  end
  #--
  # ● Mehtaのアップデート
  #--
  def mehta_update
    @mehta.update
    master = @mehta.bitmap.rect.width
    @mehta.src_rect.width = (master * @time) / Float( @max_time)
    
    #ここに書くのはスマートじゃないけど…
    @@amount = @time #(100 * @time) / Float( @max_time)
  end
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウの作成
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_Command.new(320,@question_list)
    @command_window.index = @menu_index
    @command_window.x = 544/2 - @command_window.width/2
    @command_window.y = 416/2 - @command_window.height/2 + 64
  end
  #--------------------------------------------------------------------------
  # ● コマンド選択の更新
  #--------------------------------------------------------------------------
  def update_command_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @@answer = 100
      $scene = Scene_Map.new
    elsif Input.trigger?(Input::C)
      if $game_party.members.size == 0 and 
          @command_window.index < (@question_list.length - 1)
        Sound.play_buzzer
        return
      elsif $game_system.save_disabled and 
          @command_window.index == (@question_list.length - 1)
        Sound.play_buzzer
        return
      end
      Sound.play_decision
      @@answer = @command_window.index
      $scene = Scene_Map.new
    end
  end
  #--
  # ● メータの作成
  #--
  def create_mehta
    @mehta = Sprite.new
    @mehta.bitmap = @@bar_bitmap
    @mehta.z = 0
    @mehta.x = 0
    @mehta.zoom_y = 0.5
    @mehta.zoom_x = 1.8
    @mehta.y = 384
  end
end

使用方法。

コモンイベントを呼ぶ前に

Scene_Question.quesions = ["質問文"]

で質問文をセットしておく。

質問が終わったならば処理がイベントへ戻ってくるので

指定した質問番号の変数を覗いて処理を変えてやる。