如何在DragonRuby Game Toolkit中捕获用户输入的文本?
优化游戏文本输入功能(无需手动转换特殊字符)
需求是实现玩家文本输入功能,支持常规文本、Shift组合生成的特殊字符(如!、?),以及退格删除内容。当前代码需要手动映射各类特殊字符,这里提供更简洁的优化方案:
原实现代码
def defaults(args) args.state.text_box_message ||= "" end def input(args) key_information = args.inputs.keyboard.truthy_keys # is this a meta/system key? ignore it then letter = (key_information - [:raw_key, :shift, :char]).first.to_s if %w(alt meta control control_right control_left shift shift_left shift_right escape tab meta_left meta_right).include?(letter) return end letter = "?" if letter == "question_mark" letter = "!" if letter == "exclamation_point" letter = " " if letter == "space" letter = "_" if letter == "underscore" if key_information.include?(:backspace) || key_information.include?(:delete) args.state.text_box_message = args.state.text_box_message.chop else if letter if key_information.include?(:shift) || args.state.last_key_info.include?(:shift) # uppercasing the letter letter = letter.upcase else letter = letter.downcase end args.state.text_box_message = args.state.text_box_message.concat(letter) end end args.state.last_key_info = key_information unless key_information.empty? end
优化方案
直接使用框架提供的args.inputs.keyboard.char属性,它已经自动处理了Shift组合键对应的特殊字符、大小写转换,无需手动映射:
def defaults(args) args.state.text_box_message ||= "" end def input(args) # 处理退格/删除键,避免空字符串时调用chop报错 if args.inputs.keyboard.backspace || args.inputs.keyboard.delete args.state.text_box_message = args.state.text_box_message.chop unless args.state.text_box_message.empty? return end # 获取自动处理后的输入字符 typed_char = args.inputs.keyboard.char if typed_char && !typed_char.empty? args.state.text_box_message += typed_char end end
优化点说明
- 无需手动维护特殊字符映射:
char会直接返回Shift组合对应的结果(如Shift+1返回!、Shift+/返回?) - 自动处理大小写:按Shift+字母会直接返回大写字符,无需手动判断Shift状态
- 代码更简洁,减少冗余逻辑,降低后续维护成本
- 增加空字符串判断,避免退格时出现错误
内容的提问来源于stack exchange,提问作者girasquid
相关产品推荐
相关产品推荐

