Đoạn script sau sẽ khiến cho các chữ trong hộp Message có viền màu đỏ (màu đỏ là mặc định, muốn có màu khác chỉ việc thay đổi giá trị màu, tức là thay 155 bằng một số khác, như 60 chẳng hạn, sẽ làm cho chữ có viền xanh) trông rất đẹp mắt: Đầu tiên các bạn mở Script Editor ra, vào Windows_Base, tìm đến 3 dòng def knockout_color return Color.new(255, 64, 0) end Ngay dưới dòng End, bạn dán đoạn script sau vào: def outline_color return Color.new(155, 100, 0) end Sau đó lại vào phần Windows_Message, tìm tất cả các dòng bắt đầu bằng self.contents.draw_text Xóa dòng đó đi, thay bằng những dòng sau: self.contents.font.color = outline_color self.contents.draw_text(4 + x-1, 32 * y-1, 40, 32, c) self.contents.draw_text(4 + x-1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y-1, 40, 32, c) self.contents.font.color = normal_color self.contents.draw_text(4 + x, 32 * y, 40, 32, c) Có khoảng 8 đến 9 lần thay như vậy. Bây giờ vào trò chơi và thử cho nhân vật nói một câu gì đó xem Các bạn hoàn toàn có thể dùng cách này cùng với cách cải tiến Message Box mà tôi đã giới thiệu ở trên. Không có tranh chấp gì cả. Hoặc đơn giản là copy đoạn script sau thay cho Windows_Message, đoạn mã này bao gồm cả hai "chiêu": class Window_Message < Window_Selectable attr_accessor :autoclosetime attr_accessor :op # ---------------------------- def initialize super(80, 304, 480, 160) self.contents = Bitmap.new(width - 32, height - 32) self.visible = false self.z = 9998 @fade_in = false @fade_out = false @contents_showing = false @cursor_width = 0 @autoclosetime = -1 @op = 255 @refreshflag = false self.active = false self.index = -1 end # ---------------------------- def dispose terminate_message $game_temp.message_window_showing = false if @input_number_window != nil @input_number_window.dispose end super end # ---------------------------- def terminate_message self.active = false self.pause = false self.index = -1 self.contents.clear @contents_showing = false if $game_temp.message_proc != nil $game_temp.message_proc.call end $game_temp.message_text = nil $game_temp.message_proc = nil $game_temp.choice_start = 99 $game_temp.choice_max = 0 $game_temp.choice_cancel_type = 0 $game_temp.choice_proc = nil $game_temp.num_input_start = 99 $game_temp.num_input_variable_id = 0 $game_temp.num_input_digits_max = 0 if @gold_window != nil @gold_window.dispose @gold_window = nil end end # ---------------------------- def refresh self.contents.clear self.contents.font.color = normal_color self.contents.font.name = ".VnTime" self.contents.font.size = 24 x = y = 0 @cursor_width = 0 @autoclosetime = -1 @refreshflag = true lineheight = 32 active = "" a = "" centerflag = false rightflag = false bannerflag = false if $game_temp.choice_start == 0 x = 8 end if $game_temp.message_text != nil text = $game_temp.message_text begin last_text = text.clone text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] } end until text == last_text text.gsub!(/\\[Nn]\[([0-9]+)\]/) do $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : "" end text.gsub!(/\\\\/) { "\000" } text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" } text.gsub!(/\\[Gg]/) { "\002" } text.gsub!(/\\[Ii]\[([0-9]+)\]/) { "\003[#{$1}]" } text.gsub!(/\\[Ff]\[([0-9]+)\]/) { "\004[#{$1}]" } text.gsub!(/\\[Aa]\[([0-9]+)\]/) { "\005[#{$1}]" } text.gsub!(/\\[Xx]/) { "\006" } text.gsub!(/\\[Rr]/) { "\007" } text.gsub!(/\\[Dd]/) { "\011" } text.gsub!(/\\[Ss]\[([0-9]+)\]/) { "\023[#{$1}]" } text.gsub!(/\\[Bb]/) { "\017" } text.gsub!(/\\[Ww]\[([0-9]+)\]/) { "\014[#{$1}]" } text.gsub!(/\\[Mm]\[([0-9]+)\]/) { "\015[#{$1}]" } text.gsub!(/\\[Oo]\[([0-9]+)\]/) { "\016[#{$1}]" } text.gsub!(/\\[Jj]\[([0-9]+)\]/) { "\013[#{$1}]" } text.gsub!(/\\[Hh]\[([0-9]+)\]/) { "\021[#{$1}]" } text.gsub!(/\\[Kk]\[([0-9]+)\]/) { "\022[#{$1}]" } while ((c = text.slice!(/./m)) != nil) if c == "\000" c = "\\" end if c == "\001" text.sub!(/\[([0-9]+)\]/, "") color = $1.to_i if color >= 0 and color <= 7 self.contents.font.color = text_color(color) end next end if c == "\002" if @gold_window == nil @gold_window = Window_Gold.new @gold_window.x = 560 - @gold_window.width if $game_temp.in_battle @gold_window.y = 192 else @gold_window.y = self.y >= 128 ? 32 : 384 end @gold_window.opacity = self.opacity @gold_window.back_opacity = self.back_opacity end next end if c == "\003" text.sub!(/\[([0-9]+)\]/, "") item_sub = $1.to_i c = $data_items[item_sub].name l = self.contents.text_size(c).width draw_item_name($data_items[item_sub], x, y * 32 + 1) x = x + l + 24 next end if c == "\004" text.sub!(/\[([0-9]+)\]/, "") fontize = $1.to_i case fontize when 1 self.contents.font.name = "Arial" when 2 self.contents.font.name = "High Tower Text" when 3 self.contents.font.name = "Tw Cen MT" when 4 self.contents.font.name = "Tahoma" end next end if c == "\005" text.sub!(/\[([0-9]+)\]/, "") @autoclosetime = $1.to_i next end if c == "\006" centerflag = true next end if c == "\007" rightflag = true next end if c == "\011" self.contents.font.name = "Arial" self.contents.font.size = 18 self.contents.font.color = normal_color lineheight = 32 next end if c == "\014" text.sub!(/\[([0-9]+)\]/, "") w_sub = $1.to_i c = $data_weapons[w_sub].name l = self.contents.text_size(c).width bitmap = RPG::Cache.icon($data_weapons[w_sub].icon_name) self.contents.blt(x+4, y * 32+ 4, bitmap, Rect.new(0, 0, 24, 24)) x += 28 self.contents.font.color = outline_color self.contents.draw_text(4 + x-1, 32 * y-1, 40, 32, c) self.contents.draw_text(4 + x-1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y-1, 40, 32, c) self.contents.font.color = normal_color self.contents.draw_text(4 + x, 32 * y, 40, 32, c) x = x + l next end if c == "\015" text.sub!(/\[([0-9]+)\]/, "") a_sub = $1.to_i c = $data_armors[a_sub].name l = self.contents.text_size(c).width bitmap = RPG::Cache.icon($data_armors[a_sub].icon_name) self.contents.blt(x+4, y * 32+ 4, bitmap, Rect.new(0, 0, 24, 24)) x += 28 self.contents.font.color = outline_color self.contents.draw_text(4 + x-1, 32 * y-1, 40, 32, c) self.contents.draw_text(4 + x-1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y-1, 40, 32, c) self.contents.font.color = normal_color self.contents.draw_text(4 + x, 32 * y, 40, 32, c) x = x + l next end if c == "\016" text.sub!(/\[([0-9]+)\]/, "") @op = $1.to_i next end if c == "\017" bannerflag = true next end if c == "\018" text.sub!(/\[([0-9]+)\]/, "") jump = $1.to_i x += jump next end if c == "\021" text.sub!(/\[([0-9]+)\]/, "") lineheight = $1.to_i next end if c == "\022" text.sub!(/\[([0-9]+)\]/, "") skill_sub = $1.to_i c = $data_skills[skill_sub].name l = self.contents.text_size(c).width bitmap = RPG::Cache.icon($data_skills[skill_sub].icon_name) self.contents.blt(x+4, y * 32+ 4, bitmap, Rect.new(0, 0, 24, 24)) x += 28 self.contents.font.color = outline_color self.contents.draw_text(4 + x-1, 32 * y-1, 40, 32, c) self.contents.draw_text(4 + x-1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y-1, 40, 32, c) self.contents.font.color = normal_color self.contents.draw_text(4 + x, 32 * y, 40, 32, c) x = x + l next end if c == "\023" text.sub!(/\[([0-9]+)\]/, "") bigness = $1.to_i self.contents.font.size = bigness next end if c == "\n" if centerflag == true x = 448 - x x = x / 2 self.contents.font.color = outline_color self.contents.draw_text(4 + x-1, 32 * y-1, 40, 32, c) self.contents.draw_text(4 + x-1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y-1, 40, 32, c) self.contents.font.color = normal_color self.contents.draw_text(4 + x, 32 * y, 40, 32, c) end if rightflag == true x = 448 - x self.contents.font.color = outline_color self.contents.draw_text(4 + x-1, 32 * y-1, 40, 32, c) self.contents.draw_text(4 + x-1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y-1, 40, 32, c) self.contents.font.color = normal_color self.contents.draw_text(4 + x, 32 * y, 40, 32, c) end if bannerflag == true x = 448 - x x = x / 2 self.contents.font.color = outline_color self.contents.draw_text(4 + x-1, 32 * y-1, 40, 32, c) self.contents.draw_text(4 + x-1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y-1, 40, 32, c) self.contents.font.color = normal_color self.contents.draw_text(4 + x, 32 * y, 40, 32, c) end a = "" centerflag = false rightflag = false bannerflag = false if y >= $game_temp.choice_start @cursor_width = [@cursor_width, x].max end y += 1 x = 0 if y >= $game_temp.choice_start x = 8 end next end if centerflag == false && rightflag == false && bannerflag == false self.contents.font.color = outline_color self.contents.draw_text(4 + x-1, 32 * y-1, 40, 32, c) self.contents.draw_text(4 + x-1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y-1, 40, 32, c) self.contents.font.color = normal_color self.contents.draw_text(4 + x, 32 * y, 40, 32, c) x += self.contents.text_size(c).width else a += c x += self.contents.text_size(c).width end end end if $game_temp.choice_max > 0 @item_max = $game_temp.choice_max self.active = true self.index = 0 end if $game_temp.num_input_variable_id > 0 digits_max = $game_temp.num_input_digits_max number = $game_variables[$game_temp.num_input_variable_id] @input_number_window = Window_InputNumber.new(digits_max) @input_number_window.number = number @input_number_window.x = self.x + 8 @input_number_window.y = self.y + $game_temp.num_input_start * 32 end end # ---------------------------- def reset_window if $game_temp.in_battle self.y = 16 else case $game_system.message_position when 0 self.y = 16 when 1 self.y = 160 when 2 self.y = 304 end end if $game_system.message_frame == 0 self.opacity = 255 else self.opacity = 0 end self.back_opacity = 160 end # ---------------------------- def update super if @refreshflag && @fade_in == false self.contents_opacity = @op end if @autoclosetime == 0 @autoclosetime = -1 terminate_message end if @autoclosetime >= 1 @autoclosetime -= 1 end if @fade_in self.contents_opacity += 24 if @input_number_window != nil @input_number_window.contents_opacity += 24 end if self.contents_opacity >= @op @fade_in = false end return end if @input_number_window != nil @input_number_window.update if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) $game_variables[$game_temp.num_input_variable_id] = @input_number_window.number $game_map.need_refresh = true @input_number_window.dispose @input_number_window = nil terminate_message end return end if @contents_showing if $game_temp.choice_max == 0 self.pause = true end if Input.trigger?(Input::B) if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0 $game_system.se_play($data_system.cancel_se) $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1) terminate_message end end if Input.trigger?(Input::C) if $game_temp.choice_max > 0 $game_system.se_play($data_system.decision_se) $game_temp.choice_proc.call(self.index) end @op = 255 terminate_message end return end if @fade_out == false and $game_temp.message_text != nil @contents_showing = true $game_temp.message_window_showing = true reset_window refresh Graphics.frame_reset self.visible = true self.contents_opacity = 0 if @input_number_window != nil @input_number_window.contents_opacity = 0 end @fade_in = true return end if self.visible @fade_out = true self.opacity -= 48 if self.opacity == 0 self.visible = false @fade_out = false $game_temp.message_window_showing = false end return end end # ---------------------------- def update_cursor_rect if @index >= 0 n = $game_temp.choice_start + @index self.cursor_rect.set(8, n * 32, @cursor_width, 32) else self.cursor_rect.empty end end end Dĩ nhiên là các bạn vẫn phải làm việc với Windows_Base như trên, nếu không sẽ báo lỗi đấy. Các thông tin trên được lấy từ Internet. Bản quyền thuộc về tất cả chúng ta!
Mã: #============================================================================== # ■ Window_Base #------------------------------------------------------------------------------ # ゲーム中のすべてのウィンドウのスーパークラスです。 #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 # width : ウィンドウの幅 # height : ウィンドウの高さ #-------------------------------------------------------------------------- def initialize(x, y, width, height) super() @windowskin_name = $game_system.windowskin_name self.windowskin = RPG::Cache.windowskin(@windowskin_name) self.x = x self.y = y self.width = width self.height = height self.z = 100 end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose # ウィンドウ内容のビットマップが設定されていれば解放 if self.contents != nil self.contents.dispose end super end #-------------------------------------------------------------------------- # ● 文字色取得 # n : 文字色番号 (0~7) #-------------------------------------------------------------------------- def text_color(n) case n when 0 return Color.new(255, 255, 255, 255) when 1 return Color.new(128, 128, 255, 255) when 2 return Color.new(255, 128, 128, 255) when 3 return Color.new(128, 255, 128, 255) when 4 return Color.new(128, 255, 255, 255) when 5 return Color.new(255, 128, 255, 255) when 6 return Color.new(255, 255, 128, 255) when 7 return Color.new(192, 192, 192, 255) else normal_color end end #-------------------------------------------------------------------------- # ● 通常文字色の取得 #-------------------------------------------------------------------------- def normal_color return Color.new(255, 255, 255, 255) end #-------------------------------------------------------------------------- # ● 無効文字色の取得 #-------------------------------------------------------------------------- def disabled_color return Color.new(255, 255, 255, 128) end #-------------------------------------------------------------------------- # ● システム文字色の取得 #-------------------------------------------------------------------------- def system_color return Color.new(192, 224, 255, 255) end #-------------------------------------------------------------------------- # ● ピンチ文字色の取得 #-------------------------------------------------------------------------- def crisis_color return Color.new(255, 255, 64, 255) end #-------------------------------------------------------------------------- # ● 戦闘不能文字色の取得 #-------------------------------------------------------------------------- def knockout_color return Color.new(255, 64, 0) end #-------------------------------------------------------------------------- # Text Outline Color #-------------------------------------------------------------------------- def outline_color return Color.new(155, 100, 0) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super # ウィンドウスキンが変更された場合、再設定 if $game_system.windowskin_name != @windowskin_name @windowskin_name = $game_system.windowskin_name self.windowskin = RPG::Cache.windowskin(@windowskin_name) end end #-------------------------------------------------------------------------- # ● グラフィックの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_graphic(actor, x, y) bitmap = RPG::Cache.character(actor.character_name, actor.character_hue) cw = bitmap.width / 4 ch = bitmap.height / 4 src_rect = Rect.new(0, 0, cw, ch) self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect) end #-------------------------------------------------------------------------- # ● 名前の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_name(actor, x, y) self.contents.font.color = normal_color self.contents.draw_text(x, y, 120, 32, actor.name) end #-------------------------------------------------------------------------- # ● クラスの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_class(actor, x, y) self.contents.font.color = normal_color self.contents.draw_text(x, y, 236, 32, actor.class_name) end #-------------------------------------------------------------------------- # ● レベルの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_level(actor, x, y) self.contents.font.color = system_color self.contents.draw_text(x, y, 32, 32, "Lv") self.contents.font.color = normal_color self.contents.draw_text(x + 32, y, 24, 32, actor.level.to_s, 2) end #-------------------------------------------------------------------------- # ● 描画用のステート文字列作成 # actor : アクター # width : 描画先の幅 # need_normal : [正常] が必要かどうか (true / false) #-------------------------------------------------------------------------- def make_battler_state_text(battler, width, need_normal) # 括弧の幅を取得 brackets_width = self.contents.text_size("[]").width # ステート名の文字列を作成 text = "" for i in battler.states if $data_states[i].rating >= 1 if text == "" text = $data_states[i].name else new_text = text + "/" + $data_states[i].name text_width = self.contents.text_size(new_text).width if text_width > width - brackets_width break end text = new_text end end end # ステート名の文字列が空の場合は "[正常]" にする if text == "" if need_normal text = "[Normal]" end else # 括弧をつける text = "[" + text + "]" end # 完成した文字列を返す return text end #-------------------------------------------------------------------------- # ● ステートの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_state(actor, x, y, width = 120) text = make_battler_state_text(actor, width, true) self.contents.font.color = actor.hp == 0 ? knockout_color : normal_color self.contents.draw_text(x, y, width, 32, text) end #-------------------------------------------------------------------------- # ● EXP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_exp(actor, x, y) self.contents.font.color = system_color self.contents.draw_text(x, y, 24, 32, "E") self.contents.font.color = normal_color self.contents.draw_text(x + 24, y, 84, 32, actor.exp_s, 2) self.contents.draw_text(x + 108, y, 12, 32, "/", 1) self.contents.draw_text(x + 120, y, 84, 32, actor.next_exp_s) end #-------------------------------------------------------------------------- # ● HP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_hp(actor, x, y, width = 144) # 文字列 "HP" を描画 self.contents.font.color = system_color self.contents.draw_text(x, y, 32, 32, $data_system.words.hp) # MaxHP を描画するスペースがあるか計算 if width - 32 >= 108 hp_x = x + width - 108 flag = true elsif width - 32 >= 48 hp_x = x + width - 48 flag = false end # HP を描画 self.contents.font.color = actor.hp == 0 ? knockout_color : actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color self.contents.draw_text(hp_x, y, 48, 32, actor.hp.to_s, 2) # MaxHP を描画 if flag self.contents.font.color = normal_color self.contents.draw_text(hp_x + 48, y, 12, 32, "/", 1) self.contents.draw_text(hp_x + 60, y, 48, 32, actor.maxhp.to_s) end end #-------------------------------------------------------------------------- # ● SP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_sp(actor, x, y, width = 144) # 文字列 "SP" を描画 self.contents.font.color = system_color self.contents.draw_text(x, y, 32, 32, $data_system.words.sp) # MaxSP を描画するスペースがあるか計算 if width - 32 >= 108 sp_x = x + width - 108 flag = true elsif width - 32 >= 48 sp_x = x + width - 48 flag = false end # SP を描画 self.contents.font.color = actor.sp == 0 ? knockout_color : actor.sp <= actor.maxsp / 4 ? crisis_color : normal_color self.contents.draw_text(sp_x, y, 48, 32, actor.sp.to_s, 2) # MaxSP を描画 if flag self.contents.font.color = normal_color self.contents.draw_text(sp_x + 48, y, 12, 32, "/", 1) self.contents.draw_text(sp_x + 60, y, 48, 32, actor.maxsp.to_s) end end #-------------------------------------------------------------------------- # ● パラメータの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # type : パラメータの種類 (0~6) #-------------------------------------------------------------------------- def draw_actor_parameter(actor, x, y, type) case type when 0 parameter_name = $data_system.words.atk parameter_value = actor.atk when 1 parameter_name = $data_system.words.pdef parameter_value = actor.pdef when 2 parameter_name = $data_system.words.mdef parameter_value = actor.mdef when 3 parameter_name = $data_system.words.str parameter_value = actor.str when 4 parameter_name = $data_system.words.dex parameter_value = actor.dex when 5 parameter_name = $data_system.words.agi parameter_value = actor.agi when 6 parameter_name = $data_system.words.int parameter_value = actor.int end self.contents.font.color = system_color self.contents.draw_text(x, y, 120, 32, parameter_name) self.contents.font.color = normal_color self.contents.draw_text(x + 120, y, 36, 32, parameter_value.to_s, 2) end #-------------------------------------------------------------------------- # ● アイテム名の描画 # item : アイテム # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_item_name(item, x, y) if item == nil return end bitmap = RPG::Cache.icon(item.icon_name) self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24)) self.contents.font.color = normal_color self.contents.draw_text(x + 28, y, 212, 32, item.name) end end CODE #============================================================================== # ■ Window_Message #------------------------------------------------------------------------------ # 文章表示に使うメッセージウィンドウです。 #============================================================================== class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(80, 304, 480, 160) self.contents = Bitmap.new(width - 32, height - 32) self.visible = false self.z = 9998 @fade_in = false @fade_out = false @contents_showing = false @cursor_width = 0 self.active = false self.index = -1 end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose terminate_message $game_temp.message_window_showing = false if @input_number_window != nil @input_number_window.dispose end super end #-------------------------------------------------------------------------- # ● メッセージ終了処理 #-------------------------------------------------------------------------- def terminate_message self.active = false self.pause = false self.index = -1 self.contents.clear # 表示中フラグをクリア @contents_showing = false # メッセージ コールバックを呼ぶ if $game_temp.message_proc != nil $game_temp.message_proc.call end # 文章、選択肢、数値入力に関する変数をクリア $game_temp.message_text = nil $game_temp.message_proc = nil $game_temp.choice_start = 99 $game_temp.choice_max = 0 $game_temp.choice_cancel_type = 0 $game_temp.choice_proc = nil $game_temp.num_input_start = 99 $game_temp.num_input_variable_id = 0 $game_temp.num_input_digits_max = 0 # ゴールドウィンドウを開放 if @gold_window != nil @gold_window.dispose @gold_window = nil end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.font.color = normal_color self.contents.font.name = $fontface self.contents.font.size = $fontsize x = y = 0 @cursor_width = 0 # 選択肢なら字下げを行う if $game_temp.choice_start == 0 x = 8 end # 表示待ちのメッセージがある場合 if $game_temp.message_text != nil text = $game_temp.message_text # 制御文字処理 begin last_text = text.clone text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] } end until text == last_text text.gsub!(/\\[Nn]\[([0-9]+)\]/) do $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : "" end # 便宜上、"\\\\" を "\000" に変換 text.gsub!(/\\\\/) { "\000" } # "\\C" を "\001" に、"\\G" を "\002" に変換 text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" } text.gsub!(/\\[Gg]/) { "\002" } # c に 1 文字を取得 (文字が取得できなくなるまでループ) while ((c = text.slice!(/./m)) != nil) # \\ の場合 if c == "\000" # 本来の文字に戻す c = "\\" end # \C[n] の場合 if c == "\001" # 文字色を変更 text.sub!(/\[([0-9]+)\]/, "") color = $1.to_i if color >= 0 and color <= 7 self.contents.font.color = text_color(color) end # 次の文字へ next end # \G の場合 if c == "\002" # ゴールドウィンドウを作成 if @gold_window == nil @gold_window = Window_Gold.new @gold_window.x = 560 - @gold_window.width if $game_temp.in_battle @gold_window.y = 192 else @gold_window.y = self.y >= 128 ? 32 : 384 end @gold_window.opacity = self.opacity @gold_window.back_opacity = self.back_opacity end # 次の文字へ next end # 改行文字の場合 if c == "\n" # 選択肢ならカーソルの幅を更新 if y >= $game_temp.choice_start @cursor_width = [@cursor_width, x].max end # y に 1 を加算 y += 1 x = 0 # 選択肢なら字下げを行う if y >= $game_temp.choice_start x = 8 end # 次の文字へ next end # 文字を描画 self.contents.font.color = outline_color self.contents.draw_text(4 + x-1, 32 * y-1, 40, 32, c) self.contents.draw_text(4 + x-1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y+1, 40, 32, c) self.contents.draw_text(4 + x+1, 32 * y-1, 40, 32, c) self.contents.font.color = normal_color self.contents.draw_text(4 + x, 32 * y, 40, 32, c) # x に描画した文字の幅を加算 x += self.contents.text_size(c).width end end # 選択肢の場合 if $game_temp.choice_max > 0 @item_max = $game_temp.choice_max self.active = true self.index = 0 end # 数値入力の場合 if $game_temp.num_input_variable_id > 0 digits_max = $game_temp.num_input_digits_max number = $game_variables[$game_temp.num_input_variable_id] @input_number_window = Window_InputNumber.new(digits_max) @input_number_window.number = number @input_number_window.x = self.x + 8 @input_number_window.y = self.y + $game_temp.num_input_start * 32 end end #-------------------------------------------------------------------------- # ● ウィンドウの位置と不透明度の設定 #-------------------------------------------------------------------------- def reset_window if $game_temp.in_battle self.y = 16 else case $game_system.message_position when 0 # 上 self.y = 16 when 1 # 中 self.y = 160 when 2 # 下 self.y = 304 end end if $game_system.message_frame == 0 self.opacity = 255 else self.opacity = 0 end self.back_opacity = 160 end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super # フェードインの場合 if @fade_in self.contents_opacity += 24 if @input_number_window != nil @input_number_window.contents_opacity += 24 end if self.contents_opacity == 255 @fade_in = false end return end # 数値入力中の場合 if @input_number_window != nil @input_number_window.update # 決定 if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) $game_variables[$game_temp.num_input_variable_id] = @input_number_window.number $game_map.need_refresh = true # 数値入力ウィンドウを解放 @input_number_window.dispose @input_number_window = nil terminate_message end return end # メッセージ表示中の場合 if @contents_showing # 選択肢の表示中でなければポーズサインを表示 if $game_temp.choice_max == 0 self.pause = true end # キャンセル if Input.trigger?(Input::B) if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0 $game_system.se_play($data_system.cancel_se) $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1) terminate_message end end # 決定 if Input.trigger?(Input::C) if $game_temp.choice_max > 0 $game_system.se_play($data_system.decision_se) $game_temp.choice_proc.call(self.index) end terminate_message end return end # フェードアウト中以外で表示待ちのメッセージか選択肢がある場合 if @fade_out == false and $game_temp.message_text != nil @contents_showing = true $game_temp.message_window_showing = true reset_window refresh Graphics.frame_reset self.visible = true self.contents_opacity = 0 if @input_number_window != nil @input_number_window.contents_opacity = 0 end @fade_in = true return end # 表示すべきメッセージがないが、ウィンドウが可視状態の場合 if self.visible @fade_out = true self.opacity -= 48 if self.opacity == 0 self.visible = false @fade_out = false $game_temp.message_window_showing = false end return end end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect if @index >= 0 n = $game_temp.choice_start + @index self.cursor_rect.set(8, n * 32, @cursor_width, 32) else self.cursor_rect.empty end end end Script by spik Cái này có thể thay đổi màu tuỳ theo ý mình....
Xin lỗi, tôi nhớ là đã nói rõ rằng bài này tôi lấy trên internet và nó miễn phí. Thứ hai nữa là : đúng là ở bõ này có bài viết như thế, nhưng nó là của chính tôi chứ ai? Thật ra tôi chẳng quan tâm lắm tới Exp đâu, tôi chỉ muốn đóng góp mấy ngu ý cho cộng đồng RPG Marker thôi. Cảm ơn vì đã nhắc nhở, lần sau tôi sẽ rút kinh nghiệm.
Không sao đâu, chỉ cần lưu ý là được.EXP đâu có nuôi sống mình.Đúng như ông noí đóng góp cho mọi người vẫn tốt hơn ...Good Luck !!