girasquid
girasquid

Reputation: 15506

How do I capture typed text in DragonRuby Game Toolkit?

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

Answers (1)

girasquid
girasquid

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

Related Questions