조회 수 2083 추천 수 1 댓글 1
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
kk02.jpg

대화창 명령어 개선 스크립트입니다. 얼굴 띄워주는게 대표적인 기능이고요^^
그 외에도 상당히 유용한 기능들이 많으니 적용하고 테스트 해보세요.


 


섹션:Window_Message (스크립트 맨 아래 Main 위에 마우스 오른버튼 찔러서 '삽입' 누르시면
삽입할 새로 세션을 만들 수 있습니다. 이름을 입력하고 아래 소스를 전부 넣어주시면 됩니다)


 


#==============================================================================
# ■ Window_Message
#==============================================================================
class Window_Message < Window_Selectable
  # 一文字ずつ描?
  DEFAULT_TYPING_ENABLE = true                # falseにすると瞬間表示
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias xrxs9_initialize initialize
  def initialize
    xrxs9_initialize
    # 再生サウンド名がない場合は""とする
    if $soundname_on_speak == nil then
      $soundname_on_speak = ""
    end
    # 外字ファイルパス設定
    $gaiji_file = "./Graphics/Gaiji/sample.png"
    # 外字デ?タ?み?み
    if FileTest.exist?($gaiji_file)
      @gaiji_cache = Bitmap.new($gaiji_file)
    else
      @gaigi_cache = nil
    end
    # 文字透過?送用バッファ
    @opacity_text_buf = Bitmap.new(32, 32)
  end
  #--------------------------------------------------------------------------
  # ● メッセ?ジ終了?理
  #--------------------------------------------------------------------------
  alias xrxs9_terminate_message terminate_message
  def terminate_message
    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 refresh
    # 初期化
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.font.size  = Font.default_size
    @x = @y = @max_x = @max_y = @indent = @lines = 0
    @face_indent = 0
    @opacity = 255
    @cursor_width = 0
    @write_speed = 0
    @write_wait = 0
    @mid_stop = false
    @face_file = nil
    # @popchar が -2 の場合、標準位置。-1の場合、文字センタ?。
    # 0以上の場合 キャラポップ。0は主人公、1以降はイベント。
    @popchar = -2
    # 選?肢なら字下げを行う
    if $game_temp.choice_start == 0
      @x = 8
    end
    # 表示待ちのメッセ?ジがある場合
    if $game_temp.message_text != nil
      @now_text = $game_temp.message_text
      # 顔表示指定Fがあるか?
      if (/A[Ff][(.+?)]/.match(@now_text))!=nil then
        # ファイルチェック
        if FileTest.exist?("Graphics/Pictures/" + $1 + ".png")
          # 顔グラを描?
          @face_file = $1 + ".png"
          self.contents.blt(16, 16, RPG::Cache.picture(@face_file), Rect.new(0, 0, 96, 96))
          # 全行 128ピクセルのインデントを入れる。
          @x = @face_indent = 128
        end
        @now_text.gsub!(/[Ff][(.*?)]/) { "" }
      end
      # 制御文字?理
      begin
      last_text = @now_text.clone
      # Vを?自ル?チンに?更(追加部分)
      @now_text.gsub!(/[Vv][([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
      # nameがあるか?
      name_window_set = false
      if (/[Nn]ame[(.+?)]/.match(@now_text)) != nil
        # 値を設定
        name_window_set = true
        name_text = $1
        # name[]部分を削除
        @now_text.sub!(/[Nn]ame[(.*?)]/) { "" }
      end
      # ウィンドウ位置判定
      if (/[Pp][([-1,0-9]+)]/.match(@now_text))!=nil then
        @popchar = $1.to_i
        if @popchar == -1
          @x = @indent = 48
          @y = 4
        end
        @now_text.gsub!(/[Pp][([-1,0-9]+)]/) { "" }
      end
      # ウィンドウ幅の取得
      @max_choice_x = 0
      if @popchar >= 0
        @text_save = @now_text.clone
        @max_x = 0
        @max_y = 4
        for i in 0..3
          line = @now_text.split(/n/)[3-i]
          @max_y -= 1 if line == nil and @max_y <= 4-i
          next if line == nil
          line.gsub!(/w[(w+)]/) { "" }
          cx = contents.text_size(line).width
          @max_x = cx if cx > @max_x
          if i >= $game_temp.choice_start
            @max_choice_x = cx if cx > @max_choice_x
          end
        end
        self.width = @max_x + 32 + @face_indent
        self.height = (@max_y - 1) * 32 + 64
      else
        @max_x = self.width - 32 - @face_indent
        for i in 0..3
          line = @now_text.split(/n/)[3-i]
          next if line == nil
          line.gsub!(/w[(w+)]/) { "" }
          cx = contents.text_size(line).width
          if i >= $game_temp.choice_start
            @max_choice_x = cx if cx > @max_choice_x
          end
        end
      end
      @max_choice_x -= 128
      # 便宜上、"
" を "00" に?換
      @now_text.gsub!(//) { "00" }
      # "
C" を "01" に、"G" を "02" に、
      # "
S" を "03" に、"A" を "04" に?換
      @now_text.gsub!(/[Cc][([0-9]+)]/) { "01[#{$1}]" }
      @now_text.gsub!(/[Gg]/) { "02" }
      @now_text.gsub!(/[Ss][([0-9]+)]/) { "03[#{$1}]" }
      @now_text.gsub!(/[Aa][(.*?)]/) { "04[#{$1}]" }
      @now_text.gsub!(/[.]/) { "05" }
      @now_text.gsub!(/[|]/) { "06" }
      # 競合すると何かと?まずいので、16以降を使用する
      @now_text.gsub!(/[>]/) { "16" }
      @now_text.gsub!(/[<]/) { "17" }
      @now_text.gsub!(/[!]/) { "20" }
      @now_text.gsub!(/[~]/) { "21" }
      @now_text.gsub!(/[Ee][([0-9]+)]/) { "22[#{$1}]" }
      # インデント設定(追加部分)
      @now_text.gsub!(/[Ii]/) { "23" }
      # テキスト透過率指定(追加部分)
      @now_text.gsub!(/[Oo][([0-9]+)]/) { "24[#{$1}]" }
      # テキストサイズ指定(追加部分)
      @now_text.gsub!(/[Hh][([0-9]+)]/) { "25[#{$1}]" }
      # 空白?入(追加部分)
      @now_text.gsub!(/[Bb][([0-9]+)]/) { "26[#{$1}]" }
      # ルビ表示(追加部分)
      @now_text.gsub!(/[Rr][(.*?)]/) { "27[#{$1}]" }
      # ここで一旦ウィンドウ位置更新
      reset_window
      # nameがあるか?
      if name_window_set
        # オフセット位置
        off_x =  0
        off_y =  -10
        # ?だけウィンドウの作成(余白を 2 に設定)
        space = 2
        x = self.x + off_x - space / 2
        y = self.y + off_y - space / 2
        w = self.contents.text_size(name_text).width + 8 + space
        h = 26 + space
        @name_window_frame = Window_Frame.new(x, y, w, h)
        @name_window_frame.z = self.z + 1
        # 擬似的な空中文字描?ウィンドウを作成
        x = self.x + off_x + 4
        y = self.y + off_y
        @name_window_text  = Air_Text.new(x, y, name_text)
        @name_window_text.z = self.z + 2
      end
    end
    # ウィンドウを更新
    reset_window
    # 選?肢の場合
    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 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
    @now_text = nil if @now_text == "" # ?換
    # 表示待ちのメッセ?ジがある場合
    if @now_text != nil and @mid_stop == false
      if @write_wait > 0
        @write_wait -= 1
        return
      end
      text_not_skip = DEFAULT_TYPING_ENABLE
      while true
        # 最大 x y の保存。
        @max_x = @x if @max_x < @x
        @max_y = @y if @max_y < @y
        # c に 1 文字を取得 (文字が取得できなくなるまでル?プ)
        if (c = @now_text.slice!(/./m)) != nil
          # の場合
          if c == "00"
            # 本?の文字に?す
            c = ""
          end
          # C[n] の場合
          if c == "01"
            # 文字色を?更
            @now_text.sub!(/[([0-9]+)]/, "")
            color = $1.to_i
            if color >= 0 and color <= 7
              self.contents.font.color = text_color(color)
              if @opacity != nil
                color = self.contents.font.color
                self.contents.font.color = Color.new(color.red, color.green, color.blue, color.alpha * @opacity / 255)
              end
            end
            # 次の文字へ
            c = ""
          end
          # G の場合
          if c == "02"
            # ゴ?ルドウィンドウを作成
            if @gold_window == nil and @popchar <= 0
              @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
            # 次の文字へ
            c = ""
          end
          # S[n] の場合
          if c == "03"
            # 文字色を?更
            @now_text.sub!(/[([0-9]+)]/, "")
            speed = $1.to_i
            if speed >= 0 and speed <= 19
              @write_speed = speed
            end
            # 次の文字へ
            c = ""
          end
          # A[soundname] の場合
          if c == "04"
            # 再生ファイルを?更するための準備
            @now_text.sub!(/[(.*?)]/, "")
            buftxt = $1.dup.to_s
            # 再生ファイル名に"/"があるか?
            if buftxt.match(///) == nil and buftxt != "" then
              # なければ"Audio/SE/"を結合する
              $soundname_on_speak = "Audio/SE/" + buftxt
            else
              # あればそのままコピ?
              $soundname_on_speak = buftxt.dup
            end
            # 次の文字へ
            c = ""
          elsif c == "04"
            # 次の文字へ
            c = ""
          end
          # . の場合
          if c == "05"
            @write_wait += 5
            c = ""
          end
          # | の場合
          if c == "06"
            @write_wait += 20
            c = ""
          end
          # > の場合
          if c == "16"
            text_not_skip = false
            c = ""
          end
          # <の場合
          if c == "17"
            text_not_skip = true
            c = ""
          end
          # !の場合
          if c == "20"
            @mid_stop = true
            c = ""
          end
          # ~の場合
          if c == "21"
            terminate_message
            return
          end
          # Iの場合(追加部分)
          if c == "23"
            # 今の@xをインデント位置に設定
            @indent = @x
            c = ""
          end
          # Oの場合(追加部分)
          if c == "24"
            @now_text.sub!(/[([0-9]+)]/, "")
            @opacity = $1.to_i
            color = self.contents.font.color
            self.contents.font.color = Color.new(color.red, color.green, color.blue, color.alpha * @opacity / 255)
            c = ""
          end
          # Hの場合(追加部分)
          if c == "25"
            @now_text.sub!(/[([0-9]+)]/, "")
            self.contents.font.size = [[$1.to_i, 6].max, 32].min
            c = ""
          end
          # Bの場合(追加部分)
          if c == "26"
            @now_text.sub!(/[([0-9]+)]/, "")
            @x += $1.to_i
            c = ""
          end
          # Rの場合(追加部分)
          if c == "27"
            @now_text.sub!(/[(.*?)]/, "")
            # 文字を描?
            @x += ruby_draw_text(self.contents, @x, @y * line_height + (line_height - self.contents.font.size), $1, @opacity)
            # 文字描?のSEを演奏
            if $soundname_on_speak != ""
              Audio.se_play($soundname_on_speak)
            end
            c = ""
          end
          # アイコン描?用シ?ケンスの場合(追加部分)
          if c == "30"
            # アイコンファイル名を取得
            @now_text.sub!(/[(.*?)]/, "")
            # アイコンを描?
            self.contents.blt(@x , @y * line_height + 8, RPG::Cache.icon($1), Rect.new(0, 0, 24, 24))
            # 文字描?のSEを演奏
            if $soundname_on_speak != ""
              Audio.se_play($soundname_on_speak)
            end
            @x += 24
            # 次の文字へ
            c = ""
          end
          # 改行文字の場合
          if c == "n"
            # 選?肢ならカ?ソルの幅を更新
            if @lines >= $game_temp.choice_start
              @cursor_width = [@cursor_width, @max_choice_x - @face_indent].max
            end
            # y に 1 を加算
            @lines += 1
            @y += 1
            @x = 0 + @indent + @face_indent
            # 選?肢なら字下げを行う
            if @lines >= $game_temp.choice_start
              @x = 8 + @indent + @face_indent
            end
            # 次の文字へ
            c = ""
          end
          # 外字表示の場合
          if c == "22"
            # []部分の除去
            @now_text.sub!(/[([0-9]+)]/, "")
            # 外字を表示
            @x += gaiji_draw(4 + @x, @y * line_height + (line_height - self.contents.font.size), $1.to_i)
            # 次の文字へ
            c = ""
          end
          if c != ""
            # 文字を描?
            self.contents.draw_text(
4+@x, 4+ 32 * @y, 40, 32, c)
            @x += self.contents.text_size(c).width
            # 文字描?のSEを演奏
            if $soundname_on_speak != "" then
              Audio.se_play($soundname_on_speak)
            end
          end
          # Bボタンが押された場合
          if Input.press?(Input::B)
            text_not_skip = false
          end
        else
          text_not_skip = true
          break
        end
        # 終了判定
        if text_not_skip
          break
        end
      end
      @write_wait += @write_speed
      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
        if @mid_stop
          @mid_stop = false
          return
        else
          terminate_message
        end
      end
      return
    end
    # フェ?ドアウト中以外で表示待ちのメッセ?ジか選?肢がある場合
    if @fade_out == false and $game_temp.message_text != nil
      @contents_showing = true
      $game_temp.message_window_showing = true
      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
  #--------------------------------------------------------------------------
  # ● キャラクタ?の取得
  #     parameter : パラメ?タ
  #--------------------------------------------------------------------------
  def get_character(parameter)
    # パラメ?タで分岐
    case parameter
    when 0  # プレイヤ?
      return $game_player
    else  # 特定のイベント
      events = $game_map.events
      return events == nil ? nil : events[parameter]
    end
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウの位置と不透明度の設定
  #--------------------------------------------------------------------------
  def reset_window
    # 判定
    if @popchar >= 0
      events = $game_map.events
      if events != nil
        character = get_character(@popchar)
        x = [[character.screen_x -  0 - self.width / 2, 4].max, 636 - self.width].min
        y = [[character.screen_y - 48 - self.height, 4].max, 476 - self.height].min
        self.x = x
        self.y = y
      end
    elsif @popchar == -1
      self.x = -4
      self.y = -4
      self.width = 648
      self.height = 488
    else
      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
        self.x = 80
        if @face_file == nil
          self.width = 480
        else
          self.width = 600
          self.x -= 60
        end
        self.height = 160
      end
    end
    self.contents = Bitmap.new(self.width - 32, self.height - 32)
    if @face_file != nil
      self.contents.blt(16, 16, RPG::Cache.picture(@face_file), Rect.new(0, 0, 96, 96))
    end
    if @popchar == -1
      self.opacity = 255
      self.back_opacity = 0
    elsif $game_system.message_frame == 0
      self.opacity = 255
      self.back_opacity = 160
    else
      self.opacity = 0
      self.back_opacity = 160
    end
  end
  #--------------------------------------------------------------------------
  # ● 外字描?
  #--------------------------------------------------------------------------
  # x   :x座標
  # y   :y座標
  # num  :外字番?
  # 返り値:外字幅(@x?加値)
  #--------------------------------------------------------------------------
  def gaiji_draw(x, y, num)
    # 外字デ?タが存在しない場合は何もしない
    if @gaiji_cache == nil
      return 0
    else
      # 指定した外字がキャッシュ範?を超えている場合は何もしない
      if @gaiji_cache.width < num * 24
        return 0
      end


      # 文字サイズを計算
      if self.contents.font.size >= 20 and self.contents.font.size <= 24
        size = 24
      else
        size = self.contents.font.size * 100 * 24 / 2200
      end


      # 外字デ?タをstretch_bltで?送
      self.contents.stretch_blt(Rect.new(x, y, size, size), @gaiji_cache, Rect.new(num * 24, 0, 24, 24))


      # 文字描?のSEを演奏
      if $soundname_on_speak != "" then
        Audio.se_play($soundname_on_speak)
      end


      # 文字サイズを返す
      return size
    end
  end
  #--------------------------------------------------------------------------
  # ● line_height
  #--------------------------------------------------------------------------
  # 返り値:行の高さ(@y?加値)を返します。
  #--------------------------------------------------------------------------
  def line_height
    # 現?、選?肢等に??ができない?、自動的に32を返します。
    return 32


    # 文字サイズを計算
    if self.contents.font.size >= 20 and self.contents.font.size <= 24
      return 32
    else
      return self.contents.font.size * 15 / 10
    end
  end
  #--------------------------------------------------------------------------
  # ● ルビ文字描?
  #--------------------------------------------------------------------------
  # target :描??象。Bitmapクラスを指定。
  # x      :x座標
  # y      :y座標
  # str   :描?文字列。本文,ルビの形式で入力。
  #      ,?切りが2つ以上あった場合は自動的に無視される。
  # opacity:透過率(0~255)
  # 返り値 :文字幅(@x?加値)。
  #--------------------------------------------------------------------------
  def ruby_draw_text(target, x, y, str,opacity)
    # フォントサイズをバックアップしておく
    sizeback = target.font.size
    # ルビサイズの計算
    target.font.size * 3 / 2 > 32 ? rubysize = 32 - target.font.size : rubysize = target.font.size / 2
    rubysize = [rubysize, 6].max
   
    # opacityに規定値以上の値が入っている場合は修正。
    opacity = [[opacity, 0].max, 255].min
    # strをsplitで分割し、split_sに格納
    split_s = str.split(/,/)


    # split_sがnilの場合は""にしておく(誤動作防止)
    split_s[0] == nil ? split_s[0] = "" : nil
    split_s[1] == nil ? split_s[1] = "" : nil


    # heightとwidthを計算
    height = sizeback + rubysize
    width  = target.text_size(split_s[0]).width


    # バッファ用の幅計算(ルビの幅が本文の幅を越える可能性がある?)
    target.font.size = rubysize
    ruby_width = target.text_size(split_s[1]).width
    target.font.size = sizeback


    buf_width = [target.text_size(split_s[0]).width, ruby_width].max


    # 本文の描?幅とルビの描?幅の差を1/2にして??に格納(後で使用)
    width - ruby_width != 0 ? sub_x = (width - ruby_width) / 2 : sub_x = 0


    # opacityが255(透過なし)の場合は通常描?
    if opacity == 255
    # ルビの描?
      target.font.size = rubysize
      target.draw_text(x + sub_x, y - target.font.size, target.text_size(split_s[1]).width, target.font.size, split_s[1])
      target.font.size = sizeback
    # 本文の描?
      target.draw_text(x, y, width, target.font.size, split_s[0])
      return width
    else
      # 表示テキストのheight、widthがバッファサイズを上回る場合は
      # バッファを再生成する。
      if @opacity_text_buf.width < buf_width or @opacity_text_buf.height < height
        @opacity_text_buf.dispose
        @opacity_text_buf = Bitmap.new(buf_width, height)
      # そうでない場合はバッファクリア。
      else
        @opacity_text_buf.clear
      end
      # バッファにテキスト描?
      # ルビの描?
      @opacity_text_buf.font.size = rubysize
      @opacity_text_buf.draw_text(0 , 0, buf_width, rubysize, split_s[1], 1)
      @opacity_text_buf.font.size = sizeback
      # 本文の描?
      @opacity_text_buf.draw_text(0 , rubysize, buf_width, sizeback, split_s[0], 1)
      # ルビの幅が本文の幅を下回る場合
      if sub_x >= 0
        target.blt(x, y - rubysize, @opacity_text_buf, Rect.new(0, 0, buf_width, height), opacity)
      # ルビの幅が本文の幅を上回る場合
      else
        target.blt(x + sub_x, y - rubysize, @opacity_text_buf, Rect.new(0, 0, buf_width, height), opacity)
      end
      # 文字サイズを返す
      return width
    end
  end
  #--------------------------------------------------------------------------
  # ● V?換
  #--------------------------------------------------------------------------
  # option :オプション。無指定又は規定外の場合はindexのユ?ザ??値を返す。
  # index  :インデックス
  # 返り値 :?換結果(アイコン表示用シ?ケンス?み)
  #--------------------------------------------------------------------------
  def convart_value(option, index)
    # optionがnilの場合は""に直す(誤動作防止)
    option == nil ? option = "" : nil


    # optionはdowncaseしておく。
    option.downcase!


    # 30はアイコン表示用のシ?ケンス。30[アイコンファイル名]で定義。
    case option
    when "i"
      unless $data_items[index].name == nil
        r = sprintf("30[%s]%s", $data_items[index].icon_name, $data_items[index].name)
      end
    when "w"
      unless $data_weapons[index].name == nil
        r = sprintf("30[%s]%s", $data_weapons[index].icon_name, $data_weapons[index].name)
      end
    when "a"
      unless $data_armors[index].name == nil
        r = sprintf("30[%s]%s", $data_armors[index].icon_name, $data_armors[index].name)
      end
    when "s"
      unless $data_skills[index].name == nil
        r = sprintf("30[%s]%s", $data_skills[index].icon_name, $data_skills[index].name)
      end
    else
      r = $game_variables[index]
    end


    r == nil ? r = "" : nil
    return r
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    terminate_message


    # 外字キャッシュ開放
    if @gaiji_cache != nil
      unless @gaiji_cache.disposed?
        @gaiji_cache.dispose
      end
    end


    # 文字透過?送用バッファ開放
    unless @opacity_text_buf.disposed?
      @opacity_text_buf.dispose
    end


    $game_temp.message_window_showing = false
    if @input_number_window != nil
      @input_number_window.dispose
    end
    super
  end
  #--------------------------------------------------------------------------
  # ● カ?ソルの矩形更新
  #--------------------------------------------------------------------------
  def update_cursor_rect
    if @index >= 0
      n = $game_temp.choice_start + @index
      self.cursor_rect.set(4 + @indent + @face_indent, n * 32 + 4, @cursor_width, 32)
    else
      self.cursor_rect.empty
    end
  end
end
#==============================================================================
# ■ Window_Frame (?だけで中身の無いウィンドウ)
#==============================================================================
class Window_Frame < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super(x, y, width, height)
    self.contents = nil
    #self.back_opacity = 240
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    super
  end
end
#==============================================================================
# ■ Air_Text (何も無いところに文字描? = ?の無い瞬間表示メッセ?ジウィンドウ)
#==============================================================================
class Air_Text < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y, designate_text)
    super(x-16, y-16, 32 + designate_text.size * 12, 56)
    self.opacity      = 0
    self.back_opacity = 0
    self.contents = Bitmap.new(self.width - 32, self.height - 32)
    w = self.contents.width
    h = self.contents.height
    self.contents.draw_text(0, 0, w, h, designate_text)
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    self.contents.clear
    super
  end
end


 


 


 

이것으로 완료입니다.
자 이제 대화창에서 사용하는 명령어 들에 대해 알아보도록 하죠.

f[file]
file로 지정한 얼굴 그래픽을 표시합니다.
얼굴 그래픽의 규격은 2000/2003의 배로 96×96로 해야합니다.
이것을 하나의 파일로 준비합니다.
장소는/Graphics/Pictures/로,. png는 생략 가능합니다.
. png 이외를 사용하는 경우, 문자를 고쳐 써 주세요.
또 이 f[]의 지정은 반드시 문장의 최초로 가 주세요.

이 명령 사용시 가장 주의할 점은 한글파일로된 것을 읽지 못한다는 점입니다.
실제 사용 예 입니다.
f[face] "안녕하세요~"
위와같은 것을 그대로 대화창에 쓰시면 /Graphics/Pictures/ 안에 있는 face.png 파일을 불러오게
되는 것입니다. 만약 bmp 라던가 하는 파일이면 확장자 명도 써줘야 하고요.

name[]
[]안으로 지정한 텍스트를 작은 네임 윈도우로 표시합니다.

p[]
p[-1]로, 전체 표시(문자만으로 중앙에)를 합니다.
p[0]으로, 주인공 위에 팝 합니다.
p[ID]로, 그 ID를 가지는 이벤트 위에 팝 합니다.


문자「」를 표시합니다.

V[n]
변수 n차례에 격납된 내용을 표시합니다.
또, 번호의 전에 특정의 문자를 넣는 일로, 지정 id의 아이템, 장비품,
스킬의 이름을 설정된 아이콘과 함께 표시하는 것이 가능합니다.
i(item) :아이템
w(weapon):무기
a(armor) :방어용 기구
s(skill) :스킬

N[n]
지정 id의 엑터의 이름을 표시합니다.

C[n]
표시하는 문자색을 n차례로 변경합니다.
디폴트의 문자색은 아래 강좌중 이 색을 결정하는 스크립트 수정법이 있습니다..

G
소지금의 윈도우를 표시합니다.

s[n]
문장의 표시 스피드를 변경합니다(0~19).
숫자가 커질수록 늦어집니다.

H[n]
표시하는 문자의 사이즈를 변경합니다(6~32).

O[n]
표시하는 문자의 투과율을 지정합니다(0~255).

a[file]
문자 표시시에 재생하는 SE를 지정한 파일로 변경합니다.
데이터는. /Audio/SE/로 읽으러 갑니다. 폴더 지정은 생략 가능합니다.

.
다음의 문자 표시까지1/4초간 웨이트 합니다.

| (시프트+)
다음의 문자 표시까지 1초간 웨이트 합니다.

>
「<」가 올 때까지 , 순간 표시합니다.

<
「>」로부터 시작된 순간 표시를 종료합니다.

!
결정 키의 입력을 그 자리에서 기다립니다.

~
키 입력을 기다리지 않고 , 그대로 윈도우를 닫습니다.

e[n]
n차례의 외자를 표시합니다.
외자 데이터는 세로폭 24Pixel * 옆무제한(24 * n)의 png 형식 화상으로,
디폴트 설정에서는. /Graphics/Gaiji/sample.png를 참조하고 있습니다.
외자 파일의 참조처는 글로벌 변수$gaiji_file로 설정되어 있습니다.
문자 사이즈가 디폴트와 다른 경우는 사이즈 조정을 실시합니다만,
화상이 엉성해져 버립니다(문자 사이즈가 20~24의 경우는 변경하지 않습니다).

I (영어 i)
현재의 문자 표시 위치를 인덴트(인덴트 위치)로 설정합니다.

B[n]
지정 Pixel 분의 공백을 삽입합니다.

R[$1,$2]
루비 첨부의 문자를 표시합니다. $1하지만 본문,$2이 루비가 됩니다.
$1그리고 지정한 캐릭터 라인은 1 프레임으로 표시됩니다.
한 글자씩 표시시키고 싶은 경우는, 본문을 한 글자씩에 단락짓고 나서 루비를
할당해 주세요.
루비의 사이즈는 문자 사이즈의 것1/2입니다.
문자 사이즈와 루비의 사이즈의 합계가 32를 넘는 경우,
루비 사이즈는 32 - 문자 사이즈가 됩니다. 주의해 주세요.
또, 루비 사이즈의 최소치는 6이 됩니다.

 


 


 

?
  • ?
    미키s 2009.07.17 20:45
    머에여;; 오류뜨면서 팅기잖아영;;;

  1. 새로운 게임 시작/로드 시 미묘한 연출 추가.

  2. 대화 글씨 폰트를 원하는 폰트로 바꾸기

  3. 대각선 방향 이동추가로 8방향 이동 만들기.

  4. 맵 이름을 화면 상단에 띄우기.

  5. 최초 시작화면에 제작자 정보를 띄워보자.

  6. 선택 메뉴를 가운데 정렬 해보자.

  7. 아이템창을 아이템 분류별로 나누어 지게 개조.

  8. c[n] 명령어 줄때의 색상 결정.

  9. 대화창에 얼굴 띄우기& 대화창 명령어 모음.

  10. 게임도중에 글씨체를 바꿔보자.

  11. 대화창에 이름&얼굴 띄우기 새로운방식.

  12. 그림자문자 사용하기.. 바탕색이 무슨색이건 상관없이 글자가 잘보인다!!!

  13. 기차 파티 스크립트

  14. 한글이름입력기 v1.76

  15. 창고 시스템

  16. 물가에가면 캐릭터를 반사시켜주는 스크립트

  17. 파티 선두 캐릭터 id 변수에 넣기

  18. vx 한글이름입력

  19. [VX] 파티 선두 캐릭터 액터ID를 변수에 넣기

  20. [VX] 조건분기로 키입력의 처리 실행

Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 15 Next
/ 15






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)