赞 | 170 |
VIP | 6 |
好人卡 | 208 |
积分 | 229 |
经验 | 137153 |
最后登录 | 2024-11-15 |
在线时间 | 8638 小时 |
Lv5.捕梦者
- 梦石
- 0
- 星屑
- 22948
- 在线时间
- 8638 小时
- 注册时间
- 2011-12-31
- 帖子
- 3367
|
http://woodpenguin.web.fc2.com/rgss3/sub_menu.html
オリジナルサブメニュー
可在menu加入任意指令指定執行公共事件
例:List = [["コンフィング", 1, 2],]
加入指令コンフィング,撰擇コンフィング後執行公共事件1>執行公共事件2
可加入多個不同指令- =begin
- ▼ オリジナルサブメニュー ver. 1.0
-
- RPGツクールVXAce用スクリプト
-
- 制作 : 木星ペンギン
- URL : http://woodpenguin.blog.fc2.com/
- ------------------------------------------------------------------------------
- 概要
- □ コモンイベントで作成したオリジナルのサブメニュー画面が作成できます。
-
- ------------------------------------------------------------------------------
- 備考
- □ コマンドは【並び替え】の下に追加されます。
-
- □ サブメニューの処理はイベントコマンドで実行されます。
- ・メインのコモンイベントの処理が終了した時点で、前の画面に戻ります。
- ・サブのコモンイベントは処理が終了しても最初から繰り返しません。
-
- □ イベントの移動などを実行した場合、新しくメニュー画面用のイベントが
- 生成されます。
- ・座標 X:0 Y:0 にグラフィックを設定していない状態で生成されます。
-
- □ スクリプトコマンドで SceneManager.goto(Scene_Map) と実行すれば
- マップ画面まで戻ることが出来ます。
-
- =end
- module WdTk
- module SubMenu
- #--------------------------------------------------------------------------
- # ● 追加する項目の設定
- # 配列にコマンド名、実行するコモンイベントID、
- # 並列処理を行うコモンイベントIDの順に設定する。
- #--------------------------------------------------------------------------
- List = [["コンフィング", 1, 2],
- ]
-
-
- #//////////////////////////////////////////////////////////////////////////////
- #
- # 以降、変更する必要なし
- #
- #//////////////////////////////////////////////////////////////////////////////
- end
- @material ||= []
- @material << :SubMenu
- def self.include?(sym)
- @material.include?(sym)
- end
- end
- #==============================================================================
- # ■ Game_SubMenu_Character
- #==============================================================================
- class Game_SubMenu_Character < Game_Character
- #--------------------------------------------------------------------------
- # ● 通行可能判定
- #--------------------------------------------------------------------------
- def passable?(*)
- return true
- end
- #--------------------------------------------------------------------------
- # ● 斜めの通行可能判定
- #--------------------------------------------------------------------------
- def diagonal_passable?(*)
- return true
- end
- #--------------------------------------------------------------------------
- # ● 指定位置に移動
- #--------------------------------------------------------------------------
- def moveto(x, y)
- @x = x
- @y = y
- @real_x = @x
- @real_y = @y
- @prelock_direction = 0
- straighten
- update_bush_depth
- end
- #--------------------------------------------------------------------------
- # ● 画面 X 座標の取得
- #--------------------------------------------------------------------------
- def screen_x
- @real_x * 32 + 16
- end
- #--------------------------------------------------------------------------
- # ● 画面 Y 座標の取得
- #--------------------------------------------------------------------------
- def screen_y
- @real_y * 32 + 32 - shift_y - jump_height
- end
- #--------------------------------------------------------------------------
- # ● ジャンプ時の更新
- #--------------------------------------------------------------------------
- def update_jump
- @jump_count -= 1
- @real_x = (@real_x * @jump_count + @x) / (@jump_count + 1.0)
- @real_y = (@real_y * @jump_count + @y) / (@jump_count + 1.0)
- update_bush_depth
- if @jump_count == 0
- @real_x = @x
- @real_y = @y
- end
- end
- #--------------------------------------------------------------------------
- # ● 梯子判定
- #--------------------------------------------------------------------------
- def ladder?
- return false
- end
- #--------------------------------------------------------------------------
- # ● 茂み判定
- #--------------------------------------------------------------------------
- def bush?
- return false
- end
- #--------------------------------------------------------------------------
- # ● 地形タグの取得
- #--------------------------------------------------------------------------
- def terrain_tag
- return 0
- end
- #--------------------------------------------------------------------------
- # ● リージョン ID の取得
- #--------------------------------------------------------------------------
- def region_id
- return 0
- end
- #--------------------------------------------------------------------------
- # ● まっすぐに移動
- # d : 方向(2,4,6,8)
- # turn_ok : その場での向き変更を許可
- #--------------------------------------------------------------------------
- def move_straight(d, turn_ok = true)
- @move_succeed = passable?(@x, @y, d)
- if @move_succeed
- set_direction(d)
- @x += d == 6 ? 1 : d == 4 ? -1 : 0
- @y += d == 2 ? 1 : d == 8 ? -1 : 0
- increase_steps
- elsif turn_ok
- set_direction(d)
- end
- end
- #--------------------------------------------------------------------------
- # ● 斜めに移動
- # horz : 横方向(4 or 6)
- # vert : 縦方向(2 or 8)
- #--------------------------------------------------------------------------
- def move_diagonal(horz, vert)
- @move_succeed = diagonal_passable?(x, y, horz, vert)
- if @move_succeed
- @x += horz == 6 ? 1 : horz == 4 ? -1 : 0
- @y += vert == 2 ? 1 : vert == 8 ? -1 : 0
- increase_steps
- end
- set_direction(horz) if @direction == reverse_dir(horz)
- set_direction(vert) if @direction == reverse_dir(vert)
- end
- #--------------------------------------------------------------------------
- # ● X 方向の距離計算
- #--------------------------------------------------------------------------
- def distance_x_from(x)
- @x - x
- end
- #--------------------------------------------------------------------------
- # ● Y 方向の距離計算
- #--------------------------------------------------------------------------
- def distance_y_from(y)
- @y - y
- end
- end
- #==============================================================================
- # ■ Game_SubMenu_Interpreter
- #==============================================================================
- class Game_SubMenu_Interpreter < Game_Interpreter
- #--------------------------------------------------------------------------
- # ● イベントのセットアップ
- #--------------------------------------------------------------------------
- def setup(list, scene)
- clear
- [url=home.php?mod=space&uid=420706]@Scene[/url] = scene
- @list = list
- create_fiber
- end
- #--------------------------------------------------------------------------
- # ● 実行
- #--------------------------------------------------------------------------
- def run
- while @list[@index] do
- execute_command
- @index += 1
- end
- Fiber.yield
- @fiber = nil
- end
- #--------------------------------------------------------------------------
- # ● 画面系コマンドの対象を取得
- #--------------------------------------------------------------------------
- def screen
- @scene.screen
- end
- #--------------------------------------------------------------------------
- # ● キャラクターの取得
- #--------------------------------------------------------------------------
- def get_character(param)
- param > 0 ? @scene.get_event(param) : nil
- end
- #--------------------------------------------------------------------------
- # ● コモンイベント
- #--------------------------------------------------------------------------
- def command_117
- common_event = $data_common_events[@params[0]]
- if common_event
- child = Game_SubMenu_Interpreter.new(@depth + 1)
- child.setup(common_event.list, @scene)
- child.run
- end
- end
- end
- #==============================================================================
- # ■ Window_MenuCommand
- #==============================================================================
- class Window_MenuCommand
- #--------------------------------------------------------------------------
- # ○ 独自コマンドの追加用
- #--------------------------------------------------------------------------
- alias _wdtk_submenu_add_original_commands add_original_commands
- def add_original_commands
- WdTk::SubMenu::List.each {|com| add_command(com[0], :submenu) if com }
- end
- #--------------------------------------------------------------------------
- # ● 選択項目の名前を取得
- #--------------------------------------------------------------------------
- def current_name
- current_data ? current_data[:name] : nil
- end
- end
- #==============================================================================
- # ■ Spriteset_SubMenu
- #==============================================================================
- class Spriteset_SubMenu
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- #--------------------------------------------------------------------------
- def initialize(scene)
- @scene = scene
- create_viewports
- @character_sprites = []
- @picture_sprites = []
- update
- end
- #--------------------------------------------------------------------------
- # ● ビューポートの作成
- #--------------------------------------------------------------------------
- def create_viewports
- @viewport1 = Viewport.new
- @viewport2 = Viewport.new
- @viewport2.z = 50
- end
- #--------------------------------------------------------------------------
- # ● 解放
- #--------------------------------------------------------------------------
- def dispose
- dispose_characters
- @picture_sprites.compact.each {|sprite| sprite.dispose }
- dispose_viewports
- end
- #--------------------------------------------------------------------------
- # ● キャラクタースプライトの解放
- #--------------------------------------------------------------------------
- def dispose_characters
- @character_sprites.compact.each {|sprite| sprite.dispose }
- end
- #--------------------------------------------------------------------------
- # ● ビューポートの解放
- #--------------------------------------------------------------------------
- def dispose_viewports
- @viewport1.dispose
- @viewport2.dispose
- end
- #--------------------------------------------------------------------------
- # ● フレーム更新
- #--------------------------------------------------------------------------
- def update
- update_characters
- update_pictures
- update_viewports
- end
- #--------------------------------------------------------------------------
- # ● キャラクタースプライトの更新
- #--------------------------------------------------------------------------
- def update_characters
- @scene.events.each do |i, event|
- @character_sprites[i] ||= Sprite_Character.new(@viewport1, event)
- @character_sprites[i].update
- end
- end
- #--------------------------------------------------------------------------
- # ● ピクチャスプライトの更新
- #--------------------------------------------------------------------------
- def update_pictures
- @scene.screen.pictures.each do |pic|
- @picture_sprites[pic.number] ||= Sprite_Picture.new(@viewport2, pic)
- @picture_sprites[pic.number].update
- end
- end
- #--------------------------------------------------------------------------
- # ● ビューポートの更新
- #--------------------------------------------------------------------------
- def update_viewports
- @viewport1.tone.set(@scene.screen.tone)
- @viewport1.ox = @scene.screen.shake
- @viewport2.color.set(@scene.screen.flash_color)
- @viewport1.update
- @viewport2.update
- end
- end
- #==============================================================================
- # ■ Scene_Menu
- #==============================================================================
- class Scene_Menu
- #--------------------------------------------------------------------------
- # ○ コマンドウィンドウの作成
- #--------------------------------------------------------------------------
- alias _wdtk_submenu_create_command_window create_command_window
- def create_command_window
- _wdtk_submenu_create_command_window
- @command_window.set_handler(:submenu, method(:command_submenu))
- end
- #--------------------------------------------------------------------------
- # ● コマンド[サブメニュー]
- #--------------------------------------------------------------------------
- def command_submenu
- param = WdTk::SubMenu::List.assoc(@command_window.current_name)
- if param
- SceneManager.call(Scene_ExSubMenu)
- SceneManager.scene.prepare(*param)
- else
- @command_window.activate
- end
- end
- end
- #==============================================================================
- # ■ Scene_ExSubMenu
- #==============================================================================
- class Scene_ExSubMenu < Scene_MenuBase
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_reader :screen
- attr_reader :events
- #--------------------------------------------------------------------------
- # ● 準備
- #--------------------------------------------------------------------------
- def prepare(menu_name, main_id, sub_id)
- @screen = Game_Screen.new
- @main_interpreter = Game_SubMenu_Interpreter.new
- common_event = $data_common_events[main_id]
- @main_interpreter.setup(common_event.list, self) if common_event
- @sub_interpreter = Game_SubMenu_Interpreter.new
- common_event = $data_common_events[sub_id]
- @sub_interpreter.setup(common_event.list, self) if common_event
- @events = {}
- end
- #--------------------------------------------------------------------------
- # ● 開始処理
- #--------------------------------------------------------------------------
- def start
- super
- @spriteset = Spriteset_SubMenu.new(self)
- create_message_window
- create_scroll_text_window
- end
- #--------------------------------------------------------------------------
- # ● 終了前処理
- #--------------------------------------------------------------------------
- def pre_terminate
- super
- pre_battle_scene if SceneManager.scene_is?(Scene_Battle)
- pre_title_scene if SceneManager.scene_is?(Scene_Title)
- end
- #--------------------------------------------------------------------------
- # ● 終了処理
- #--------------------------------------------------------------------------
- def terminate
- super
- @spriteset.dispose
- perform_battle_transition if SceneManager.scene_is?(Scene_Battle)
- end
- #--------------------------------------------------------------------------
- # ● フレーム更新(基本)
- #--------------------------------------------------------------------------
- def update_basic
- super
- @main_interpreter.update
- return return_scene unless @main_interpreter.running?
- @sub_interpreter.update
- @events.each_value {|event| event.update }
- @spriteset.update
- end
- #--------------------------------------------------------------------------
- # ● 汎用フェード処理
- #--------------------------------------------------------------------------
- def fade_loop(duration)
- duration.times do |i|
- yield 255 * (i + 1) / duration
- update_basic
- end
- end
- #--------------------------------------------------------------------------
- # ● 画面のフェードイン
- #--------------------------------------------------------------------------
- def fadein(duration)
- fade_loop(duration) {|v| Graphics.brightness = v }
- end
- #--------------------------------------------------------------------------
- # ● 画面のフェードアウト
- #--------------------------------------------------------------------------
- def fadeout(duration)
- fade_loop(duration) {|v| Graphics.brightness = 255 - v }
- end
- #--------------------------------------------------------------------------
- # ● メッセージウィンドウの作成
- #--------------------------------------------------------------------------
- def create_message_window
- @message_window = Window_Message.new
- end
- #--------------------------------------------------------------------------
- # ● スクロール文章ウィンドウの作成
- #--------------------------------------------------------------------------
- def create_scroll_text_window
- @scroll_text_window = Window_ScrollText.new
- end
- #--------------------------------------------------------------------------
- # ● バトル画面遷移の前処理
- #--------------------------------------------------------------------------
- def pre_battle_scene
- Graphics.update
- Graphics.freeze
- @spriteset.dispose_characters
- BattleManager.save_bgm_and_bgs
- BattleManager.play_battle_bgm
- Sound.play_battle_start
- end
- #--------------------------------------------------------------------------
- # ● タイトル画面遷移の前処理
- #--------------------------------------------------------------------------
- def pre_title_scene
- fadeout(60)
- end
- #--------------------------------------------------------------------------
- # ● 戦闘前トランジション実行
- #--------------------------------------------------------------------------
- def perform_battle_transition
- Graphics.transition(60, "Graphics/System/BattleStart", 100)
- Graphics.freeze
- end
- #--------------------------------------------------------------------------
- # ● イベントの取得
- #--------------------------------------------------------------------------
- def get_event(event_id)
- @events[event_id] ||= Game_SubMenu_Character.new
- end
- end
复制代码 |
|