VX 스크립트

#==============================================================================
 # ■ Window_NameEdit
 #------------------------------------------------------------------------------
 # 이름 입력 화면에서, 이름을 편집하는 윈도우입니다.

 # 아방스 헤르코스 님의 스크립트를 개변한 자료입니다.

 # 이에 사용시 크레딧에 헤르코스님의 이름을 우선 적으로 기재 해주세요

 # 사용법은 같습니다.
 #==============================================================================

 class Window_NameEdit < Window_Base
   #---------------------------------------------------------------------------
   # ● 정수 
   CONSO = ["ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄸ","ㄹ","ㄺ","ㄻ","ㄼ","ㄽ","ㄾ","ㄿ","ㅀ","ㅁ","ㅂ","ㅃ","ㅄ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]
   HEAD = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]
   TABLE = ["ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄹ","ㄺ","ㄻ","ㄼ","ㄽ","ㄾ","ㄿ","ㅀ","ㅁ","ㅂ","ㅄ","ㅅ","ㅆ","ㅇ","ㅈ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]
   TABLE_SIDE = ["ㄱ","ㄴ","ㄹ","ㅂ"]
   ANOTHER_TABLE_SIDE = [[nil,"ㅅ"],["ㅈ","ㅎ"],["ㄱ","ㅁ","ㅂ","ㅅ","ㅌ","ㅍ","ㅎ"],[nil,"ㅅ"]]
   VOWEL = ["ㅏ","ㅐ","ㅑ","ㅒ","ㅓ","ㅔ","ㅕ","ㅖ","ㅗ","ㅘ","ㅙ","ㅚ","ㅛ","ㅜ","ㅝ","ㅞ","ㅟ","ㅠ","ㅡ","ㅢ","ㅣ"]
   COM_VOWEL = ["ㅗ","ㅜ","ㅡ"]
   ANOTHER_COM_VOWEL = [["ㅏ","ㅐ","ㅣ"],["ㅓ","ㅔ","ㅣ"],["ㅣ"]]
   #--------------------------------------------------------------------------
   # ● 공개 인스턴스 변수
   #--------------------------------------------------------------------------
   attr_reader   :name                     # 이름
   attr_reader   :prompt                     # 프롬프트
   attr_reader   :index                     # 커서 위치
   attr_reader   :max_char               # 최대 문자수
   #--------------------------------------------------------------------------
   # ● 오브젝트 초기화
   #     actor    : 액터
   #     max_char : 최대 문자수
   #--------------------------------------------------------------------------
   def initialize(actor, max_char)
     super(88, 84, 368, 128)
     @actor = actor
     @prompt = []
     @max_char = max_char
     name_array = actor.name.split(//)[0...@max_char]   # 최대 문자수에 거둔다
     @name = []
     @default_name = []
     for i in 0...name_array.size
       @name << name_array[i]
       @default_name << name_array[i]
     end
     self.active = false
     refresh
   end
   #--------------------------------------------------------------------------
   # ● 디폴트의 이름에 되돌린다
   #--------------------------------------------------------------------------
   def restore_default
     @name = @default_name.dup
     @prompt = []   
     refresh
   end
   #--------------------------------------------------------------------------
   # ● 문자의 추가
   #     character : 추가하는 문자
   #--------------------------------------------------------------------------
   def add(character)
     @prompt << character
     refresh
   end
   #--------------------------------------------------------------------------
   # ● 문자의 삭제
   #--------------------------------------------------------------------------
   def back
     @prompt == [] ? @name.pop : @prompt.pop
     refresh
   end
   #--------------------------------------------------------------------------
   # ● 항목을 묘화 하는 구형의 취득
   #     index : 항목 번호
   #--------------------------------------------------------------------------
   def item_rect(index)
     rect = Rect.new(0, 0, 0, 0)
     rect.x = (@max_char + 1) * 12 + index * 24
     rect.y = 36
     rect.width = 24
     rect.height = WLH
     return rect
   end
   #--------------------------------------------------------------------------
   # ● 리프레쉬
   #--------------------------------------------------------------------------
   def refresh
     self.contents.clear
     draw_actor_face(@actor, 0, 0)
     name = prompt_to_letter
     if @name.size == @max_char
           @prompt = []
           name = ""
           @index = @name.size - 1
     else
           @index = @name.size
     end
     for i in 0...@name.size
       self.contents.draw_text(item_rect(i), @name[i], 1)
     end
     self.contents.draw_text(item_rect(@name.size), name, 1)
     update_cursor
   end
   #--------------------------------------------------------------------------
   # ● 커서의 갱신
   #--------------------------------------------------------------------------
   def update_cursor
     self.cursor_rect = item_rect(@index)
   end
   #--------------------------------------------------------------------------
   # ● 프레임 갱신
   #--------------------------------------------------------------------------
   def update
     super
     update_cursor
   end
  
 #==============================================================================
 # ■ prompt_to_letter, 1st~5th phase, where?(array = from, c = what)
 #------------------------------------------------------------------------------
 # 이 이하는 글자를 조합하는 내용입니다.
 # 다른 부분은 관계없지만, 이 이하의 부분은 수정하지 않길 권장합니다.
 # 일부 폰트에서 특정 문자가 표현되지 않습니다. (삃,쮃 등등..)
 #
 # 2009. 3. 18 by Heircoss
 #==============================================================================
   def prompt_to_letter
     size = @prompt.size
     case size
     when 0
           return ""
     when 1
           return @prompt[0]
     when 2
           first_phase
     when 3
           second_phase
     when 4
           third_phase
     when 5
           fourth_phase
     when 6
           fifth_phase
     end
   end
   def first_phase
     if CONSO.include?(@prompt[0])
           if CONSO.include?(@prompt[1])
                 c0, c1 = conso_plus_conso
           else
                 return conso_plus_vowel
           end
     else
           c0, c1 = vowel_plus_vowel
     end
     if c1 == nil
           return c0
     else
           @name << @prompt.shift
     end                   
     return @prompt[0]
   end
   def second_phase
     if CONSO.include?(@prompt[0])
           if CONSO.include?(@prompt[1])
                 if CONSO.include?(@prompt[2])
                       @name << conso_plus_conso(@prompt.shift, @prompt.shift)
                 else
                       @name << @prompt.shift
                       return conso_plus_vowel
                 end
           else
                 if TABLE.include?(@prompt[2])
                       return conso_plus_vowel_plus_table
                 else
                       c0, c1 = vowel_plus_vowel(@prompt[1], @prompt[2])
                       if c1 == nil
                             return conso_plus_vowel(@prompt[0],c0)
                       else
                             @name << conso_plus_vowel(@prompt.shift, @prompt.shift)
                       end 
                 end
           end
     else
           @name << vowel_plus_vowel(@prompt.shift, @prompt.shift)
     end
     return @prompt[0]
   end
   def third_phase
     if CONSO.include?(@prompt[2])
           if CONSO.include?(@prompt[3])
                 c0, c1 = conso_plus_conso(@prompt[2], @prompt[3])
                 if c1 == nil
                       conso, vowel, table = @prompt[0],@prompt[1],c0
                       return conso_plus_vowel_plus_table(conso, vowel, table)
                 else
                       conso, vowel, table = @prompt.shift, @prompt.shift, @prompt.shift
                       @name << conso_plus_vowel_plus_table(conso, vowel, table)
                 end           
           else
                 conso, vowel = @prompt.shift, @prompt.shift
                 @name << conso_plus_vowel(conso, vowel)
                 return  conso_plus_vowel
           end
     else
           if TABLE.include?(@prompt[3])
                 conso = @prompt[0]
                 vowel = vowel_plus_vowel(@prompt[1], @prompt[2])
                 table = @prompt[3]
                 return conso_plus_vowel_plus_table(conso, vowel, table)
           else
                 conso = @prompt.shift
                 vowel = vowel_plus_vowel(@prompt.shift, @prompt.shift)
                 @name << conso_plus_vowel(conso, vowel)
           end
     end
     return @prompt[0]
   end
   def fourth_phase
     if CONSO.include?(@prompt[4])
           if CONSO.include?(@prompt[2])
                 conso = @prompt.shift
                 vowel = @prompt.shift
                 table = conso_plus_conso(@prompt.shift,@prompt.shift)
                 @name << conso_plus_vowel_plus_table(conso, vowel, table)
           else
                 c0, c1 = conso_plus_conso(@prompt[3], @prompt[4])
                 if c1 == nil
                       conso = @prompt[0]
                       vowel = vowel_plus_vowel(@prompt[1], @prompt[2])
                       table =  c0
                       return conso_plus_vowel_plus_table(conso, vowel, table)
                 else
                       conso = @prompt.shift
                       vowel = vowel_plus_vowel(@prompt.shift, @prompt.shift)
                       table = @prompt.shift
                       @name << conso_plus_vowel_plus_table(conso, vowel, table)
                 end
           end
     else
           @name << second_phase
           @prompt = @prompt[3..4]
           return first_phase
     end
     return @prompt[0]   
   end
   def fifth_phase
     if CONSO.include?(@prompt[5])
       conso = @prompt.shift
       vowel = vowel_plus_vowel(@prompt.shift, @prompt.shift)
       table = conso_plus_conso(@prompt.shift, @prompt.shift)
       @name << conso_plus_vowel_plus_table(conso, vowel, table)
     else
       @name << third_phase
       @prompt = @prompt[4..5]
       return first_phase
     end
     return @prompt[0]
   end
   def conso_plus_conso(c0 = @prompt[0], c1 = @prompt[1])
     index0 = where?(TABLE_SIDE,c0)
     if index0 != nil
           index1 = where?(ANOTHER_TABLE_SIDE[index0],c1)
           if index1 != nil
                 index0 = where?(CONSO, c0)
                 return CONSO[index0 + index1 + 1]
           end
     end
     return c0, c1
   end
   def vowel_plus_vowel(c0 = @prompt[0], c1 = @prompt[1])
     index0 = where?(COM_VOWEL,c0)
     if index0 != nil
           index1 = where?(ANOTHER_COM_VOWEL[index0],c1)
           if index1 != nil
                 index0 = where?(VOWEL, c0)
                 return VOWEL[index0 + index1 + 1]
           end
     end
     return c0, c1                  
   end                   
   def conso_plus_vowel(c0 = @prompt[0], c1 = @prompt[1])
     index0 = where?(HEAD,c0)
     index1 = where?(VOWEL,c1)                         
     return [44032 + (588 * index0) + (28 * index1)].pack('U*')
   end
   def conso_plus_vowel_plus_table(c0 = @prompt[0], c1 = @prompt[1], c2 = @prompt[2])
     index0 = where?(HEAD,c0)
     index1 = where?(VOWEL,c1)
     index2 = where?(TABLE,c2)
     return [44032 + (588 * index0) + (28 * index1) + index2 + 1].pack('U*')
   end
   def where?(array, c)
     if array.class != Array && array == c
           return 0
     else
           array.each_with_index do |item, index|
                 return index if item == c
           end
     end
     return nil
   end             
 end
 #==============================================================================
 # ■ 여기까지
 #==============================================================================

 #==============================================================================
 # ■ Window_NameInput
 #------------------------------------------------------------------------------
 # 이름 입력 화면에서, 문자를 선택하는 윈도우입니다.
 #==============================================================================

 class Window_NameInput < Window_Base
   #--------------------------------------------------------------------------
   # ● 문자표
   # 이하 TABLE의 순서를 바꾸는 것은 스크립트의 실행에 큰 영향을 주지 않습니다.
   # 다만 영어나 숫자, 기타 기호등을 집어넣을 경우는 기본적으로는 실행이 되겠지만,
   # 혹시나 버그등이 발생할 수도 있습니다.
   # 물론 입력할 문자등을 늘리는 이유로 칸이 부족해 창의 크기를 늘려야 한다면,
   # 창의 x, y ,width, height 값을 적당히 조절하시고,
   # VER_LINE, HOR_LINE, CONFIRM 또한 맞게 수정하셔야 합니다.
   #--------------------------------------------------------------------------
   KOREAN = [ 'ㅃ','ㅉ','ㄸ','ㄲ','ㅆ','ㅚ','ㅞ','ㅙ','ㅒ','ㅖ',
                   'ㅂ','ㅈ','ㄷ','ㄱ','ㅅ','ㅛ','ㅕ','ㅑ','ㅐ','ㅔ',
                   'ㅁ','ㄴ','ㅇ','ㄹ','ㅎ','ㅗ','ㅓ','ㅏ','ㅣ','ㅢ',
                   'ㅋ','ㅌ','ㅊ','ㅍ','한/영','ㅠ','ㅜ','ㅡ','ㅟ','Enter']
   ENGLISH = [ '~','!','`','#','$','&','(' , ')','?',',',
                   'Q','W','E','R','T','Y','U','I','O','P',
                   'A','S','D','F','G','H','J','K','L','-',
                   'Z','X','C','V','K/E','B','N','M','.','Enter']
   TABLE = [KOREAN,ENGLISH]
   VER_LINE = 4 #수직방향의 갯수
   HOR_LINE = 10 #수평방향의 갯수
   CONFIRM = 39 #결정 키 의 위치
   MODCHAN = 34
   #--------------------------------------------------------------------------
   # ● 오브젝트 초기화
   #--------------------------------------------------------------------------
   def initialize(mode = 0)
     super(88, 212, 368, 128)
     @index = 0
         @mode = mode
     refresh
     update_cursor
   end
   #--------------------------------------------------------------------------
   # ● 문자의 취득
   #--------------------------------------------------------------------------
  def character
    if @index == MODCHAN
      return ""
    elsif @index == CONFIRM
      return ""
    else
      return TABLE[@mode][@index]
    end
  end
    #--------------------------------------------------------------------------
  # ● 커서 위치 모드 변환 판정 (히라가나/카타카나)
  #--------------------------------------------------------------------------
  def is_mode_change
    return (@index == MODCHAN)
  end
   #--------------------------------------------------------------------------
   # ● 커서 위치 결정 판정
   #--------------------------------------------------------------------------
   def is_decision
     return (@index == CONFIRM)
   end
   #--------------------------------------------------------------------------
   # ● 항목을 묘화 하는 구형의 취득
   #     index : 항목 번호
   #--------------------------------------------------------------------------
   def item_rect(index)
     rect = Rect.new(0, 0, 0, 0)
     rect.x = index % 10 * 32 + index % 10 / 5 * 16
     rect.y = index / 10 * WLH
     rect.width = 32
     rect.height = WLH
     return rect
   end
   #--------------------------------------------------------------------------
   # ● 리프레쉬
   #--------------------------------------------------------------------------
   def refresh
     self.contents.clear
     for i in 0...TABLE[@mode].size
       rect = item_rect(i)
       rect.x += 2
       rect.width -= 4
        self.contents.draw_text(rect, TABLE[@mode][i], 1)
     end
   end
   #--------------------------------------------------------------------------
   # ● 커서의 갱신
   #--------------------------------------------------------------------------
   def update_cursor
     self.cursor_rect = item_rect(@index)
   end
   #--------------------------------------------------------------------------
   # ● 커서를 아래에 이동
   #     wrap : rack-around 허가
   #--------------------------------------------------------------------------
   def cursor_down(wrap)
     if @index < VER_LINE * HOR_LINE - HOR_LINE
       @index += HOR_LINE
     elsif wrap
       @index -= VER_LINE * HOR_LINE - HOR_LINE
     end
   end
   #--------------------------------------------------------------------------
   # ● 커서를 위에 이동
   #     wrap : rack-around 허가
   #--------------------------------------------------------------------------
   def cursor_up(wrap)
     if @index >= HOR_LINE
       @index -= HOR_LINE
     elsif wrap
       @index += VER_LINE * HOR_LINE - HOR_LINE
     end
   end
   #--------------------------------------------------------------------------
   # ● 커서를 오른쪽으로 이동
   #     wrap : rack-around 허가
   #--------------------------------------------------------------------------
   def cursor_right(wrap)
     if @index % HOR_LINE < (HOR_LINE - 1)
       @index += 1
     elsif wrap
       @index -= (HOR_LINE - 1)
     end
   end
   #--------------------------------------------------------------------------
   # ● 커서를 왼쪽으로 이동
   #     wrap : rack-around 허가
   #--------------------------------------------------------------------------
   def cursor_left(wrap)
     if @index % HOR_LINE > 0
       @index -= 1
     elsif wrap
       @index += (HOR_LINE - 1)
     end
   end
   #--------------------------------------------------------------------------
   # ● 커서를 결정에 이동
   #--------------------------------------------------------------------------
   def cursor_to_decision
     @index = CONFIRM
   end
     #--------------------------------------------------------------------------
  # ● 다음의 페이지로 이동
  #--------------------------------------------------------------------------
  def cursor_pagedown
    @mode = (@mode + 1) % TABLE.size
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 전의 페이지로 이동
  #--------------------------------------------------------------------------
  def cursor_pageup
    @mode = (@mode + TABLE.size - 1) % TABLE.size
    refresh
  end
   #--------------------------------------------------------------------------
   # ● 프레임 갱신
   #--------------------------------------------------------------------------
   def update
     super
     last_mode = @mode
     last_index = @index
     if Input.repeat?(Input::DOWN)
       cursor_down(Input.trigger?(Input::DOWN))
     end
     if Input.repeat?(Input::UP)
       cursor_up(Input.trigger?(Input::UP))
     end
     if Input.repeat?(Input::RIGHT)
       cursor_right(Input.trigger?(Input::RIGHT))
     end
     if Input.repeat?(Input::LEFT)
       cursor_left(Input.trigger?(Input::LEFT))
     end
     if Input.trigger?(Input::A)
       cursor_to_decision
     end
     if @index != last_index
       Sound.play_cursor
     end
         if Input.trigger?(Input::R)
      cursor_pagedown
    end
    if Input.trigger?(Input::L)
      cursor_pageup
    end
        if Input.trigger?(Input::C) and is_mode_change
      cursor_pagedown
    end
     update_cursor
   end
 end

 #==============================================================================
 # ■ Scene_Name
 #------------------------------------------------------------------------------
 # 이름 입력 화면의 처리를 실시하는 클래스입니다.
 #==============================================================================

 class Scene_Name < Scene_Base
   #--------------------------------------------------------------------------
   # ● 개시 처리
   #--------------------------------------------------------------------------
   def start
     super
     create_menu_background
     @actor = $game_actors[$game_temp.name_actor_id]
     @edit_window = Window_NameEdit.new(@actor, $game_temp.name_max_char)
     @input_window = Window_NameInput.new
   end
   #--------------------------------------------------------------------------
   # ● 종료 처리
   #--------------------------------------------------------------------------
   def terminate
     super
     dispose_menu_background
     @edit_window.dispose
     @input_window.dispose
   end
   #--------------------------------------------------------------------------
   # ● 원래의 화면에 돌아온다
   #--------------------------------------------------------------------------
   def return_scene
     $scene = Scene_Map.new
   end
   #--------------------------------------------------------------------------
   # ● 프레임 갱신
   #--------------------------------------------------------------------------
   def update
     super
     update_menu_background
     @edit_window.update
     @input_window.update
     if Input.repeat?(Input::B)
       if @edit_window.name == [] && @edit_window.prompt == []
         Sound.play_buzzer
       else
         Sound.play_cancel
         @edit_window.back       
       end
     elsif Input.trigger?(Input::C)
       if @input_window.is_decision          # 커서 위치가 [결정] 의 경우
         if @edit_window.name.size == 0 && @edit_window.prompt.size == 0        # 이름이 비어있는 경우
           @edit_window.restore_default      # 디폴트 이름으로 되돌린다
           if @edit_window.name.size == 0 && @edit_window.prompt.size == 0
             Sound.play_buzzer
           else
             Sound.play_decision
           end
         else
           Sound.play_decision
           name = @edit_window.prompt_to_letter
           name = @edit_window.name.to_s + name
           @actor.name = name   # 액터의 이름을 변경
           return_scene
         end
       elsif @input_window.character != ""   # 문자가 비어있지 않은 경우
         if @edit_window.name.size > @edit_window.max_char
           Sound.play_buzzer
         else
           Sound.play_decision
           @edit_window.add(@input_window.character)       # 문자를 추가     
          
         end
       end
     end
   end
 end

Comment '3'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 3 습작 2012.12.24 4624
640 아이템 현재있는 파티원 선택 레벨업 아이템 만들기 1 file 싸패 2016.06.06 371
639 저장 세이브 파일 개수 16개로 늘리기 (기본 세이브 엔진용) 1 file 家和萬事成 2015.09.07 476
638 스킬 [RPG VX] 턴알 스킬 쿨타임 스크립트! (잘돌아감) 4 듀란테 2015.08.18 748
637 메뉴 KGC - 커스텀 메뉴 커멘드 (번역) 1 듀란테 2015.07.27 679
636 메뉴 Etude87's Menu Editor for VX 24 습작 2015.01.14 894
635 기타 Gamepad Extender VX 습작 2015.01.02 402
634 버그픽스 DerVVulfman's Tileset Reader VX Bug Fix 습작 2014.11.16 494
633 장비 방어구 착용시 최대HP, MP증가 스크립트(턴알) 1 file 기관차 2014.11.06 897
» 이름입력 헤르코스님의 한글 이름 입력 영어 및 숫자 입력 가능 개변 자료 3 리로르드 2014.10.06 994
631 메뉴 Etude87_Ace_Style_Formation_Change ver.1.01 습작 2014.10.05 522
630 키입력 해외 제작자 He Who Jets님의 마우스 스크립트(mouse system) 1 file 보자기군 2014.09.30 946
629 메시지 Etude87 Dialogue History Scene file 습작 2014.07.07 805
628 메뉴 MOG - Scroll Bar for VX file 습작 2014.07.06 869
627 이동 및 탈것 이동 기능 파워업 (장애물 등을 피하는 이동방식) 8 file 파노 2014.04.27 1410
626 타이틀/게임오버 Title Skip System : 타이틀 스킵 file 허걱 2014.03.19 1217
625 버그픽스 Graphical Object Global Reference VX by Mithran Alkaid 2014.03.03 792
624 기타 장애물을 피하고 다가오게 하는 스크립트 4 file 박력남 2014.02.25 1577
623 버그픽스 애니메이션 표시 위치 수정 (Fix Animation Position) 2 file AltusZeon 2014.02.12 1006
622 타이틀/게임오버 VX로 변환된 랜덤 타이틀 스크립트에 랜덤 타이틀 BGM, 랜덤 게임오버 추가 1 베르세모스 2013.12.22 1090
621 전투 [RPG VX]기술에 쿨타임을 부여하는 스크립트 3 스리아씨 2013.12.05 2023
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 32 Next
/ 32