首发网址:
http://www.our-story.tk/read.php?tid=76
其实就是把原有的输入名称方式改为使用拼音输入发输入,
大大的增加了可以输入的文字,相信许多超越自由化的游戏都可以使用。
如类似diablo的自由命名方式,类似仙剑四的武器取名都可以使用。
虽然目前的字库只有20000++的文字,不过只要有人可以提供帮助我愿意完善。
其余的说明都在脚本里,自己看吧。
使用方法:将脚本贴在main之前,然后用事件触发输入姓名处理。
晒晒几张截图:
设置方法:
效果图:
外带的中文字库:
输入法名称输入脚本:
- =begin【输入法名称输入】 by enghao_lim(小lim)Blog:http://www.lim-space.tk/论坛:http://www.our-story.tk/=================================================01. 增加姓名可以输入的可能性,采用汉语拼音方式,让华语和英语更好的结合。02. 采用了字库的配合,有兴趣者既可扩展该字库,相信必能更加完善。03. 目前之真对单字开发,不支持词语输入04. 不支持多音多字,比如:重,如在chong里搜索不到,请重试zhong。05. 此脚本需要与修改后的全键盘脚本一起使用。06. 此脚本还需要外带字库,默认名字为:CnWordCabin.fonc。 记得将字库放在工程文件夹底下。=================================================*PS: 由于次脚本所用的文字库非常乱起八糟,具体只是根据阴阳上去来排列, 所以有些常用字可能还被排在了后头,比如说“是”。 如有谁愿意继续开发该字库或者帮忙重新排列,请联络我。 稍微小小的补充,次字库包含超过两万个中文字。=endmodule LIM_INPUT # 代替空格的符号设置 Space_replace = ""endclass Window_Input < Window_Base #------------------------------ # 【初始化】 #------------------------------ def initialize super(0,128,640,96) self.contents = Bitmap.new(width-32,height-32) self.back_opacity = self.opacity = 0 @old_text = nil @text_length = 0 end #------------------------------ # 【显示文字】 #------------------------------ def set_text(*arg) # 获取显示的文字 if (arg[0].is_a?(Integer)) x = arg[0] c = 6 text = arg[1] else x = 0 c = 0 text = arg[0] end x += 48 # 开始显示 if @old_text != text self.contents.clear self.contents.font.color = text_color(c) self.contents.draw_text(x,16,width-32,32,text.gsub(/ /){LIM_INPUT::Space_replace}) @old_text = text @text_length = self.contents.text_size(text.gsub(/ /){LIM_INPUT::Space_replace}).width end end #------------------------------ # 【获取文字的长度】 #------------------------------ def text_length return @text_length endendclass Window_Word < Window_Base #------------------------------ # 【初始化】 #------------------------------ def initialize super(0,224,640,96) self.contents = Bitmap.new(width-32,height-32) @old_word = [] end #------------------------------ # 【显示文字选项】 #------------------------------ def set_text(word_array) if @old_word != word_array x = 0 bitmap = Bitmap.new(width-32,height-32) for i in 0...word_array.size k = (i+1)%10 bitmap.draw_text(x,0,22,32,k.to_s,1) bitmap.draw_text(x,32,22,32,word_array[i],1) x += 22 x += 22 if (i != word_array.size - 1) end self.contents.clear _x = (width-32-x)/2 self.contents.blt(_x,0,bitmap,Rect.new(0,0,x,64)) @old_word = word_array end endendclass Window_Name < Window_Base #------------------------------ # 【初始化】 #------------------------------ def initialize(actor) super(0,96,640,128) self.contents = Bitmap.new(width-32,height-32) @actor = actor refresh end #------------------------------ # 【显示图片】 #------------------------------ def refresh self.contents.draw_text(4,0,width-32,32,"请输入新的名字:") draw_actor_graphic(@actor,24,88) endendclass Scene_Name #------------------------------ # 【主循环】 #------------------------------ def main # 获取角色 与 各种变量设置 @actor = $game_actors[$game_temp.name_actor_id] @max_word = $game_temp.name_max_char @inputed = @actor.name @now_input = "" @old_now_input = "" @old_key = "" @now_index = 0 @wait_count = 0 # 读取字库 word_cabin = File.open("CnWordCabin.fonc","rb") @cn_key = Marshal.load(word_cabin) @cn_word = Marshal.load(word_cabin) # 生成各种窗口 @window_name = Window_Name.new(@actor) @window_input = Window_Input.new @window_input2 = Window_Input.new @window_word = Window_Word.new @window_word.visible = false @window_count = Window_Help.new @window_count.y = 416 @window_count.back_opacity = @window_count.opacity = 0 reset_text @command_help = Window_Base.new(64,128,512,64) @command_help.contents = Bitmap.new(480,32) @command_help.contents.draw_text(0,0,480,32,"确定输入完毕?",1) @command_help.visible = false @command_exit = Window_Command.new(160,["是","否"]) @command_exit.x = 240 @command_exit.y = 196 @command_exit.active = @command_exit.visible = false Graphics.transition(20) # 开始循环 loop do Graphics.update Input.update update break if $scene != self end # 释放 @window_name.dispose @window_input.dispose @window_input2.dispose @window_word.dispose @window_count.dispose @command_help.dispose @command_exit.dispose end #------------------------------ # 【循环刷新】 #------------------------------ def update # 各种刷新 @window_name.update @window_input.update @window_input2.update @window_word.update @window_count.update @command_help.update @command_exit.update # 是否正在选取文字 if @window_word.visible and Key.trigger?(0x31) # Number 1 choose_the_word(1) Key.get_string elsif @window_word.visible and Key.trigger?(0x32) # Number 2 choose_the_word(2) Key.get_string elsif @window_word.visible and Key.trigger?(0x33) # Number 3 choose_the_word(3) Key.get_string elsif @window_word.visible and Key.trigger?(0x34) # Number 4 choose_the_word(4) Key.get_string elsif @window_word.visible and Key.trigger?(0x35) # Number 5 choose_the_word(5) Key.get_string elsif @window_word.visible and Key.trigger?(0x36) # Number 6 choose_the_word(6) Key.get_string elsif @window_word.visible and Key.trigger?(0x37) # Number 7 choose_the_word(7) Key.get_string elsif @window_word.visible and Key.trigger?(0x38) # Number 8 choose_the_word(8) Key.get_string elsif @window_word.visible and Key.trigger?(0x39) # Number 9 choose_the_word(9) Key.get_string elsif @window_word.visible and Key.trigger?(0x30) # Number 0 choose_the_word(10) Key.get_string elsif @window_word.visible and Key.trigger?(187) # Key + if @now_index + 10 < @cn_word[@now_input].size Audio.se_play("Audio/SE/046-Book01") @now_index += 10 show_match_word(@now_input) else $game_system.se_play($data_system.buzzer_se) end Key.get_string elsif @window_word.visible and Key.trigger?(189) # Key - if @now_index - 10 >= 0 Audio.se_play("Audio/SE/046-Book01") @now_index -= 10 show_match_word(@now_input) else $game_system.se_play($data_system.buzzer_se) end Key.get_string @wait_count = 4 end # 文字输入刷新 @now_input += Key.get_string @window_input2.set_text(@window_input.text_length,@now_input) # 出声音,可以无视…… if @now_input != @old_now_input $game_system.se_play($data_system.cursor_se) @old_now_input = @now_input end # 判断匹配拼音 if @cn_key.include?(@now_input) show_match_word(@now_input) @window_word.visible = true else @window_word.visible = false end # 各种情况刷新 if @wait_count > 0 @wait_count -= 1 return elsif @command_exit.active command_exit_update elsif Key.trigger?(13) # Enter enter_trigger_update elsif Key.trigger?(8) or Key.press?(8) # Backspace return if (@now_input == "" and @inputed == "") backspace_trigger_update end end #------------------------------ # 【询问退出刷新】 #------------------------------ def command_exit_update if Input.trigger?(Input::C) case @command_exit.index when 0 $game_system.se_play($data_system.decision_se) @actor.name = @inputed $scene = Scene_Map.new when 1 command_exit_activated?(false) $game_system.se_play($data_system.cancel_se) end end if Input.trigger?(Input::B) command_exit_activated?(false) $game_system.se_play($data_system.cancel_se) end end #------------------------------ # 【确定输入的文字】 #------------------------------ def enter_trigger_update # 还在输入的情况 if @now_input != "" temp = @now_input.scan(/./) for char in temp if @inputed.scan(/./).size >= @max_word $game_system.se_play($data_system.buzzer_se) break end @inputed += char end @now_input = "" reset_text # 没有输入的情况 else $game_system.se_play($data_system.decision_se) command_exit_activated?(true) end end #------------------------------ # 【确定输入的文字】 #------------------------------ def backspace_trigger_update if @now_input != "" temp = @now_input.scan(/./) @now_input = "" for i in 0...temp.size-1 @now_input += temp[i] end else temp = @inputed.scan(/./) @inputed = "" for i in 0...temp.size-1 @inputed += temp[i] end end $game_system.se_play($data_system.cursor_se) @wait_count = 2 reset_text end #------------------------------ # 【重新显示文字】 #------------------------------ def reset_text @window_input.set_text(@inputed) @window_input2.set_text(@window_input.text_length,@now_input) @window_count.set_text("还有 #{@[email protected](/./).size} 字可以输入",2) end #------------------------------ # 【匹配文字显示】 #------------------------------ def show_match_word(key) if @old_key != key @now_index = 0 @old_key = key end max = [@cn_word[key].size-@now_index,10].min word_array = [] for i in 0...max k = i + @now_index word_array.push(@cn_word[key][k]) end @window_word.set_text(word_array) end #------------------------------ # 【选择的文字】 #------------------------------ def choose_the_word(n) n -= 1 char = @cn_word[@now_input][@now_index+n] if @inputed.scan(/./).size == @max_word or char.nil? $game_system.se_play($data_system.buzzer_se) return end $game_system.se_play($data_system.decision_se) @inputed += char @now_input = "" reset_text end #------------------------------ # 【激活退出选项】 #------------------------------ def command_exit_activated?(bool) @window_name.visible = !bool @window_input.visible = !bool @window_input2.visible = !bool @window_count.visible = !bool @command_help.visible = bool @command_exit.visible = bool @command_exit.active = bool endend复制代码
复制代码修改后的全键盘脚本(来自engshun):
- module Key @key_code = { # ============================= "BACK"=> 0x08, "TAB"=> 0x09, "SHIFT"=> 0x10, "ALT"=> 0x12, "CAP"=> 0x14, "ESC"=> 0x1B, "SPACE"=> 0x20, "LEFT"=> 0x25, "UP"=> 0x26, "RIGHT"=> 0x27, "DOWN"=> 0x28, "ENTER" => 13, "LCTRL" => 0xA2, "RCTRL" => 0xA3, "LALT" => 0xA4, "RALT" => 0xA5, "SPACE" => 0x20, "DEL" => 0x2E, # ============================= "A" => 0x41, "B" => 0x42, "C" => 0x43, "D" => 0x44, "E" => 0x45, "F" => 0x46, "G" => 0x47, "H" => 0x48, "I" => 0x49, "J" => 0x4A, "K" => 0x4B, "L" => 0x4C, "M" => 0x4D, "N" => 0x4E, "O" => 0x4F, "P" => 0x50, "Q" => 0x51, "R" => 0x52, "S" => 0x53, "T" => 0x54, "U" => 0x55, "V" => 0x56, "W" => 0x57, "X" => 0x58, "Y" => 0x59, "Z" => 0x5A, # ============================= "F1" => 0x70, "F2" => 0x71, "F3" => 0x72, "F4" => 0x73, "F5" => 0x74, "F6" => 0x75, "F7" => 0x76, "F8" => 0x77, "F9" => 0x78, "F10" => 0x79, "F11" => 0x7A, "F12" => 0x7B, # ============================= "0" => 0x30, "1" => 0x31, "2" => 0x32, "3" => 0x33, "4" => 0x34, "5" => 0x35, "6" => 0x36, "7" => 0x37, "8" => 0x38, "9" => 0x39, # ============================= ";" => 186, "=" => 187, "," => 188, "-" => 189, "." => 190, "/" => 191, "[" => 219, "\" => 220, "]" => 221, "'" => 222, # ============================= "N0" => 0x60, "N1" => 0x61, "N2" => 0x62, "N3" => 0x63, "N4" => 0x64, "N5" => 0x65, "N6" => 0x66, "N7" => 0x67, "N8" => 0x68, "N9" => 0x69 } @upcase = { 48 => ")", 49 => "!", 50 => "@", 51 => "#", 52 => "$", 53 => "%", 54 => "^", 55 => "&", 56 => "*", 57 => "(", 186 => ":", 187 => "+", 188 => "", 191 => "?", 219 => "{", 220 => "|", 221 => "}", 222 => '"' } module_function @R_Key_Hash = {} @trigger = {} @R_Key_Repeat = {} @press_key = [0] GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I') def update @key_code.each_value do |i| result = GetKeyState.call(i) if @R_Key_Hash[i] == 1 and result != 0 @trigger[i] = false next end if result != 0 @R_Key_Hash[i] = 1 @trigger[i] = true next else @R_Key_Hash[i] = 0 @trigger[i] = false next end end if @press_key[0] > 0 @press_key[0] -= 1 unlash if @press_key == 0 end end def press?(rkey) return GetKeyState.call(rkey) != 0 end def repeat?(rkey) result = GetKeyState.call(rkey) if result != 0 if @R_Key_Repeat[rkey].nil? @R_Key_Repeat[rkey] = 0 return true end @R_Key_Repeat[rkey] += 1 else @R_Key_Repeat[rkey] = nil @R_Key_Hash[rkey] = 0 end if !@R_Key_Repeat[rkey].nil? and @R_Key_Repeat[rkey] > 10 @R_Key_Repeat[rkey] = 6 return true else return false end end def trigger?(rkey) return @trigger[rkey] end def [](key) return @key_code[key] end def caps? gks = Win32API.new("user32", "GetKeyState", 'i', 'i') result = gks.call(0x14) return result[0] == 1 end #=================================================================== def get_string n = nil str = nil @key_code.each_value do |i| n = i if repeat?(i) and i != 16 and i != 13 and i != 8 end if n != nil str = @key_code.index(n) unless self.caps? str = str.downcase unless Key.press?(16) else str = str.downcase if Key.press?(16) end str = nil if str.scan(/./).size != 1 if self.press?(16) and @upcase.include?(n) str = @upcase[n] end str = (n - 96).to_s if n.between?(96,105) end str = " " if n == 0x20 str = " " if n == 0x09 return str.to_s end #===================================================================endmodule Input @self_update = method('update') if @self_update.nil? def self.update @self_update.call Key.update endend复制代码
复制代码 本帖来自P1论坛作者enghao_lim,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:
https://rpg.blue/forum.php?mod=viewthread&tid=174413 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。