| 赞 | 168 |
| VIP | |
| 好人卡 | |
| 积分 | 229 |
| 经验 | |
| 最后登录 | 2025-4-1 |
| 在线时间 | 8598 小时 |
- 梦石
- 0
- 星屑
- 22879
- 在线时间
- 8598 小时
- 注册时间
- 2011-12-31
- 回帖
- 3270
|
发表于 2015-7-3 12:08:10
|
显示全部楼层
コモンイベントで作成したオリジナルのサブメニュー画面が作成できます。
在選単加上指令,選該指令執行公用事件
例:加上コンフィング到選単,執行公用事件 1,執行公用事件 2
List = [["コンフィング", 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
@Scene = 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 ||= Sprite_Character.new(@viewport1, event)
@character_sprites.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
|
|