메뉴 건너뛰기

창조도시 기록보관소

extra_vars1 http://f44.aaa.livedoor.jp/~ytomy/ 
extra_vars2 RPGXP 
extra_vars3 대화관련 
extra_vars4
extra_vars5
extra_vars6  
extra_vars7  
extra_vars8  
extra_vars9  
extra_vars10  
extra_vars11  
extra_vars12  


메세지 윈도우에 미묘한 기능을 추가하는 스크립트입니다.
이 스크립트에서는 , 아래의 기능을 이용할 수 있습니다.

 - 메세지 윈도우 오른쪽 위에 이름을 표시.


 - 문장 길이에 맞추어 윈도우 사이즈를 자동조정.


 - 얼굴 그래픽을 표시. (그림 사이즈는 임의)


 


섹션:Game_System


  #--------------------------------------------------------------------------
  # ● 공개 인스턴스 변수
  #--------------------------------------------------------------------------
  attr_reader   :map_interpreter          # 맵 이벤트용 interpreter
  attr_reader   :battle_interpreter       # 배틀 이벤트용 interpreter
  attr_accessor :timer                    # 타이머
  attr_accessor :timer_working            # 타이머 작동중 플래그
  attr_accessor :save_disabled            # 세이브 금지
  attr_accessor :menu_disabled            # 메뉴 금지
  attr_accessor :encounter_disabled       # 엔카운트 금지
  attr_accessor :message_position         # 문장 옵션 표시 위치
  attr_accessor :message_frame            # 문장 옵션 윈도우범위
  attr_accessor :save_count               # 세이브 회수
  attr_accessor :magic_number             # magic number -
  attr_accessor :message_auto_adjust      # 메세지 윈도우 자동 사이즈 조정


 


 


  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    @map_interpreter = Interpreter.new(0, true)
    @battle_interpreter = Interpreter.new(0, false)
    @timer = 0
    @timer_working = false
    @save_disabled = false
    @menu_disabled = false
    @encounter_disabled = false
    @message_position = 2
    @message_frame = 0
    @save_count = 0
    @magic_number = 0
    @message_auto_adjust = true
  end


 


섹션:Window_Message


여기는 기본에서 수정하게 없으면 전부다 복사하시고 뭔가 바뀐게 있으면 붉은부분만 찾아서 수정해주세요.


 


 


