메뉴 건너뛰기

창조도시 기록보관소



 


아래 대화창 크기 조절은 쓸데 없이 클래스를 만들어서 했기 때문에
조금 복잡한 감도 있고, 조절 한번 할때마다 오브젝트 생성해야 하기 때문에 여러가지고 안좋은 점이 있는것 같아
간단화 시킨 걸로 새로 올립니다.
여기에다가 아래 천무분서 올리신 대화창에 소형윈도우네임을 참고해서, 좌표 변하는것에 따라 자동으로 변환시키게 했습니다.
윈도우스킨이 바뀌어도 같이 바뀌게 했습니다.

이번 버젼에서 좌표를 바꾸실때는
$message_rep = [x, y, width, height] 로 해주시면 됩니다.
역시 원상태로 바꾸시려면 x에 음수를 넣으시면 됩니다.

소형 윈도우를 사용 하시려면 아래 천무님께서 올린것과 비슷하게
$msg_name = [ 이름, RL ] 로 해주시면 됩니다.
이름 에는 케릭터 이름같은거 넣어주시면 되고
RL부분에는 0이면 메세지 윈도우 왼쪽에 1이면 오른쪽에 배치 됩니다.
소형윈도우가 필요 없을때에는 $msg_name = [ nil, 0 ]이라고 해주시면 됩니다.
그럼 더 공부해서 더 좋은걸 만들어 보도록 하겠습니다. ^^

예제화면
$msg_name = [ "gunmong", 0]
$message_rep = [ 10, 360, 450, 120 ]
문장 : 안녕하세요 xp초보 gunmong입니다.

$msg_name = [ nil, 0]
$message_rep = [ 180, 360, 450, 120 ]
문장 : 헛! 이름이 사라졌습니다.

$msg_name = [ "haha", 1 ]
$message_rep = [ -10, 0, 0, 0]
문장 : haha란 녀석의 기본상태입니다.

윈도우 스킨의 변경 : 'wskin_a'
문장 : 앗 스킨이 바뀌었네요!

※그림파일이 2개밖에 안올라 예제 화면을 두개밖에 못올렸네요 ;;




#sssssssssssssssss 와 #eeeeeeeeeeeeeeee 차이만 추가하시면 됩니다.
#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
#  시스템 주위의 데이터를 취급하는 클래스입니다. BGM 등의 관리도 실시합니다.
# 이 클래스의 인스턴스는 $game_system 로 참조됩니다.
#==============================================================================

class 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 -
  #ssssssssssssssssssssssssssssssssssssssssssssssssss
  attr_accessor :message_rep              # 문장 윈도우 재배치 좌표(x, y, width, height)
 #eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  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
  #ssssssssssssssssssssssssssssssssssssssssssssssssss
    @message_rep = [0, 0, 0, 0]             # 문장 윈도우 재배치 좌표 초기화
  #eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  end













#==============================================================================
# ■ 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
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
    # 이름용 소형 윈도우 작성
    @name_window = Window_Base.new(80, 240, 160, 48)
    @name_window.visible = false
    @name_window.back_opacity = 160
    @name_window.z = 9999
    # 소형윈도우네임 변수 초기화
    $msg_name = [ nil , 0]
    # 윈도우 좌표 재배치 변수 초기화
    $message_rep = [0, 0, 0, 0]
  end
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  #-------------------------------------------------------------------
  # ● 해방
  #--------------------------------------------------------------------------
  def dispose
    terminate_message
    $game_temp.message_window_showing = false
    if @input_number_window != nil
      @input_number_window.dispose
    end
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssss  
    # 소형윈도우 해방
    @name_window.dispose
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
    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
      # 편의상,"\\\\" 을 "\000" 에 변환
      text.gsub!(/\\\\/) { "\000" }
      # "\\C" 를 "\001" 에,"\\G" 를 "\002" 에 변환
      text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
      text.gsub!(/\\[Gg]/) { "\002" }
      # c 에 1 문자를 취득 (문자를 취득할 수 없게 될 때까지 루프)
      while ((c = text.slice!(/./m)) != nil)
        # \\ 의 경우
        if c == "\000"
          # 본래의 문자에 되돌린다
          c = "\\"
        end
        # \C[n] 의 경우
        if c == "\001"
          # 문자색을 변경
          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 == "\002"
          # 골드 윈도우를 작성
          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
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
    # 이름이 설정 되어 있는 경우
    if $msg_name[0]!= nil
      text_buf = Bitmap.new(608, 448)
      # 기존 윈도우스킨과 다른경우
      if self.windowskin != @name_window.windowskin
      @name_window.windowskin = RPG::Cache.windowskin(@windowskin_name)
      end
      bitmap = Bitmap.new(32, 32)
      text_buf.font.size = 18
      cx = text_buf.text_size($msg_name[0]).width
      @name_window.width = cx + 32
      if $msg_name[1] == 0
        @name_window.x = self.x
        @name_window.y = self.y - 48
      else
        @name_window.x = self.x + self.width - @name_window.width
        @name_window.y = self.y - 48
      end
      @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[0])
      @name_window.visible = true
      
    # 이름이 설정되어 있지 않은 경우 , 윈도우 소거
    else
      @name_window.visible = false
    end
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  end
  #--------------------------------------------------------------------------
  # ● 윈도우의 위치와 불투명도의 설정
  #--------------------------------------------------------------------------
  def reset_window
    if $game_temp.in_battle
      self.y = 16
    else
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
      # 윈도우 재배치 여부
      if $message_rep[0] >= 0
        self.x = $message_rep[0]
        self.y = $message_rep[1]
        self.width = $message_rep[2]
        self.height = $message_rep[3]
      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
      self.width = 480
      self.height = 160
      end
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
    end
    if $game_system.message_frame == 0
      self.opacity = 255
    else
      self.opacity = 0
    end
#ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
    @name_window.y = self.y - 32
    @name_window.opacity = self.opacity
    self.back_opacity = 160
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  end

  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    super
    # 용명의 경우
    if @fade_in
      self.contents_opacity += 24
#ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
      @name_window.contents_opacity += 24 if $msg_name[0] != nil
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      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
#ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
      @name_window.opacity -= 48
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      if self.opacity == 0
        self.visible = false
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
        @name_window.visible = false
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

        @fade_out = false
        $game_temp.message_window_showing = false
      end
      return
    end
  end
end







출처 : gunmong

번호 제목 글쓴이 날짜 조회 수
371 레벨에 따라 값을 더 받아보자! [5] 다크세이버™ 2006.06.05 273
370 강력한 무료 에디터 Elitpad 6.5 file 나라 2006.06.04 138
369 제 2 부 ! 나도 게임을 만들수 있다 ! [5] 다크세이버™ 2006.06.01 320
368 [스크립트기초] 제 4과. 그림표시, 배열과 해시의 클래스. [1] 천무 2006.05.24 473
367 [스크립트] 배틀포인트, 배틀샵 [1] 천무 2006.05.24 669
366 [스크립트] 창고 시스템 [9] 천무 2006.05.24 621
365 [스크립트] KGC 몬스터도감 [4] 천무 2006.05.24 795
364 [연금술사] 드디어 완성! 스크립트로 점프&데쉬하기 [5] file 천무 2006.05.24 762
363 [비밀소년] 한글이름입력기 v1.76 [6] file 천무 2006.05.24 2117
362 [비밀소년] ◆공부용◆ 01 - 숫자게이지바 [1] file 천무 2006.05.24 683
361 [툴기능] RPG XP로 액알만들기.(스샷) [10] 천무 2006.05.24 1541
360 [스크립트기초] 제 3과. 조건분기와 루프. [2] 천무 2006.05.24 222
359 [스크립트] 파티원 교체. [2] 천무 2006.05.24 424
358 [스크립트] 스탯포인트로 스테이터스 조절하기입니다. 출처:gunmong [6] 천무 2006.05.24 506
357 [스크립트] 이전의 액알게이지바와는 비교도 안될 멋진 초고속 게이지바 - 그라데이션 [7] 천무 2006.05.24 879
356 [스크립트] 대화창에 이름+얼굴 띄우기: 메시지 플러스 가장 최신버전 (2005년 2월1일 버전) [4] 천무 2006.05.24 755
355 [스크립트] 소지수 한계 돌파 [1] 천무 2006.05.24 250
» [스크립트] 대화창 크기 위치를 내맘대로! 좀더 간단화 시켰습니다.(소형윈도우 네임도 추가) [1] 천무 2006.05.24 444
353 [스크립트] 전투시 몬스터 머리위로 게이지바 만들기 [6] 천무 2006.05.24 835
352 [스크립트] 레벨과 능력치 한계를 자유자재로. 출처: 모모모 [1] 천무 2006.05.24 384