Trang trí thêm cho hộp thoại Message

Thảo luận trong 'Game Development' bắt đầu bởi Laguna Dream Party, 9/12/04.

  1. Laguna Dream Party

    Laguna Dream Party Mr & Ms Pac-Man

    Tham gia ngày:
    15/6/03
    Bài viết:
    120
    Đ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!
     
  2. ken10

    ken10 Programmer

    Tham gia ngày:
    10/1/04
    Bài viết:
    2,341
    Nơi ở:
    Ho Chi Minh city
    [​IMG]

    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....
     
  3. Laguna Dream Party

    Laguna Dream Party Mr & Ms Pac-Man

    Tham gia ngày:
    15/6/03
    Bài viết:
    120
    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.
     
  4. ken10

    ken10 Programmer

    Tham gia ngày:
    10/1/04
    Bài viết:
    2,341
    Nơi ở:
    Ho Chi Minh city
    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 :D...Good Luck !!
     

Chia sẻ trang này