#==============================================================================
# ■ 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

    # 이름용 소형 윈도우 작성
    @name_window = Window_Base.new(80, 240, 160, 48)
    @name_window.visible = false
    @name_window.back_opacity = 160
    @name_window.z = 9999


  end
  #--------------------------------------------------------------------------
  # ● 해방
  #--------------------------------------------------------------------------
  def dispose
    terminate_message
    $game_temp.message_window_showing = false
    if @input_number_window != nil
      @input_number_window.dispose
    end

    @name_window.dispose
    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
    # 윈도우 초기화
    initialize_window
    # 문자 보존용 비트 맵 작성
    text_buf = Bitmap.new(608, 448)
    # 메세지 윈도우 자동 사이즈 조정이 오프의 경우
    unless $game_system.message_auto_adjust
      self.contents = Bitmap.new(width - 32, height - 32)
    end
    text_buf.font.color = self.normal_color
    x = y = max_x = 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
      # 편의상 ,"\\" 을 "00" 에 변환
      text.gsub!(/\\/) { "00" }
      # "\C" 을 "01" 에 ,"\G" 를 "02" 에 변환
      text.gsub!(/\[Cc][([0-9]+)]/) { "01[#{$1}]" }
      text.gsub!(/\[Gg]/) { "02" }
      # c 에 1 문자를 취득 (문자를 취득할 수 없게 될 때까지 루프)
      while ((c = text.slice!(/./m)) != nil)
        # \ 의 경우
        if c == "00"
          # 본래의 문자에 되돌리는
          c = "\"
        end
        # C[n] 의 경우
        if c == "01"
          # 문자색을 변경
          text.sub!(/[([0-9]+)]/, "")
          color = $1.to_i
          if color >= 0 and color <= 7

            text_buf.font.color = self.text_color(color)

          end
          # 다음의 문자에
          next
        end
        # G 의 경우
        if c == "02"
          # 골드 윈도우를 작성
          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

          # x 의 최대치 갱신 판정
          max_x = [x, max_x].max


          # y 에 1 를 가산
          y += 1
          x = 0
          # 선택사항이라면 인덴트를 실시하는
          if y >= $game_temp.choice_start
            x = 8
          end
          # 다음의 문자에
          next
        end

        # 문자를 묘화
        text_buf.draw_text(4 + x, 32 * y, 40, 32, c)
        # x 에 묘화 한 문자의 폭을 가산
        x += text_buf.text_size(c).width


      end
    end

    # 메세지 윈도우 자동 사이즈 조정이 온의 경우
    if $game_system.message_auto_adjust
      # 수치 입력의 경우는 1행 여분으로 추가
      y += 1 if $game_temp.num_input_variable_id > 0
      # 윈도우 사이즈를 조정
      self.width = max_x + 40
      self.height = y * 32 + 32
      # 얼굴 그래픽이 존재하는 경우
      if @face_bitmap != nil
        # 윈도우의 폭을 가산
        self.width += @face_bitmap.width + 16
        # 윈도우의 높이가 얼굴 그래픽보다 작은 경우
        if @face_bitmap.height + 32 > self.height
          # 얼굴 그래픽보다 큰 사이즈로 설정
          self.height = @face_bitmap.height + 32
        end
        self.contents = Bitmap.new(width - 32, height - 32)
        face_y = (self.contents.height - @face_bitmap.height) / 2
        # 얼굴 그래픽이 좌측 표시의 경우
        if $msg_face[1] == 0
          @text_x = @face_bitmap.width + 16
          self.contents.blt(8, face_y, @face_bitmap,
            Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
        else
          @text_x = 0
          self.contents.blt(self.contents.width - @face_bitmap.width - 8,
            face_y, @face_bitmap,
            Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
        end
      else
        @text_x = 0
        self.contents = Bitmap.new(width - 32, height - 32)
      end
      # 중앙에 이동
      centering_window
    # 메세지 윈도우 자동 사이즈 조정이 오프의 경우
    else
      # 얼굴 그래픽이 존재하는 경우
      if @face_bitmap != nil
        # 윈도우의 높이가 얼굴 그래픽보다 작은 경우
        if @face_bitmap.height + 32 > self.height
          # 얼굴 그래픽보다 큰 사이즈로 설정
          self.height = @face_bitmap.height + 32
        end
        face_y = (self.contents.height - @face_bitmap.height) / 2
        # 얼굴 그래픽이 좌측 표시의 경우
        if $msg_face[1] == 0
          @text_x = @face_bitmap.width + 16
          self.contents.blt(8, face_y, @face_bitmap,
            Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
        else
          @text_x = 0
          self.contents.blt(self.contents.width - @face_bitmap.width - 8,
            face_y, @face_bitmap,
            Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
        end
      else
        @text_x = 0
      end
    end
    # 윈도우 내용을 묘화
    self.contents.blt(@text_x, 0, text_buf, Rect.new(0, 0, width - 32, height - 32))

    # 선택사항의 경우
    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 + @text_x
      @input_number_window.y = self.y + $game_temp.num_input_start * 32
    end

    # 이름이 설정되어 있는 경우 , 이름 표시
    if $msg_name != nil
      bitmap = Bitmap.new(32, 32)
      text_buf.font.size = 18
      cx = text_buf.text_size($msg_name).width
      @name_window.width = cx + 32
      @name_window.contents.dispose if @name_window.contents != nil
      @name_window.contents = Bitmap.new(cx, 16)
      @name_window.contents.font.size = 18
      @name_window.contents.draw_text(0, 0, cx + 8, 16, $msg_name)
      @name_window.visible = true
    # 이름이 설정되어 있지 않은 경우 , 윈도우 소거
    else
      @name_window.visible = false
    end

  end

  #--------------------------------------------------------------------------
  # ● 윈도우 설정 초기화
  #--------------------------------------------------------------------------
  def initialize_window
    if $msg_face == nil || $msg_face[0] == nil || $msg_face[1] == nil
      @face_bitmap.dispose if @face_bitmap != nil
      @face_bitmap = nil
      self.width = 480
    else
      @face_bitmap = RPG::Cache.picture($msg_face[0])
      self.width = 496 + @face_bitmap.width
    end
    self.x = (640 - self.width) / 2
    self.y = 304
    self.height = 160
    reset_window
  end
  #--------------------------------------------------------------------------
  # ● 윈도우를 중앙에 이동
  #--------------------------------------------------------------------------
  def centering_window
    self.x = (640 - self.width) / 2
    @name_window.x = self.x
  end

  #--------------------------------------------------------------------------
  # ● 윈도우의 위치와 불투명도의 설정
  #--------------------------------------------------------------------------
  def reset_window
    if $game_temp.in_battle
      self.y = 32
    else
      case $game_system.message_position
      when 0  # 상
        self.y = 32
      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
    @name_window.y = self.y - 32
    @name_window.opacity = self.opacity
    self.back_opacity = 160


  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    super
    # 용명의 경우
    if @fade_in
      self.contents_opacity += 24
      @name_window.contents_opacity += 24 if $msg_name != nil
      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
      @name_window.opacity -= 48
      if self.opacity == 0
        self.visible = false
        @name_window.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 + @text_x, n * 32, @cursor_width, 32)
    else
      self.cursor_rect.empty
    end
  end
end


 


 


이것으로 완료입니다.

   -「문장에 이름 표시」-
이벤트 커멘드 「스크립트」로
  $msg_name = "표시하는 이름"
이라고 하는 스크립트를 실행하면OK입니다.
이름을 지우는 경우는
  $msg_name = nil
과 지정해 주세요.

「메세지 윈도우같이 ID[x] 의 엑터명을 표시하고 싶다!!」라고 하는 경우는
  $msg_name = $game_actors[x].name
과 지정하면 ,ID[x] 의 엑터명이 표시됩니다.

   -「윈도우 사이즈 자동조정」-
↑의 스크립트에서는 , 디폴트로 사이즈 조정을 합니다.
해제하는 경우는 , 이벤트 커멘드 「스크립트」로
  $game_system.message_auto_adjust = false
를 실행해 주세요.

   -「얼굴 그래픽 표시」-
이벤트 커멘드 「스크립트」로
  $msg_face = ["화상 파일", {표시 위치}]
라고 하는 스크립트를 실행해 주세요.
화상 파일은 「GraphicsPictures」으로부터 읽힙니다.
표시 위치에는 , 이하의 값을 입력해 주세요.
 [0] 윈도우 좌단에 표시
 [1] 윈도우 우단에 표시
얼굴 그래픽을 소거하는 경우는
  $msg_face = nil
을 실행하면OK입니다.
덧붙여서 , 화상 사이즈에 제한은 없습니다.
타테나가나 작은 화상도 사용 가능합니다.
(윈도우 거대화 방지를 위해 , 최대에서도 종횡96px정도로 거두어 주세요

 예:「test.png」을 좌단에 표시하는 경우
  $msg_face = ["test.png", 0]


 


★주의사항★


기존에 대화창에 얼굴 띄워주는 스크립을 사용하신 분은 본 스크립트가 적용되지 않습니다.
그 스크립을 삭제해준 후에 작업해야 합니다.

번호 제목 글쓴이 날짜 조회 수
50 물가에가면 캐릭터를 반사시켜주는 스크립트 [11] file 창조도시 2007.11.05 3649
49 대화창에 이름&얼굴 띄우기 새로운방식. [2] file 창조도시 2007.11.05 2377
» 대화창에 이름&얼굴 띄우기 새로운방식. file 창조도시 2007.11.05 1535
47 새로운 게임 시작/로드 시 미묘한 연출 추가. 창조도시 2007.11.05 1332
46 vx 한글이름입력 [1] file 가가상 2008.03.03 1111
45 대화창에 얼굴 띄우기& 대화창 명령어 모음. [2] file 창조도시 2007.11.05 1110
44 맵 이름을 화면 상단에 띄우기. [1] file 창조도시 2007.11.05 1107
43 최초 시작화면에 제작자 정보를 띄워보자. [7] 창조도시 2007.11.05 1060
42 창고 시스템 [3] 창조도시 2007.11.05 1040
41 아이템창을 아이템 분류별로 나누어 지게 개조. [5] file 창조도시 2007.11.05 1026
40 액터선택지이벤트제작 간편화 스크립트 [1] Evangelista 2009.01.14 1024
39 이벤트커맨드 스크립트 관련 설명 [3] Evangelista 2009.01.27 1000
38 에너미 아이템 변화 스크립트 [1] Evangelista 2009.05.27 955
37 이벤트커맨드 스크립트 사용법 모음 [2] Evangelista 2009.01.27 937
36 이벤트커맨드 스크립트 관련 설명 Evangelista 2009.01.27 893
35 한글이름입력기 v1.76 창조도시 2007.11.05 873
34 창고 시스템 창조도시 2007.11.05 859
33 그림자문자 사용하기.. 바탕색이 무슨색이건 상관없이 글자가 잘보인다!!! 창조도시 2007.11.05 812
32 대각선 방향 이동추가로 8방향 이동 만들기. [1] 창조도시 2007.11.05 787
31 기차 파티 스크립트 [2] 창조도시 2007.11.05 781