2005.09.02 06:22

답변인데요;

조회 수 137 추천 수 1 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
덩키동크님과 예화님이 답변달아주신거를
응용해서 답변을 달아드립니다.

2000과 2003의 경우에는 그냥문자만쓰면 다 특수기호들이 뜨거나
특수명령들이 먹히는데 Xp의 경우에는 스크립트를 약간손봐주셔야
이문자들이 사용가능합니다

F11을 누르시고 스크립트를 여신다음에
Main이라고 맨아래쪽쯤에있는것을 오른쪽으로 클릭하셔서
삽입이란걸 만들어주신뒤 그 섹션이름을'키특수처리입력'등등으로 아무렇게나
써주세요.

그리고 그내용에다가 아래 스크립트를 그대로 복사해주세요.!!!



#==============================================================================
# ■ Window_Message_Plus v3.1
#==============================================================================
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
        @max_choice_x -= 68
        @max_choice_x -= @face_indent*216/128
      else
        @max_x = self.width - 32 - @face_indent
        for i in 0..3
          line = @now_text.split(/n/)[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
        @max_choice_x += 8
      end
      # 선택사항이라면 커서의 폭을 갱신
      @cursor_width = 0
      #if @lines >= $game_temp.choice_start
      #  @cursor_width = [@cursor_width, @max_choice_x - @face_indent].max
      #end
      # 편의상 ,"\\" 을 "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
        # 오프셋(offset) 위치
        off_x =  0
        off_y =  -10
        # 범위만 윈도우의 작성(margin를 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"
            # y 에 1 를 가산
            @lines += 1
            @y += 1
            @x = 0 + @indent + @face_indent
            # 선택사항이라면 인덴트를 실시하는
            if @lines >= $game_temp.choice_start
              @x = 8 + @indent + @face_indent
              # 커서의 갱신
              @cursor_width = @max_choice_x
            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, 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)
    # font size를 백업 해 두는
    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(8 + @indent + @face_indent, n * 32, @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이 됩니다.

오늘도
좋은게임만드시길바랍니다.ㅇㅁㅇ//


?

List of Articles
번호 제목 글쓴이 날짜 조회 수
8827 쯔꾸르 mv 게임을 apk 파일로 변환했는데... 1 박하맛 2023.01.14 1330
8826 쯔꾸르 젖소이야기 결혼 방법좀 알려주세요... 2 백지씨 2021.12.20 2627
8825 apk포팅 승인 어케 하나요? game메이커xp 2021.11.29 1257
8824 Yanfly님의 Action Sequence Pack 질문드립니다 Neuromancer 2021.07.15 1541
8823 싸게 MV 를 먼저? 아니면 돈을 더 들어서라도 MZ? 2 Xatra 2021.07.06 1753
8822 RMMV - 스탯창과 대화창 변견 관련 질문입니다. (초보입니다 도움좀 주세요 ㅜㅜ) 2 scribble 2021.01.22 1553
8821 아오오니를 하는 사람인데요 질문 두가지가 있어요 1 오니개무서워 2021.01.16 1634
8820 재밌는게임 land_tnt 2020.12.07 1455
8819 c언어 질문 세종기항19 2020.11.10 1684
8818 코딩 질문 1 세종기항19 2020.11.08 1539
8817 혹시나 물어보는데 드래곤규 2020.11.07 1402
8816 오픈보 게임 더블드래곤 리로디드 얼티네이트에 대해 궁금 이부닝 2020.09.09 1224
8815 상태이상 확률 결정 스트레이보우 2020.09.02 1006
8814 다음 인디사이드 제작대회는 언제쯤 열릴까요? WOONAALAA 2020.05.23 963
8813 xp로 제작된 어플 실행자체가 안된다는 분이 있습니다.(제생각엔 apk로 변환하는 과정에서 버전자체가 낮은 것 같습니다) 1 라엔 2020.05.04 1415
8812 apk 포팅하는데 게임 이름이 필요합니다 뜨는데 1 kashu 2020.05.03 1350
8811 쯔꾸르VX Ace렉먹음 도와주세요... 랖랖 2020.03.22 1780
8810 안녕하세요 1 청월령 2020.02.14 834
8809 포팅 중 '게임 이름이 필요합니다' 오류 2 아이비스 2020.02.11 817
8808 RPGMV 거리 추적 1 정욱 2020.01.19 931
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 442 Next
/ 442


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

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