XP 스크립트

출처는 상입 오두막입니다. (http://aea.to/hako/)
사용법은 댓글로

#===============================================================================
# ■ Free_Window (ver.3.01)
# ------------------------------------------------------------------------------
# 메세지 윈도우·커멘드 윈도우를 표시
# ------------------------------------------------------------------------------
# 2005/07/29 by 상입 오두막 http://aea.to/hako/
#===============================================================================
class Free_Window < Window_Selectable
  #-----------------------------------------------------------------------------
  # 정수(값은 자유롭게 설정할 수 있습니다)
  #-----------------------------------------------------------------------------
  # 행간(pixel)
  LINE_SPACE = 10
  # 윈도우의 불투명도(0..255)
  OPACITY = 255
  # 윈도우 배경의 불투명도(0..255)
  BACK_OPACITY = 160
  # 폰트(Font)
  FONT = Font.new("MS P고딕", 22) # 폰트명, 사이즈    (★폰트명이 고딕과 다른경우 고치도록.)
  FONT.bold = false                      # 볼드(굵은 글씨) 플래그
  FONT.italic = false                    # 이탤릭(이탤릭) 플래그
  # 선택사항의 결과(항목 번호)를 대입하는 변수 ID($game_variables)
  RESULT = 1
  # 그래픽 참조 폴더
  GRA_DIR = "Graphics/"
  #-----------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #-----------------------------------------------------------------------------
  def initialize(text, wx = 80, wy = 304, ww = 480, wh = 160)
    @command = text.is_a?(Array) ? true : false # 커멘드 플래그
    @text = text.dup
    # 커멘드
    if @command
      # 말미 요소가 "!cancel" 였던 경우
      if @text[-1] == "!cancel"
        @text.pop    # 말미 요소를 없앤다
        @cancel = true  # 캔슬 유효 플래그
      else
        @cancel = false
      end
      # 렬수를 설정
      if @text[0].is_a?(Integer) and @text[0] > 0
        col = @text[0]
        @text.shift  # 선두 요소를 삭제
      else
        col = 1
      end
      # 렬수의 조정
      col = @text.size if col > @text.size
      @cw = ww
      super(wx, wy, @cw, wh)
      @column_max = col # 렬수
      @disable = Array.new(@text.size) # 선택 불가 플래그의 배열
      @text.each_index {|i| @disable[i] = @text[i].gsub!(/^\[xX]|\[xX]$/, "") != nil}
      refresh_command(wh)
      self.index = 0
      @pause_show = false  # 포즈 싸인 표시 플래그
      self.visible = true
      @contents_showing = true  # 메세지 표시중 플래그
    # 메세지
    else
      super(wx, wy, ww, wh)
      self.contents = Bitmap.new(ww - 32, wh - 32)
      # "<NP>"(이)가 있으면 포즈 싸인을 비표시
      @pause_show = @text.gsub!(/<NP>/) { "" } == nil
      # "<IN>"(이)가 있으면 메세지를 순간 표시·순간 소거
      @fade_speed = @text.gsub!(/<IN>/) { "" } != nil ? 255 : 48
      # "<+>"(이)가 있으면, 직후의 개행을 무시한다
      @text.gsub!(/<+>n/) { "" }
      # "\mini[캐릭터 라인 or 엑터 번호]"가 있으면, 미니 윈도우를 표시
      @text.gsub!(/\mini[(.+)]/) { "" }
      mini_c = $1
      if mini_c != nil
        if mini_c.to_i > 0
        mini_c = $game_actors[mini_c.to_i].name
        end
        mini_window(mini_c, wx, wy)
      end
      # "\gra[파일명, 파일 번호]"가 있으면 그래픽을 표시
      @text.gsub!(/\gra[(.+),s*(d+)]/) { "" }
      if $1 != nil and $2 != nil
        window_graphic(GRA_DIR + $1, $2.to_i, wx, wy)
      else
        @graphic = false # 그래픽 표시 플래그
        @gw = 0
      end
      self.index = -1
      self.visible = false
      @contents_showing = false
    end
    self.z = 1000
    self.opacity = OPACITY
    self.back_opacity = BACK_OPACITY
    @fade_in = false
    @fade_out = false
    @next_page = false  # 개페이지 플래그
    @ww = ww
    @wh = wh
    update
  end
  #-----------------------------------------------------------------------------
  # ● 해방
  #-----------------------------------------------------------------------------
  def dispose
    return if self.disposed?
    self.pause = false
    # 윈두우와 메세지를 페이드아웃
    while(not @command and self.opacity > 0)
      Graphics.update
      self.contents_opacity -= 64
      self.opacity -= @fade_speed
      if @mini_win
        @mini_txt.opacity -= 64
        @mini_win.opacity -= @fade_speed
      end
      if @graphic
        @gr.opacity -= @fade_speed
      end
      self.opacity
    end
    @fade_out = false
    @contents_showing = false
    @next_page = false
    super()
    if @mini_win
      @mini_win.dispose
      @mini_txt.dispose
    end
    if @graphic
      @gr.dispose
      @grahic = false
    end
    if @command
      @command = false
      @cancel = false
    end
    $game_temp.message_window_showing = false
  end
  #-----------------------------------------------------------------------------
  # ● 리프레쉬 : 메세지 묘화 처리
  #-----------------------------------------------------------------------------
  def refresh
    self.contents.clear
    if Font.exist?(FONT.name)
      self.contents.font = FONT
    end
    self.contents.font.color = normal_color
    @graphic ? x = @gw : x = 0
    y = 0
    @text.gsub!(/\[Cc][([0-9]+)]/) { "01[#{$1}]" } # "\C[n]" => "01"
    @text.gsub!(/\[Ff]n/) { "02" }  # "\Fn" => "02"
    @text.gsub!(/\[Ff]/) { "02" }    # "\F" => "02"
    @text.gsub!(/\[Vv][(d+)]/){ ($game_variables[$1.to_i]).to_s }
    while ((c = @text.slice!(/./m)) != nil)
      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
      # n 의 경우 : 개행 처리
      if c == "n"
        @graphic ? x = @gw : x = 0
        y += FONT.size + LINE_SPACE
        next
      end
      w = self.contents.text_size(c).width
      h = self.contents.text_size(c).height
      # \F or 문장이 하단까지 왔을 경우 : 개페이지
      if c == "02" or y >= @wh - ( FONT.size + 32)
        x = y = 0
        text = c == "02" ? "" : c
        while ((c = @text.slice!(/./m)) != nil)
          text += c # 개페이지 후의 캐릭터 라인
        end
        @text = text
        @next_page = true # 개페이지 플래그
        break
      else
        self.contents.draw_text(4 + x, y , w, h, c)
      end
      x += w
      # 문장이 우단까지 오면(자) 강제적으로 개행
      if x >= @ww - (FONT.size + 28)
        y += FONT.size + LINE_SPACE
        x = @graphic ? @gw : 0
      end
    end    # while [END]
  end
  #-----------------------------------------------------------------------------
  # ● 프레임 갱신
  #-----------------------------------------------------------------------------
  def update
    loop do
      Graphics.update
      Input.update
      super
      # 용명
      if @fade_in
        self.contents_opacity += @fade_speed
        if @graphic
          @gr.opacity += @fade_speed
        end
        if @mini_win
          @mini_txt.opacity += @fade_speed
        end
        if self.contents_opacity == 255
          @fade_in = false
        end
        next
      end
      if @contents_showing    # 메세지 표시중의 경우
        if @pause_show == true
          self.pause = true    # 포즈 싸인을 표시
        end
        # B (캔슬)
        if Input.trigger?(Input::B)
          if @command    # 커멘드
            $game_system.se_play($data_system.cancel_se)
            if @cancel  # 캔슬의 경우 한층 더 분기
              $game_variables[RESULT] = @text.nitems  # 요소수+1을 대입
              break
            end
            next
          end
          break
        end
        # C (결정)
        if Input.trigger?(Input::C)
          if @command    # 커멘드
            # 선택 불가
            if @disable[self.index]
              $game_system.se_play($data_system.buzzer_se)
            else
              $game_system.se_play($data_system.decision_se)
              $game_variables[RESULT] = self.index  # 항목 번호를 대입[0~n]
              break
            end
          else
            break
          end
        end
        next
      end    # if @contents_showing [END]
      # 페이드아웃중이 아니고, 표시 대기 메세지가 있다
      if @fade_out == false and @text != nil and not @command
        @contents_showing = true    # 메세지 표시중
        $game_temp.message_window_showing = true
        refresh
        Graphics.frame_reset
        self.visible = true
        self.contents_opacity = 0
        @fade_in = true
        next
      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
        next
      end
    end    # loop do [END]
    # 개페이지
    if @next_page
      # 메세지만 페이드아웃
      while(self.contents_opacity > 0)
        Graphics.update
        self.contents_opacity -= @fade_speed
      end
      @fade_out = false
      @contents_showing = false
      @next_page = false  # 개페이지
      update
    end
    if @command    # 커멘드의 경우는 선택 후, 해방
      dispose
    end
  end
  #--------------------------------------------------------------------------
  # ● 커멘드 리프레쉬
  #--------------------------------------------------------------------------
  def refresh_command(ch)
    @item_max = @text.size
    self.contents = Bitmap.new(width - 32, height - 32)
    if Font.exist?(FONT.name)
      self.contents.font = FONT
    end
    for i in 0...@item_max
      self.contents.font.color = @disable[i] ? disabled_color : normal_color
      c = @text[i].dup
      c.gsub!(/\[Vv][(d+)]/){ ($game_variables[$1.to_i]).to_s }
      w = @cw / @column_max
      @ch = self.contents.text_size(c).height
      x = (i % @column_max) * w
      y = (i / @column_max) * (@ch + LINE_SPACE) + LINE_SPACE / 2
      self.contents.draw_text(x + 4, y, w, @ch, c, 0)
    end
  end
  #--------------------------------------------------------------------------
  # ● 커서의 구형 갱신
  #--------------------------------------------------------------------------
  def update_cursor_rect
    # 커서 위치가 0 미만의 경우
    if @index < 0
      self.cursor_rect.empty
      return
    end
    # 현재의 행을 취득
    row = @index / @column_max
    # 현재의 행이, 표시되고 있는 선두의 행보다 전의 경우
    if row < self.top_row
      # 현재의 행이 선두가 되도록(되듯이) 스크롤
      self.top_row = row
    end
    # 현재의 행이, 표시되고 있는 최후미의 행부터 뒤의 경우
    if row > self.top_row + (self.page_row_max - 1)
      # 현재의 행이 최후미가 되도록(되듯이) 스크롤
      self.top_row = row - (self.page_row_max - 1)
    end
    h = FONT.size + LINE_SPACE
    # 커서의 폭을 계산
    w = self.width / @column_max - h
    # 커서의 좌표를 계산
    x = @index % @column_max * (w + h)
    y = @index / @column_max * h - self.oy
    # 커서의 구형을 갱신
    self.cursor_rect.set(x, y, w, h)
  end
  #--------------------------------------------------------------------------
  # ● 미니 윈도우
  #--------------------------------------------------------------------------
  def mini_window(text, wx, wy)
    @text_mn = text
    @mini_txt = Sprite.new
    @mini_txt.z = 5000
    @mini_txt.bitmap = Bitmap.new(640, 480)
    b = @mini_txt.bitmap
    if Font.exist?(FONT.name)
      b.font = FONT
    end
    @cw = b.text_size(@text_mn).width
    @ch = b.text_size(@text_mn).height
    @cx = wx + 12
    @cy = wy - (@ch + 24) + 12
    b.clear
    b.draw_text(@cx, @cy, @cw, @ch, @text_mn, 0)
    @mini_txt.opacity = 0
    @mini_win = Window_Base.new(wx, wy, @cw + 24, @ch + 24)
    @mini_win.x = wx
    @mini_win.y = wy - (@ch + 24)
    @mini_win.z = 2000
    @mini_win.opacity = OPACITY
    @mini_win.back_opacity = BACK_OPACITY
  end
  #--------------------------------------------------------------------------
  # ● 그래픽
  #--------------------------------------------------------------------------
  def window_graphic(filename, number, wx, wy)
    @gr = Sprite.new
    @gr.bitmap = Bitmap.new(filename)
    @gw = @gr.bitmap.width
    gh = @gr.bitmap.height
    @gr.ox = 0
    @gr.oy = 0
    if (gnum = number - 1) >= 0  # 그래픽 번호(0-16)
      gx = (@gw / 4) * (gnum % 4)
      gy = (gh / 4) * (gnum / 4)
      @gw = @gw / 4
      gh = gh / 4
      @gr.src_rect.set(gx, gy, @gw, gh)  # 파일을 16 분할(4*4)해 표시
    else
      @gr.src_rect.set(0, 0, @gw, gh)  # 파일을 그대로 표시
    end
    @gr.x = wx + 16
    @gr.y = wy + 16
    @gr.z = 3000
    @gr.opacity = 0
    @graphic = true # 그래픽 표시 플래그
  end
end


스크립트가 표시되면(자),[Ctrl]+A,[Ctrl]+C로 전체를 카피합니다.
트크르 XP의 스크립트 편집자를 열어, 「Window_Selectable」보다 아래에서 오른쪽 클릭 메뉴 「삽입」,
새롭게 할 수 있던 섹션에 본체를 붙여 주세요.


사용예
────────────────────────────────────────────────
실행은 이벤트 커멘드 「스크립트」로 실시합니다.
이벤트가 정상적으로 실행되도록, 「스크립트」의 전후에는 「웨이트」(1 프레임)을 두는 것을 추천합니다.


■ 메세지 윈도우를 표시
┌────────────────────────┐
│w = Free_Window.new("abcde...", 80, 50, 304, 100) │
│w.dispose                   │
└────────────────────────┘

인수는 왼쪽으로부터 표시하는 캐릭터 라인, 윈도우 위치 x, 윈도우 위치 y, 윈도우폭, 윈도우 높이입니다.


────────────────────────────────────────────────

■ 복수의 메세지 윈도우를 표시
┌─────────────────────┐
│s = "메세지n메세지"           │
│w1 = Free_Window.new(s, 80, 50, 304, 120)  │
│s =                     │
│"메세지                   │
│메세지"                   │
│w2 = Free_Window.new(s, 80, 250, 304, 120) │
│w1.dispose                 │
│w2.dispose                 │
└─────────────────────┘

이 예에서는 캐릭터 라인을 한 번 로컬 변수 s에 격납해, 그것을 참조시키고 있습니다.
n는 개행을 나타내기 때문에, 결과적으로 어느 쪽의 윈도우도 같은 내용이 표시됩니다.


────────────────────────────────────────────────

(이하, 오브젝트 생성 등 같은 기술은 생략 합니다)
■ 좌상에 작은 윈도우를 표시

┌───────────┐
│"\mini[아르시스]「?"│
└───────────┘

제어 문자 \mini[s]는 캐릭터 라인 s를 미니 윈도우에 표시합니다.

┌────────┐
│"\mini[1]「···."│
└────────┘

숫자로 지정하면(자) 그 번호의 엑터명을 표시합니다.



───────────────────────────────────────────────

■ 윈도우에 그래픽 표시
┌──────────────────┐
│"\gra[Battlers/001-Fighter01, 0]「!" │
└──────────────────┘

제어 문자 \gra[filename, number]는, 지정한 그래픽 파일(filename)을 표시합니다.
또, , (반각 칸마)그리고 단락지어 표시 방법을 번호로 지정할 수 있습니다.
0 때, 지정한 화상을 그대로 표시합니다.
1~16 때, 화상을 세로 4 분할, 옆 4 분할했을 때에 할당해지는 번호에 일치하는 그래픽을 표시합니다.



────────────────────────────────────────────────

■ 커멘드 윈도우를 표시
┌──────────────────┐
│s = ["선택 1", "선택 2", "선택 3"]    │
│Free_Window.new(s, 80, 50, 150, 200) │
└──────────────────┘

제일 인수를 배열로 하면(자), 커멘드 윈도우가 됩니다.
커멘드 윈도우는 dispose를 호출할 필요는 없습니다.
선택한 결과는 소스내에서 지정한 번호의 변수에 대입됩니다.
이 예에서는 「선택 1」 때 0, 「선택 2」 때 1, 「선택 3」 때 2가 변수에 대입됩니다.

┌──────────────────┐
│["선택 1", "선택 2", "선택 3", "!cancel"] │
└──────────────────┘

배열의 말미의 요소를"!cancel"로 하면(자), 캔슬 버튼을 눌렀을 때에, 지정한 변수에 요소의 수가 대입됩니다.(이 예에서는 변수에 3을 대입)

┌─────────────────┐
│[3, "A1", "A2", "A3", "B1", "B2", "B3"]  │
└─────────────────┘

배열의 최초의 요소를 정수로 하면(자), 열을 복수로 할 수 있습니다. 이 예의 경우, 다음과 같은 및 됩니다.

A1  A2  A3
B1  B2  B3

┌────────────────────────────────┐
│["\x아르시스", "그로리아 \x", "히르다"]  #=> 히르다만 선택 가능 │
└────────────────────────────────┘

항목이 되는 캐릭터 라인의 최초인가 마지막에 「\x」인가 「\X」를 넣으면(자), 그 항목은 선택 불가(회색 표시/버저 SE)가 됩니다. 다만, 모든 항목을 선택 불가로 하면(자) 게임이 진행되지 않게 될테니 주의해 주세요.
「\x」는 바트(×)이니까 선택할 수 없다, 라고 기억합시다.

Who's 백호

?

이상혁입니다.

http://elab.kr

Comment '6'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6203
214 기타 스크립트 자료 3 file 백호 2009.02.22 905
213 기타 좌표 스크립트 2 백호 2009.02.21 908
212 기타 지정범위안에 들어오면 특정한 움직임을 취한다!! 1 백호 2009.02.21 920
211 기타 KGC 디버거 (최신 올라온 것에 비해 성능은 딸리지만) file 백호 2009.02.22 929
210 기타 Economy System by Nick@Creation Asylum 1 file 백호 2009.02.22 934
209 기타 Text Scroll by Dubealex (Release 3) 2 file 백호 2009.02.22 940
208 기타 ATS-Advanced Time System 1 file 백호 2009.02.21 964
207 기타 [All RGSS] File-Ex file Cheapmunk 2014.12.29 964
206 기타 Tetris Attack by trickster 1 file 백호 2009.02.22 986
205 기타 필드에서 마력을 출력합니다. 백호 2009.02.22 989
204 기타 스크롤되는 파노라마(Autoscrolling Panorama) by RPG Advocate 백호 2009.02.22 993
203 기타 특수효과 ElseEX 스크립트 file 백호 2009.02.21 995
202 기타 Free Window Demo 1 file 백호 2009.02.22 1002
201 기타 프레임 적용 스크립트 1 file 백호 2009.02.21 1007
200 기타 분류 별로 윈도우 스킨 다르게 사용하기 file 백호 2009.02.21 1015
199 기타 강제 종료시키기 1 file 백호 2009.02.22 1015
198 기타 제련시스템 수정본입니다. 3 file 백호 2009.02.21 1021
197 기타 능력치 무한대 스크립트 (따로 넣을필요없음) 2 백호 2009.02.21 1027
196 기타 Random Character Generator by SephirothSpawn (SDK호환) 1 백호 2009.02.22 1041
195 기타 기본설정 강화ㄴ 1 백호 2009.02.21 1047
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 Next
/ 13