테스트용으로 예전에 해 본 것입니다. 손댄 것이라고는 해도 문자셋 추가 정도입니다. 한글 문자셋은 조합입력 루틴이 없는 더미로, 그냥 이런 식으로 문자셋 추가가 가능함을 보여주는 예시입니다.(물론 마음같아서는 모 씨의 한글이름 입력기의 조합입력 부분을 도입하고 싶지만 실력이 안 되어서...) 원본이 어떻게 작동하는 지 궁금하다면 http://avangs.info/255902에 첨부되어 있는 데모를 받아서 실행시켜 보기 바랍니다.
# Advanced Enter Hero Name Window # by RPG Advocate #============================================================================== # ** Window_NameEdit #------------------------------------------------------------------------------ # This window is used to edit your name on the input name screen. #============================================================================== class Window_NameEdit < Window_Base #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_accessor :char_type # character type #-------------------------------------------------------------------------- # * Object Initialization # actor : actor # max_char : maximum number of characters #-------------------------------------------------------------------------- def initialize(actor, max_char) super(0, 0, 640, 128) self.contents = Bitmap.new(width - 32, height - 32) @actor = actor @name = actor.name @max_char = max_char @char_type = [] # Fit name within maximum number of characters name_array = @name.split(//)[0...@max_char] @name = "" for i in 0...name_array.size @name += name_array[i] @char_type[i] = 1 end @default_name = @name @index = name_array.size refresh update_cursor_rect end #-------------------------------------------------------------------------- # * Return to Default Name #-------------------------------------------------------------------------- def restore_default @name = @default_name for i in 0..@default_name.size @char_type[i] = 1 end @index = @name.split(//).size refresh update_cursor_rect end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh self.contents.clear # Draw name name_array = @name.split(//) for i in 0...@max_char c = name_array[i] if c == nil c = "_" end x = 320 - @max_char * 14 + i * 28 if @char_type[i] == 1 or @char_type[i] == 5 self.contents.font.name = "Arial" self.contents.font.size = 24 elsif @char_type[i] == 2 or @char_type[i] == 3 self.contents.font.name = ["MS Pゴシック",'MS PGothic'] self.contents.font.size = 22 else self.contents.font.name = ["굴림",'Gulim'] self.contents.font.size = 22 end self.contents.draw_text(x, 32, 28, 32, c, 1) end # Draw graphic draw_actor_graphic(@actor, 320 - @max_char * 14 - 40, 80) end end #============================================================================== # ** Window_NameInput #------------------------------------------------------------------------------ # This window is used to select text characters on the input name screen. #============================================================================== class Window_NameInput < Window_Base #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_accessor :mode #-------------------------------------------------------------------------- # * CONSTANTS #-------------------------------------------------------------------------- ENGLISH_TABLE = [ "A","B","C","D","E", "F","G","H","I","J", "K","L","M","N","O", "P","Q","R","S","T", "U","V","W","X","Y", "Z","","IJ","Ç","Ñ", "0","1","2","3","4", "5", "6" ,"7", "8" ,"9", "","","","","", "a", "b" ,"c", "d" ,"e", "f","g","h","i","j", "k","l","m","n","o", "p","q","r","s","t", "u","v","w","x","y", "z","","ij","ç","ñ", ".",",","?","!","/", "\\","<",">",";",":", "","", "" , "" , "" , "@","#","$","%","^", "&","*","(",")","", "[","]","'","\"","~", "","","","","", "","","","","", "","","","","", "","","","","", "", "" ,"", "" ,"", "","","","","", ] HIRAGANA_TABLE = [ "あ","い","う","え","お", "か","き","く","け","こ", "さ","し","す","せ","そ", "た","ち","つ","て","と", "な","に","ぬ","ね","の", "は","ひ","ふ","へ","ほ", "ま","み","む","め","も", "や", "" ,"ゆ", "" ,"よ", "ら","り","る","れ","ろ", "わ", "" ,"を", "" ,"ん", "が","ぎ","ぐ","げ","ご", "ざ","じ","ず","ぜ","ぞ", "だ","ぢ","づ","で","ど", "ば","び","ぶ","べ","ぼ", "ぱ","ぴ","ぷ","ぺ","ぽ", "ゃ","ゅ","ょ","っ","ゎ", "ぁ","ぃ","ぅ","ぇ","ぉ", "ー","・", "" , "" , "" , "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", ] KATAKANA_TABLE = [ "ア","イ","ウ","エ","オ", "カ","キ","ク","ケ","コ", "サ","シ","ス","セ","ソ", "タ","チ","ツ","テ","ト", "ナ","ニ","ヌ","ネ","ノ", "ハ","ヒ","フ","ヘ","ホ", "マ","ミ","ム","メ","モ", "ヤ", "" ,"ユ", "" ,"ヨ", "ラ","リ","ル","レ","ロ", "ワ", "" ,"ヲ", "" ,"ン", "ガ","ギ","グ","ゲ","ゴ", "ザ","ジ","ズ","ゼ","ゾ", "ダ","ヂ","ヅ","デ","ド", "バ","ビ","ブ","ベ","ボ", "パ","ピ","プ","ペ","ポ", "ャ","ュ","ョ","ッ","ヮ", "ァ","ィ","ゥ","ェ","ォ", "ー","・","ヴ", "" , "" , "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", ] HANGUL_TABLE = [ "ㄱ","ㄴ","ㄷ","ㄹ","ㅁ", "ㅂ","ㅅ","ㅇ","ㅈ","ㅊ", "ㅋ","ㅌ","ㅍ","ㅎ","", "ㄲ","ㄸ","ㅃ","ㅆ","ㅉ", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "ㅏ","ㅑ","ㅓ","ㅕ","ㅗ", "ㅛ", "ㅜ" ,"ㅠ", "ㅡ" ,"ㅣ", "ㅐ","ㅔ","ㅒ","ㅖ","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", "","","","","", ] ETC_LATIN_LETTER_TABLE= #May require Unicode typeset [ 'À','È','Ì','Ò','Ù', 'Á','É','Í','Ó','Ú', 'Â','Ê','Î','Ô','Û', 'Ä','Ë','Ï','Ö','Ü', 'Ā','Ē','Ī','Ō','Ū', 'Ă','Ĕ','Ĭ','Ŏ','Ŭ', 'Ǎ','Ě','Ǐ','Ǒ','Ǔ', 'Ã','Ẽ','Ĩ','Õ','Ũ', "","","","","", 'à','è','ì','ò','ù', 'á','é','í','ó','ú', 'â','ê','î','ô','û', 'ä','ë','ï','ö','ü', 'ā','ē','ī','ō','ū', 'ă','ĕ','ĭ','ŏ','ŭ', 'ǎ','ě','ǐ','ǒ','ǔ', 'ã','ẽ','ĩ','õ','ũ', "","","","","", 'Å','Æ','Œ','Ø','Ÿ', 'å','æ','œ','ø','ÿ', 'Ő','Ű','Č','Ð','Đ', 'ő','ű','č','ð','đ', "Ş","Ł","Ř","Š","Ž", "ş","ł","ř","š","ž", "","","","","", "","","","","", "","","","","¿", ] #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize super(160, 128, 480, 352) self.contents = Bitmap.new(width - 32, height - 32) self.active = false @index = -1 @mode = 1 refresh update_cursor_rect end #-------------------------------------------------------------------------- # * Set Cursor Position # index : new cursor position #-------------------------------------------------------------------------- def index=(value) @index = value update_cursor_rect end #-------------------------------------------------------------------------- # * Set Character Type #-------------------------------------------------------------------------- def character if @mode == 1 return ENGLISH_TABLE[@index] elsif @mode == 2 return HIRAGANA_TABLE[@index] elsif @mode == 3 return KATAKANA_TABLE[@index] elsif @mode == 4 return HANGUL_TABLE[@index] else return ETC_LATIN_LETTER_TABLE[@index] end end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0..134 x = 4 + i / 5 / 9 * 152 + i % 5 * 28 y = i / 5 % 9 * 32 if @mode == 1 self.contents.font.name = "Arial" self.contents.font.size = 24 self.contents.draw_text(x, y, 28, 32, ENGLISH_TABLE[i], 1) elsif @mode == 2 self.contents.font.name = ["MS Pゴシック",'MS PGothic'] self.contents.font.size = 22 self.contents.draw_text(x, y, 28, 32, HIRAGANA_TABLE[i], 1) elsif @mode == 3 self.contents.font.name = ["MS Pゴシック",'MS PGothic'] self.contents.font.size = 22 self.contents.draw_text(x, y, 28, 32, KATAKANA_TABLE[i], 1) elsif @mode == 4 self.contents.font.name = ["굴림",'Gulim'] self.contents.font.size = 22 self.contents.draw_text(x, y, 28, 32, HANGUL_TABLE[i], 1) else self.contents.font.name = "Arial" self.contents.font.size = 24 self.contents.draw_text(x, y, 28, 32, ETC_LATIN_LETTER_TABLE[i], 1) end end end #-------------------------------------------------------------------------- # * Update Cursor Rectangle #-------------------------------------------------------------------------- def update_cursor_rect if self.active == false self.cursor_rect.empty else x = 4 + @index / 5 / 9 * 152 + @index % 5 * 28 y = @index / 5 % 9 * 32 self.cursor_rect.set(x, y, 28, 32) end end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update super if @index >= 0 && @index <= 134 if Input.repeat?(Input::RIGHT) $game_system.se_play($data_system.cursor_se) if @index % 5 == 4 if @index < 94 @index += 41 end else @index += 1 end end if Input.repeat?(Input::LEFT) $game_system.se_play($data_system.cursor_se) if @index % 5 == 0 if @index < 45 self.active = false @index = -999 return else @index -= 41 end else @index -= 1 end end if Input.repeat?(Input::DOWN) $game_system.se_play($data_system.cursor_se) if @index % 45 < 40 @index += 5 end end if Input.repeat?(Input::UP) if Input.trigger?(Input::UP) or @index % 45 >= 5 $game_system.se_play($data_system.cursor_se) if @index % 45 >= 5 @index -= 5 end end end end update_cursor_rect end end #============================================================================== # ** Window_NameCommand #------------------------------------------------------------------------------ # This window is used to choose the font on the input name screen. #============================================================================== class Window_NameCommand < Window_Command #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...@item_max if i == 1 or i == 2 font = 1 self.contents.font.name = ["MS Pゴシック",'MS PGothic'] self.contents.font.size = 22 elsif i == 3 font = 2 self.contents.font.name = ["굴림",'Gulim'] self.contents.font.size = 22 else font = 0 self.contents.font.name = "Arial" self.contents.font.size = 24 end draw_item(i, normal_color, font) end end #-------------------------------------------------------------------------- # * Draw Item # index : item number # color : text color # f : character fontname #-------------------------------------------------------------------------- def draw_item(index, color, f) if f == 0 self.contents.font.color = color self.contents.font.name = "Arial" self.contents.font.size = 24 elsif f == 1 self.contents.font.name = ["MS Pゴシック",'MS PGothic'] self.contents.font.size = 22 else self.contents.font.name = ["굴림",'Gulim'] self.contents.font.size = 22 end rect = Rect.new(4, 32 * index, self.contents.width - 8, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) self.contents.draw_text(rect, @commands[index]) end end #============================================================================== # ** Scene_Name #------------------------------------------------------------------------------ # This class performs name input screen processing. #============================================================================== class Scene_Name #-------------------------------------------------------------------------- # * Main Processing #-------------------------------------------------------------------------- def main # Get actor @actor = $game_actors[$game_temp.name_actor_id] # Make windows @edit_window = Window_NameEdit.new(@actor, $game_temp.name_max_char) @input_window = Window_NameInput.new @alert_window = Window_Base.new(188, 208, 264, 64) @alert_window.contents = Bitmap.new(228, 32) @alert_window.contents.font.name = "Arial" @alert_window.contents.font.size = 24 @alert_window.contents.draw_text(0, 0, 228, 32, "You must enter a name.") @alert_window.z = 1001 @alert_window.visible = false c1 = "English" c2 = "ひらがな" c3 = "カタカナ" c4 = "한글" c5 = "Etc" c6 = "Space" c7 = "Backspace" c8 = "Default" c9 = "Done" commands = [c1, c2, c3, c4, c5, c6, c7, c8, c9] @command_window = Window_NameCommand.new(160, commands) @input_window.active = false @input_window.visible = true @command_window.index = 0 @command_window.visible = true @command_window.active = true @command_window.x = 0 @command_window.y = 128 @command_window.z = 1000 @alert_count = 0 # Execute transition Graphics.transition # Main loop loop do # Update game screen Graphics.update # Update input information Input.update # Frame update update # Abort loop if screen is changed if $scene != self break end end # Prepare for transition Graphics.freeze # Dispose of windows @edit_window.dispose @input_window.dispose @command_window.dispose @alert_window.dispose end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # Update windows @edit_window.update @input_window.update @command_window.update @alert_window.update if @alert_window.visible == true && @alert_count > 0 @alert_count -= 1 if @alert_count <= 0 @command_window.active = true @alert_window.visible = false end return end if @input_window.active == false @command_window.active = true end if @command_window.active == false @input_window.active = true end if Input.repeat?(Input::B) && @input_window.active == true if @edit_window.index == 0 return else $game_system.se_play($data_system.cancel_se) @edit_window.back end end if Input.repeat?(Input::B) && @command_window.active == true $game_system.se_play($data_system.buzzer_se) return end if Input.trigger?(Input::C) if @command_window.active == true case @command_window.index when 0 #Latin Alphabet and Numbers $game_system.se_play($data_system.decision_se) @input_window.mode = 1 @input_window.refresh @command_window.active = false @input_window.active = true @input_window.index = 0 return when 1 #Japanese Hiragana $game_system.se_play($data_system.decision_se) @input_window.mode = 2 @input_window.refresh @command_window.active = false @input_window.active = true @input_window.index = 0 return when 2 #Japanese Katakana $game_system.se_play($data_system.decision_se) @input_window.mode = 3 @input_window.refresh @command_window.active = false @input_window.active = true @input_window.index = 0 return when 3 #Korean $game_system.se_play($data_system.decision_se) @input_window.mode = 4 @input_window.refresh @command_window.active = false @input_window.active = true @input_window.index = 0 return when 4 #Latin Alphabet with Diacritics and other $game_system.se_play($data_system.decision_se) @input_window.mode = 5 @input_window.refresh @command_window.active = false @input_window.active = true @input_window.index = 0 return when 5 if @edit_window.index < $game_temp.name_max_char $game_system.se_play($data_system.decision_se) @edit_window.add(" ") else $game_system.se_play($data_system.buzzer_se) end return when 6 $game_system.se_play($data_system.decision_se) @edit_window.back return when 7 $game_system.se_play($data_system.decision_se) @edit_window.restore_default return when 8 if @edit_window.name == "" $game_system.se_play($data_system.buzzer_se) @alert_window.visible = true @command_window.active = false @alert_count = 60 return end $game_system.se_play($data_system.decision_se) @actor.name = @edit_window.name $game_system.se_play($data_system.decision_se) $scene = Scene_Map.new return end end if @edit_window.index == $game_temp.name_max_char && @input_window.active == true $game_system.se_play($data_system.buzzer_se) return end if @input_window.character == "" && @input_window.active == true $game_system.se_play($data_system.buzzer_se) return end if @input_window.character != nil && @input_window.active == true && @edit_window.index <= $game_temp.name_max_char $game_system.se_play($data_system.decision_se) if @input_window.mode == 1 @edit_window.char_type[@edit_window.index] = 1 else @edit_window.char_type[@edit_window.index] = 2 end @edit_window.add(@input_window.character) end return end end end