じ☆ve冰风 发表于 2024-4-19 16:59:44

输入法名称输入

首发网址:http://www.our-story.tk/read.php?tid=76

其实就是把原有的输入名称方式改为使用拼音输入发输入,
大大的增加了可以输入的文字,相信许多超越自由化的游戏都可以使用。
如类似diablo的自由命名方式,类似仙剑四的武器取名都可以使用。
虽然目前的字库只有20000++的文字,不过只要有人可以提供帮助我愿意完善。
其余的说明都在脚本里,自己看吧。

使用方法:将脚本贴在main之前,然后用事件触发输入姓名处理。

晒晒几张截图:
设置方法:
http://i1193.photobucket.com/albums/aa360/enghao_lim/sample3.jpg

效果图:
http://i1193.photobucket.com/albums/aa360/enghao_lim/sample1.jpg
http://i1193.photobucket.com/albums/aa360/enghao_lim/sample2.jpg

外带的中文字库:


输入法名称输入脚本:=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 = 0end#------------------------------# 【显示文字】#------------------------------def set_text(*arg)    # 获取显示的文字    if (arg.is_a?(Integer))      x = arg      c = 6      text = arg    else      x = 0      c = 0      text = arg    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    endend#------------------------------# 【获取文字的长度】#------------------------------def text_length    return @text_lengthendendclass 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,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    endendendclass Window_Name < Window_Base#------------------------------# 【初始化】#------------------------------def initialize(actor)    super(0,96,640,128)    self.contents = Bitmap.new(width-32,height-32)    @actor = actor    refreshend#------------------------------# 【显示图片】#------------------------------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.disposeend#------------------------------# 【循环刷新】#------------------------------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    endend#------------------------------# 【询问退出刷新】#------------------------------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)    endend#------------------------------# 【确定输入的文字】#------------------------------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)    endend#------------------------------# 【确定输入的文字】#------------------------------def backspace_trigger_update    if @now_input != ""      temp = @now_input.scan(/./)      @now_input = ""      for i in 0...temp.size-1      @now_input += temp      end    else      temp = @inputed.scan(/./)      @inputed = ""      for i in 0...temp.size-1      @inputed += temp      end    end    $game_system.se_play($data_system.cursor_se)    @wait_count = 2    reset_textend#------------------------------# 【重新显示文字】#------------------------------def reset_text    @window_input.set_text(@inputed)    @window_input2.set_text(@window_input.text_length,@now_input)    @window_count.set_text("还有 #{@(/./).size} 字可以输入",2)end#------------------------------# 【匹配文字显示】#------------------------------def show_match_word(key)    if @old_key != key      @now_index = 0      @old_key = key    end    max = [@cn_word.size-@now_index,10].min    word_array = []    for i in 0...max      k = i + @now_index      word_array.push(@cn_word)    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_textend#------------------------------# 【激活退出选项】#------------------------------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 = boolendend复制代码修改后的全键盘脚本(来自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 = GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I')def update    @key_code.each_value do |i|      result = GetKeyState.call(i)      if @R_Key_Hash == 1 and result != 0      @trigger = false      next      end      if result != 0      @R_Key_Hash = 1      @trigger = true      next      else      @R_Key_Hash = 0      @trigger = false      next      end    end    if @press_key > 0      @press_key -= 1      unlash if @press_key == 0    endenddef press?(rkey)    return GetKeyState.call(rkey) != 0enddef repeat?(rkey)    result = GetKeyState.call(rkey)    if result != 0      if @R_Key_Repeat.nil?      @R_Key_Repeat = 0      return true      end      @R_Key_Repeat += 1    else      @R_Key_Repeat = nil      @R_Key_Hash = 0    end    if !@R_Key_Repeat.nil? and @R_Key_Repeat > 10      @R_Key_Repeat = 6      return true    else      return false    endenddef trigger?(rkey)    return @triggerenddef [](key)    return @key_codeenddef caps?    gks = Win32API.new("user32", "GetKeyState", 'i', 'i')    result = gks.call(0x14)    return result == 1end#===================================================================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      end      str = (n - 96).to_s if n.between?(96,105)    end    str = " " if n == 0x20    str = "" if n == 0x09    return str.to_send#===================================================================endmodule Input@self_update = method('update') if @self_update.nil?def self.update    @self_update.call    Key.updateendend复制代码
             本帖来自P1论坛作者enghao_lim,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=174413若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 输入法名称输入