RPGXP 스크립트
2007.11.06 06:03

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

조회 수 3462 추천 수 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]


 


★주의사항★


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

?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  17. 창고 시스템

  18. 창고 시스템

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

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

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(김원배) | 사신지(김병국)