RPGXP 스크립트
2007.11.06 06:03

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

조회 수 3526 추천 수 3 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

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

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


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


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


 


섹션: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]


 


★주의사항★


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

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수 추천 수
288 RPGXP 스크립트 대화창에 이름&얼굴 띄우기 새로운방식. file 창조도시 2007.11.06 3194 3
287 RPGXP 스크립트 그림자문자 사용하기.. 바탕색이 무슨색이건 상관없이 글자가 잘보인다!!! 창조도시 2007.11.06 1361 1
» RPGXP 스크립트 대화창에 이름&얼굴 띄우기 새로운방식. file 창조도시 2007.11.06 3526 3
285 RPGXP 스크립트 그림자문자 사용하기.. 바탕색이 무슨색이건 상관없이 글자가 잘보인다!!! 창조도시 2007.11.06 1869 1
284 RPGXP 스크립트 새로운 게임 시작/로드 시 미묘한 연출 추가. 창조도시 2007.12.01 2224 1
283 RPGXP 스크립트 대화 글씨 폰트를 원하는 폰트로 바꾸기 창조도시 2007.12.01 1316 2
282 RPGXP 스크립트 새로운 게임 시작/로드 시 미묘한 연출 추가. 창조도시 2007.12.01 2578 1
281 RPGXP 스크립트 대화 글씨 폰트를 원하는 폰트로 바꾸기 창조도시 2007.12.01 1763 2
280 RPGXP 스크립트 아이템창을 아이템 분류별로 나누어 지게 개조. 3 file 창조도시 2007.12.02 1614 1
279 RPGXP 스크립트 아이템창을 아이템 분류별로 나누어 지게 개조. 3 file 창조도시 2007.12.02 2127 1
278 RPGXP 스크립트 선택 메뉴를 가운데 정렬 해보자. 1 file 창조도시 2007.12.02 1415 2
277 RPGXP 스크립트 선택 메뉴를 가운데 정렬 해보자. 1 file 창조도시 2007.12.02 1847 2
276 RPGXP 스크립트 물가에가면 캐릭터를 반사시켜주는 스크립트 4 file 창조도시 2007.12.02 4432 6
275 RPGXP 스크립트 물가에가면 캐릭터를 반사시켜주는 스크립트 4 file 창조도시 2007.12.02 4936 7
274 RPGXP 스크립트 파티 선두 캐릭터 id 변수에 넣기 Evangelista 2008.01.08 1357 1
273 RPGXP 스크립트 파티 선두 캐릭터 id 변수에 넣기 Evangelista 2008.01.08 1767 1
272 RPGXP 스크립트 창고 시스템 2 창조도시 2008.01.18 1709 3
271 RPGXP 스크립트 창고 시스템 2 창조도시 2008.01.18 2141 3
270 RPGXP 스크립트 c[n] 명령어 줄때의 색상 결정. 창조도시 2008.02.14 977 1
269 RPGXP 스크립트 c[n] 명령어 줄때의 색상 결정. 창조도시 2008.02.14 1422 1
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(김원배) | 사신지(김병국)