Reputation: 15506
I want to let a player type something, similarly to how I'm typing in this text box to ask this question. They should be able to enter regular text, special characters (ex. ! from the combination of 1
+ shift
, ?
etc.), and delete with backspace.
This is what I've tried so far, but it seems quite manual (ex. converting all the special characters) and I am not sure if there is a better way:
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
Upvotes: 0
Views: 146
Reputation: 15506
It turns out this is what args.inputs.text is useful for; it will give you the last key that was typed, as a letter (so the "1" key becomes "1" not "one" like it does in my original code).
Here is code that handles text as well as backspace/delete:
def defaults(args)
args.state.text_box_message ||= ""
end
def input(args)
key_information = args.inputs.keyboard.truthy_keys
letter = if !args.inputs.text.empty?
args.inputs.text.first
else
nil
end
if key_information.include?(:backspace) || key_information.include?(:delete)
args.state.text_box_message = args.state.text_box_message.chop
else
if letter
args.state.text_box_message = args.state.text_box_message.concat(letter)
end
end
end
Upvotes: 1