#============================================================================== #◆ローテーションタイプメニュー in タイトル画面 ver 1.0 #   by 黒豹は月夜に踊る #     http://hunters.nobody.jp/ #------------------------------------------------------------------------------ # タイトルメニューを横ドラム式タイトルメニューにします。 # イメージ的にはコインランドリーの洗濯機 #============================================================================== #============================================================================== # ■ Rotation_Menu #------------------------------------------------------------------------------ #  横ドラム式メニューを表示。 #============================================================================== class Rotation_Menu #---------------------------------------------------------------------------- #以下の四つのアドレスを使用したい画像の物に挿げ替えてください。 #上の三つの画像は高さを揃えることを推奨します。 #---------------------------------------------------------------------------- NEW_GAME="Graphics/Pictures/new_game.png" #ニューゲーム CONTINUE="Graphics/Pictures/load_game.png" #コンティニュー SHUT_DOWN="Graphics/Pictures/shut_down.png" #シャットダウン FLARE="Graphics/Pictures/flare.png" #選択中コンテンツ明示様 CONTENTS = [NEW_GAME, CONTINUE, SHUT_DOWN] if CONTENTS.size < 5 N_OF_CONTENTS = 5 else N_OF_CONTENTS = CONTENTS.size end INI_X = 320 #メニューの初期位置のX座標 INI_Y = 380 #メニューの初期位置のY座標 attr_accessor :x #メニューのX座標 attr_accessor :y #メニューのY座標 attr_accessor :content_h #コンテンツの高さ attr_accessor :t #回転中経過フレーム attr_accessor :duration #回転速度 attr_accessor :index #選択中コマンド attr_reader :flag #回転中フラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 # duration : メニューの回転速度 # #-------------------------------------------------------------------------- def initialize(duration = 8,x = INI_X,y = INI_Y) @index = 0 @flag = 0 @x = x @y = y @t = 0 @duration = duration @contents = Array.new(N_OF_CONTENTS) for i in 0...@contents.size @contents[i] = Sprite.new() end @flare = Sprite.new() @flare.blend_type = 1 set_bmp(0) set_position end #--------------------------------------------------------------- # ● コンテンツを回転させた後に初期化する #--------------------------------------------------------------- def refresh for i in 0...@contents.size @contents[i].bitmap.dispose end set_bmp(@index) set_position return end def dispose for i in 0...@contents.size @contents[i].dispose end @flare.dispose return end #-------------------------------------------------------------------------- # ● 可視設定・取得 #-------------------------------------------------------------------------- def visible=(visible) for i in 0...N_OF_CONTENTS contents[i].visible = visible end return end def visible return contents[0].visible end #-------------------------------------------------------------------------- # ● ローテーション補助 #-------------------------------------------------------------------------- def loop(pre,max) if pre < 0 return max+pre+1 elsif pre > max return max-(pre%max)-1 else return pre end end #--------------------------------------------------------------- # ● コンテンツを回転させた後にBMPを変更する #--------------------------------------------------------------- def set_bmp(ind) buf = CONTENTS.size for i in 0...buf if ind == i @contents[0].bitmap = Bitmap.new(CONTENTS[loop(i,buf-1)]) @contents[1].bitmap = Bitmap.new(CONTENTS[loop(i+1,buf-1)]) @contents[2].bitmap = Bitmap.new(CONTENTS[loop(i+2,buf-1)]) @contents[3].bitmap = Bitmap.new(CONTENTS[loop(i-2,buf-1)]) @contents[4].bitmap = Bitmap.new(CONTENTS[loop(i-1,buf-1)]) end end @flare.bitmap = Bitmap.new(FLARE) @content_h = @contents[0].bitmap.height return end #--------------------------------------------------------------- #● コンテンツ位置矯正 #--------------------------------------------------------------- def set_position #--------------------------------------------------------------- @contents[0].x = @x @contents[0].y = @y @contents[0].zoom_y = 1.0 @contents[0].ox = @contents[0].bitmap.width/2 @contents[0].oy = @contents[0].bitmap.height/2 @contents[0].opacity = 255 #--------------------------------------------------------------- @contents[1].ox = @contents[1].bitmap.width/2 @contents[1].oy = @contents[1].bitmap.height/2 @contents[1].x = @x @contents[1].y = @y + @content_h*3/4 @contents[1].zoom_y = 0.7 @contents[1].opacity = 127 #--------------------------------------------------------------- @contents[2].ox = @contents[2].bitmap.width/2 @contents[2].oy = @contents[2].bitmap.height/2 @contents[2].x = @x @contents[2].y = @y + @content_h*5/4 @contents[2].zoom_y = 0.2 @contents[2].opacity = 63 #--------------------------------------------------------------- @contents[3].ox = @contents[3].bitmap.width/2 @contents[3].oy = @contents[3].bitmap.height/2 @contents[3].x = @x @contents[3].y = @y - @content_h*5/4 @contents[3].zoom_y = 0.2 @contents[3].opacity = 63 #--------------------------------------------------------------- @contents[4].ox = @contents[4].bitmap.width/2 @contents[4].oy = @contents[4].bitmap.height/2 @contents[4].x = @x @contents[4].y = @y - @content_h*3/4 @contents[4].zoom_y = 0.7 @contents[4].opacity = 127 #--------------------------------------------------------------- @flare.x = @x @flare.y = @y @flare.ox = @flare.bitmap.width/2 @flare.oy = @flare.bitmap.height/2 @flare.opacity = 255 return end #--------------------------------------------------------------- #●コンテンツ位置変更 #--------------------------------------------------------------- def move_position pos0_y = @y pos0_zy = 1.0 pos0_op = 255 pos1_y = @y + @content_h*3/4 pos1_zy = 0.7 pos1_op = 127 pos2_y = @y + @content_h*5/4 pos2_zy = 0.2 pos2_op = 63 pos3_y = @y - @content_h*5/4 pos3_zy = 0.2 pos3_op = 63 pos4_y = @y - @content_h*3/4 pos4_zy = 0.7 pos4_op = 127 outer_u_y = @y - @content_h*6/4 outer_d_y = @y + @content_h*6/4 outer_op = 0 outer_zy = 0 rate = @t / @duration @t += 1.0 if @flag == 1 @contents[0].y = pos0_y - (pos0_y - pos4_y)*rate @contents[0].zoom_y = pos0_zy - (pos0_zy - pos4_zy)*rate @contents[0].opacity = pos0_op - (pos0_op - pos4_op)*rate @contents[1].y = pos1_y - (pos1_y - pos0_y)*rate @contents[1].zoom_y = pos1_zy - (pos1_zy - pos0_zy)*rate @contents[1].opacity = pos1_op - (pos1_op - pos0_op)*rate @contents[2].y = pos2_y - (pos2_y - pos1_y)*rate @contents[2].zoom_y = pos2_zy - (pos2_zy - pos1_zy)*rate @contents[2].opacity = pos2_op - (pos2_op - pos1_op)*rate @contents[3].y = pos3_y - (pos3_y - outer_u_y)*rate @contents[3].zoom_y = pos3_zy - (pos3_zy - outer_zy)*rate @contents[3].opacity = pos3_op - (pos3_op - outer_op)*rate @contents[4].y = pos4_y - (pos4_y - pos3_y)*rate @contents[4].zoom_y = pos4_zy - (pos4_zy - pos3_zy)*rate @contents[4].opacity = pos4_op - (pos4_op - pos3_op)*rate elsif @flag == -1 @contents[0].y = pos0_y - (pos0_y - pos1_y)*rate @contents[0].zoom_y = pos0_zy - (pos0_zy - pos1_zy)*rate @contents[0].opacity = pos0_op - (pos0_op - pos1_op)*rate @contents[1].y = pos1_y - (pos1_y - pos2_y)*rate @contents[1].zoom_y = pos1_zy - (pos1_zy - pos2_zy)*rate @contents[1].opacity = pos1_op - (pos1_op - pos2_op)*rate @contents[2].y = pos2_y - (pos2_y - outer_d_y)*rate @contents[2].zoom_y = pos2_zy - (pos2_zy - outer_zy)*rate @contents[2].opacity = pos2_op - (pos2_op - outer_op)*rate @contents[3].y = pos3_y - (pos3_y - pos4_y)*rate @contents[3].zoom_y = pos3_zy - (pos3_zy - pos4_zy)*rate @contents[3].opacity = pos3_op - (pos3_op - pos4_op)*rate @contents[4].y = pos4_y - (pos4_y - pos0_y)*rate @contents[4].zoom_y = pos4_zy - (pos4_zy - pos0_zy)*rate @contents[4].opacity = pos4_op - (pos4_op - pos0_op)*rate end return end #--------------------------------------------------------------- #● 選択中コンテンツ変更(内部) #--------------------------------------------------------------- def change_index @index += @flag if @index == -1 @index = 2 elsif @index == 3 @index = 0 end @flag = 0 @t = 0 return end #--------------------------------------------------------------- # update # flagが正なら上回転 #  flagが負なら下回転 # #--------------------------------------------------------------- def update #回転中ならば if @flag != 0 #回転を執行 move_position #回転が終わるとき if @t == @duration #コンテンツを回転後の状態で描画 change_index refresh end else #回転中でなければ if Input.repeat?(Input::DOWN) # 下キーで正回転(上に回る)をする $game_system.se_play($data_system.cursor_se) @flag = 1 elsif Input.repeat?(Input::UP) # 上キーで逆回転(下に回る)をする $game_system.se_play($data_system.cursor_se) @flag = -1 end refresh end return end end #============================================================================== # ■ Scene_Title #------------------------------------------------------------------------------ #  タイトル画面の処理を行うクラスです。 #============================================================================== class Scene_Title #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # 戦闘テストの場合 if $BTEST battle_test return end # データベースをロード $data_actors = load_data("Data/Actors.rxdata") $data_classes = load_data("Data/Classes.rxdata") $data_skills = load_data("Data/Skills.rxdata") $data_items = load_data("Data/Items.rxdata") $data_weapons = load_data("Data/Weapons.rxdata") $data_armors = load_data("Data/Armors.rxdata") $data_enemies = load_data("Data/Enemies.rxdata") $data_troops = load_data("Data/Troops.rxdata") $data_states = load_data("Data/States.rxdata") $data_animations = load_data("Data/Animations.rxdata") $data_tilesets = load_data("Data/Tilesets.rxdata") $data_common_events = load_data("Data/CommonEvents.rxdata") $data_system = load_data("Data/System.rxdata") # システムオブジェクトを作成 $game_system = Game_System.new # タイトルグラフィックを作成 @sprite = Sprite.new @sprite.bitmap = RPG::Cache.title($data_system.title_name) # コマンドウィンドウを作成 @command_window = Rotation_Menu.new @command_window.x = 320 @command_window.y = 380 # コンティニュー有効判定 # セーブファイルがひとつでも存在するかどうかを調べる # 有効なら @continue_enabled を true、無効なら false にする @continue_enabled = false for i in 0..3 if FileTest.exist?("Save#{i+1}.rxdata") @continue_enabled = true end end # コンティニューが有効な場合、カーソルをコンティニューに合わせる if @continue_enabled @command_window.index = 1 end # タイトル BGM を演奏 $game_system.bgm_play($data_system.title_bgm) # ME、BGS の演奏を停止 Audio.me_stop Audio.bgs_stop # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # コマンドウィンドウを解放 @command_window.dispose # タイトルグラフィックを解放 @sprite.bitmap.dispose @sprite.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # コマンドウィンドウを更新 @command_window.update # C ボタンが押された場合 (メニュー回転中以外) if @command_window.flag==0 && Input.trigger?(Input::C) # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # ニューゲーム command_new_game when 1 # コンティニュー command_continue when 2 # シャットダウン command_shutdown end end end end