XP 스크립트

#==============================================================================
# ■ 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
  end
  #--------------------------------------------------------------------------
  # ● 해방
  #--------------------------------------------------------------------------
  def dispose
    terminate_message
    $game_temp.message_window_showing = false
    if @input_number_window != nil
      @input_number_window.dispose
    end
    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
    self.contents.font.color = normal_color
    x = y = 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
            self.contents.font.color = 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
          # y 에 1 을 가산
          y += 1
          x = 0
          # 선택사항이라면 인덴트를 실시한다
          if y >= $game_temp.choice_start
            x = 8
          end
          # 다음의 문자에
          next
        end
        # 문자를 묘화
        self.contents.draw_text(4 + x, 32 * y, 40, 32, c)
        # x 에 묘화 한 문자의 폭을 가산
        x += self.contents.text_size(c).width
      end
    end
    # 선택사항의 경우
    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 reset_window
    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
    end
    if $game_system.message_frame == 0
      self.opacity = 255
    else
      self.opacity = 0
    end
    self.back_opacity = 160
  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
    # 수치 입력중의 경우
    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
      if self.opacity == 0
        self.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, n * 32, @cursor_width, 32)
    else
      self.cursor_rect.empty
    end
  end
end

Comment '3'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6153
661 기타 무기 회피율, 방어구 공격력 지정 스크립트 6 백호 2009.02.22 1244
660 기타 무기 개조 스크립트 file 백호 2009.02.21 1248
659 기타 몬스터도감 - 개량형 ? 7 file 백호 2009.02.22 2883
658 기타 몬스터 도감 7 file 백호 2009.02.21 1834
657 기타 몬스터 도감 18 file 백호 2009.02.22 2667
656 기타 몬스터 게이지바 턴알 22 file 키라링 2009.01.22 4015
655 기타 모험일기 5 키라링 2009.01.18 1825
654 기타 모험 일기 스크립트 2 file 백호 2009.02.21 1433
653 기타 명령어들 6 지존!! 2010.07.24 2288
652 기타 멤버 교체 11 file 백호 2009.02.22 2525
651 메인화면에 별똥별 효과 6 file 아방스 2007.11.09 4217
650 메뉴 메이플스토리처럼 메뉴를^^ 57 file 딸기님 2010.07.13 7141
649 메시지 메세지플러스3.1v스크립트(얼굴표시,메세지색상,속도등정하는스크립트) 8 백호 2009.02.21 4880
648 기타 메세지창의 위치 변동 자동화 file 백호 2009.02.21 1138
647 기타 메세지를 분출해 표시 백호 2009.02.22 1169
646 메시지 메세지 표시 업그레이드 11 file 백호 2009.02.21 4728
645 키입력 메세지 입력 스크립트. 25 file Bera 2010.10.18 3582
» 메시지 메세지 오류 수정 시스템 3 엘릭스토리안 2010.02.06 1474
643 메세지 분풀해 표시 스크립트 9 WMN 2008.03.17 2711
642 메뉴 메뉴화면에 '해야 할 일' 알려주는 창 넣기 11 하진 2012.04.23 3256
Board Pagination Prev 1 ... 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ... 52 Next
/ 52