| 赞 | 0 |
| VIP | |
| 好人卡 | |
| 积分 | 1 |
| 经验 | |
| 最后登录 | 2026-4-25 |
| 在线时间 | 489 小时 |
- 梦石
- 0
- 星屑
- 54
- 在线时间
- 489 小时
- 注册时间
- 2009-7-23
- 回帖
- 392
|
发表于 2011-8-6 19:04:29
|
显示全部楼层
直接使用真对话加强脚本,里面20行设定对话框图片- # ▼▲▼ XRXS 9. 真对话加强脚本 ver.2 ▼▲▼
- # by 桜雅 在土
- #
- # update 2006/ 6/ 7
- #
- # SixRice 改造双重对话框功能 2006/ 8/ 18
- #==============================================================================
- # □ 使用习惯
- #==============================================================================
- class Window_Message < Window_Selectable
- #--------------------------------------------------------------------------
- # 字体相关设定
- #--------------------------------------------------------------------------
- DEFAULT_FONT_NAME = "方正粗活意简体" # 字体 ( ""为系统默认 )
- DEFAULT_FONT_SIZE = 20 # 字号 (默认22)
- DEFAULT_LINE_SPACE = 22 # 字间距(默认32)
- #--------------------------------------------------------------------------
- # 基本设定
- #--------------------------------------------------------------------------
- DEFAULT_BG_PICTURE = "对话框" # 背景SKIN ( "" 为系统默认 )
- DEFAULT_BG_X = 0 # 背景SKIN X 位置
- DEFAULT_BG_Y = 0 # 背景SKIN Y 位置
- DEFAULT_RECT = Rect.new(55, 350, 700, 150) #矩形
- DEFAULT_BACK_OPACITY = 192 # 底图的不透明度
- DEFAULT_STRETCH_ENABLE = true # 五行以上自动翻页
- #--------------------------------------------------------------------------
- # インフォメーションウィンドウ
- #--------------------------------------------------------------------------
- INFO_RECT = Rect.new(0, 0, 640, DEFAULT_LINE_SPACE + 38)
- #--------------------------------------------------------------------------
- # 逐字显示 (false时直接显示一页)
- #--------------------------------------------------------------------------
- DEFAULT_TYPING_ENABLE = true # 逐字显示
- DEFAULT_TYPING_SPEED = 0.8 # 显示速度,越小越快
- #--------------------------------------------------------------------------
- # 高速跳过显示
- #--------------------------------------------------------------------------
- KEY_SHOW_ALL = Input::C # 瞬间显示完当前页文章
- KEY_MESSAGE_SKIP = Input::CTRL # 高速跳过(文章不完全显示)
- #
- # 高速スキップを有効にするスイッチのID.( 0 は常時可能)
- #
- HISKIP_ENABLE_SWITCH_ID = 0
- #
- # 高速スキップ・タイピングスキップを共に禁止するスイッチのID. ( 0 は常時可能)
- #
- SKIP_BAN_SWITCH_ID = 400
- #--------------------------------------------------------------------------
- # 顔グラフィック
- #--------------------------------------------------------------------------
- FACE_STRETCH_ENABLE = false # 顔グラフィックを↓指定のサイズに拡大する。
- FACE_WIDTH = 116 # 拡大後の「幅」
- FACE_HEIGHT = 116 # 拡大後の「高さ」
- #--------------------------------------------------------------------------
- # キャラポップ
- #--------------------------------------------------------------------------
- CHARPOP_HEIGHT = 48 # キャラポップの高さ
- end
- module XRXS9
- #--------------------------------------------------------------------------
- # ネームウィンドウ
- #--------------------------------------------------------------------------
- NAME_WINDOW_TEXT_COLOR = Color.new(192,240,255,255) #
- ame ウィンドウ文字色
- NAME_WINDOW_TEXT_SIZE = 20 #
- ame ウィンドウの文字サイズ
- NAME_WINDOW_SPACE = 22 #
- ame ウィンドウの余白
- NAME_WINDOW_OFFSET_X = 20 #
- ame ウィンドウのオフセット位置 X
- NAME_WINDOW_OFFSET_Y = 5 #
- ame ウィンドウのオフセット位置 Y
- #--------------------------------------------------------------------------
- # 終了時フェードアウト (Fade Out Before Terminate)
- #--------------------------------------------------------------------------
- FOBT_DURATION = 20 # fade を指定した時のフェード持続時間
- end
- #==============================================================================
- # --- セリフ効果音 ---
- # $game_system.speak_se = RPG::AudioFile.new("")と設定し使用します。
- #==============================================================================
- class Game_System
- attr_accessor :speak_se
- def speak_se_play
- self.se_play(self.speak_se) if self.speak_se != nil
- end
- end
- class Window_Message < Window_Selectable
- # 文字描画SE除外文字
- NOT_SOUND_CHARACTERS = [" ", " ", "・", "、", "。", "─"]
- end
- #==============================================================================
- # □ Sprite_Pause
- #==============================================================================
- class Sprite_Pause < Sprite
- def initialize
- super
- self.bitmap = RPG::Cache.windowskin("pause")
- self.x = 570
- self.y = 390
- self.z = 9999
- @count = 0
- @wait_count = 0
- update
- end
- def update
- super
- if @wait_count > 0
- @wait_count -= 1
- else
- @count = (@count + 1)% 8
- x = 80 * @count
- self.src_rect.set(x, 0, 80, 80)
- @wait_count = 2
- end
- end
- end
- #==============================================================================
- # ■ Window_Message
- #==============================================================================
- class Window_Message < Window_Selectable
- # 定数
- LEFT = 0
- CENTER = 1
- RIGHT = 2
- #--------------------------------------------------------------------------
- # ○ line_height : 行の高さ(@y増加値)を返します。
- #--------------------------------------------------------------------------
- def line_height
- return DEFAULT_LINE_SPACE
- end
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- #--------------------------------------------------------------------------
- alias xrxs9_initialize initialize
- def initialize
- # 初期化
- @stand_pictuers = []
- @held_windows = []
- @extra_windows = []
- #======================↓双重对话框功能↓====================================
- @held_windows2 = []
- @extra_windows2 = []
- #======================↑双重对话框功能↑====================================
- @extra_sprites = []
- # ポーズサイン
- $pause = Sprite_Pause.new
- $pause.visible = false
- # 呼び戻す
- xrxs9_initialize
- end
- #--------------------------------------------------------------------------
- # ● 解放
- #--------------------------------------------------------------------------
- alias xrxs9_dispose dispose
- def dispose
- # ホールドされたウィンドウを開放
- @held_windows.each {|window| window.dispose}
- @held_windows.clear
- #======================↓双重对话框功能↓====================================
- @held_windows2.each {|window| window.dispose}
- @held_windows2.clear
- #======================↑双重对话框功能↑====================================
- # ポーズサイン
- $pause.dispose
- # 外字キャッシュ開放
- if @gaiji_cache != nil
- @gaiji_cache.dispose
- @gaiji_cache = nil
- end
- # 呼び戻す
- xrxs9_dispose
- end
- #--------------------------------------------------------------------------
- # ● メッセージ終了処理
- #--------------------------------------------------------------------------
- alias xrxs9_terminate_message terminate_message
- def terminate_message
- # 素通りフラグをクリア
- @passable = false
- $game_player.messaging_moving = false
- # 背景ピクチャを解放
- if $bgframe_sprite != nil
- $bgframe_sprite.dispose
- end
- # ウィンドウホールド
- if @window_hold
- # ウィンドウやスプライトの複製を作成
- @held_windows.push(Window_Copy.new(self))
- for window in @extra_windows
- next if window.disposed?
- @held_windows.push(Window_Copy.new(window))
- end
- for sprite in @extra_sprites
- next if sprite.disposed?
- @held_windows.push(Sprite_Copy.new(sprite))
- end
- # 設定をクリア
- self.opacity = 0
- self.contents_opacity = 0
- @extra_windows.clear
- @extra_sprites.clear
- else
- # ホールドされたウィンドウを開放
- @held_windows.each {|object| object.dispose}
- @held_windows.clear
- end
- #======================↓双重对话框功能↓====================================
- # ウィンドウホールド2
- if @window_hol2
- # ウィンドウやスプライトの複製を作成
- @held_windows2.push(Window_Copy2.new(self))
- for window in @extra_windows2
- next if window.disposed?
- @held_windows2.push(Window_Copy2.new(window))
- end
- for sprite in @extra_sprites
- next if sprite.disposed?
- @held_windows.push(Sprite_Copy.new(sprite))
- end
- # 設定をクリア
- self.opacity = 0
- self.contents_opacity = 0
- @extra_windows2.clear
- @extra_sprites.clear
- else
- # ホールドされたウィンドウを開放
- @held_windows2.each {|object| object.dispose}
- @held_windows2.clear
- end
- #======================↑双重对话框功能↑====================================
- # ネームウィンドウらを解放
- if @name_window_frame != nil
- @name_window_frame.dispose
- @name_window_frame = nil
- end
- if @name_window_text != nil
- @name_window_text.dispose
- @name_window_text = nil
- end
- # 呼び戻す
- xrxs9_terminate_message
- end
- #--------------------------------------------------------------------------
- # ○ ポップキャラクターの設定と取得
- #--------------------------------------------------------------------------
- def pop_character=(character_id)
- @pop_character = character_id
- end
- def pop_character
- return @pop_character
- end
- #--------------------------------------------------------------------------
- # ○ クリア
- #--------------------------------------------------------------------------
- def clear
- self.contents.clear
- self.contents.font.color = normal_color
- self.contents.font.size = DEFAULT_FONT_SIZE
- self.contents.font.name = DEFAULT_FONT_NAME if DEFAULT_FONT_NAME != ""
- self.opacity = 0 #【天圣】透明度更改
- self.back_opacity = DEFAULT_BACK_OPACITY
- self.contents_opacity = 255
- Window_Copy
- @mid_stop = false # ! の中断中フラグ
- @face_file = nil # f の顔ファイル
- @current_name = nil #
- ame のネーム保持
- #======================↓双重对话框功能↓====================================
- @window_hold = false # hold のウィンドウホールドのフラグ
- @window_hol2 = false
- #======================↑双重对话框功能↑====================================
- @stand_pictuer_hold = false # picthold のスタンドピクチャの保持フラグ
- @passable = false # pass の素通り可能フラグ
- @inforesize = false # info のインフォリサイズ
- # あと残りのここらへんのものを全て 0 で初期化
- @x = @y = @indent = @line_index = 0
- @cursor_width = @write_wait = @lines_max = 0
- # タイピングスピードを取得
- @write_speed = DEFAULT_TYPING_SPEED
- # 各行の描画幅&位置揃え設定初期化
- @line_widths = []
- @line_aligns = []
- # self.pop_character が nil の場合、標準位置。-1の場合、文字センター。
- # 0以上の場合 キャラポップ。0は主人公、1以降はイベント。
- self.pop_character = nil
- end
- #--------------------------------------------------------------------------
- # ● リフレッシュ [再定義]
- #--------------------------------------------------------------------------
- def refresh
- # ビットマップの取得と設定
- if DEFAULT_BG_PICTURE != ""
- bitmap = RPG::Cache.picture(DEFAULT_BG_PICTURE)
- $bgframe_sprite = Sprite.new
- $bgframe_sprite.x = DEFAULT_BG_X
- $bgframe_sprite.y = DEFAULT_BG_Y
- $bgframe_sprite.bitmap = bitmap
- $bgframe_sprite.z = 8888
- if $game_switches[10] == true
- $bgframe_sprite.opacity = 0
- $pause.opacity = 0
- else
- $bgframe_sprite.opacity = 255
- $pause.opacity = 255
- end
- end
- # 初期化
- self.clear
- # 表示待ちのメッセージがある場合
- if $game_temp.message_text != nil
- @now_text = $game_temp.message_text
- # 改行削除指定\_があるか?
- if (/\_
- /.match(@now_text)) != nil
- $game_temp.choice_start -= 1
- @now_text.gsub!(/\_
- /) { "" }
- end
- # 顔表示指定Fがあるか?
- if (/\[Ff][(.+?)(?:,(d+))?]/.match(@now_text)) != nil
- # ファイルチェック
- if FileTest.exist?("Graphics/Pictures/" + $1 + ".png")
- # フェイスファイルを設定
- @face_file = $1 + ".png"
- @face_index = $2.to_i
- # 全行インデントを入れる。
- src = RPG::Cache.picture(@face_file)
- self.contents.blt(16, 16, RPG::Cache.picture(@face_file), Rect.new(0, 0, 96, 96))
- if FACE_STRETCH_ENABLE
- @indent += FACE_WIDTH
- elsif $2 == nil
- @indent += src.width
- @face_index = -1
- else
- @indent += src.width/4
- end
- end
- @now_text.gsub!(/\[Ff][(.*?)]/) { "" }
- end
- # インフォ判定
- @inforesize = (@now_text.gsub!(/\info/) { "" } != nil)
- #======================↓双重对话框功能↓====================================
- # ウィンドウ保持指定holdがあるか?
- @window_hold = (@now_text.gsub!(/\hold/) { "" } != nil)
- # ウィンドウ保持指定holdがあるか?
- @window_hol2 = (@now_text.gsub!(/\hol2/) { "" } != nil)
- #======================↑双重对话框功能↑====================================
- # vの即時変換
- @now_text.gsub!(/\[v][([0-9]+)]/) { $game_variables[$1.to_i].to_s }
- # Vを独自ルーチンに変更(追加部分)
- begin
- last_text = @now_text.clone
- @now_text.gsub!(/\[V][([IiWwAaSs]?)([0-9]+)]/) { convart_value($1, $2.to_i) }
- end until @now_text == last_text
- @now_text.gsub!(/\[Nn][([0-9]+)]/) do
- $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
- end
- #
- ame 判定
- if @now_text.sub!(/\[Nn]ame[(.*?)]/) { "" }
- @current_name = $1
- end
- # ウィンドウポップ判定
- if @now_text.gsub!(/\[Pp][([0-9]+)]/) { "" }
- self.pop_character = $1.to_i
- end
- # 改行指定
- if (/\n/.match(@now_text)) != nil
- $game_temp.choice_start += 1
- @now_text.gsub!(/\n/) { "
- " }
- end
- # フェード判定
- if @now_text.gsub!(/\fade/) { "" }
- @fade_count_before_terminate = XRXS9::FOBT_DURATION
- end
- # 素通り判定
- if @now_text.gsub!(/\pass/) { "" }
- @passable = true
- $game_player.messaging_moving = true
- end
- # 末尾連続改行を削除
- nil while( @now_text.sub!(/
- z/) { "
- " } )
- # 行数の取得
- @lines_max = @now_text.scan(/
- /).size
- # 現在搭載されている制御文字を配列化
- rxs = [/\w[(w+)]/, /\[.]/, /\[|]/, /\[>]/, /\[<]/, /\[!]/,
- /\[~]/, /\[i]/, /\[Oo][([0-9]+)]/, /\[Hh][([0-9]+)]/,
- /\[b][([0-9]+)]/, /\[Rr][(.*?)]/, /\[B]/, /\[I]/]
- @max_choice_x = 0
- # インフォウィンドウの強制センタリング
- @line_aligns[0] = CENTER if @inforesize
- #
- # [行ごとの設定]
- #
- lines = @now_text.split(/
- /)
- for i in 0..@lines_max
- # 行の取得 (インデックスは逆順)
- line = lines[@lines_max - i]
- # 空白行の場合は次へ
- next if line == nil
- # 制御文字を削る
- line.gsub!(/\[Ee][([0-9]+)]/) { "
|
|