+1 vote

I am working to create something similar to a TextEdit, and for that I setup an input function to detect when a key is pressed:

func _input(event):
    if event is InputEventKey:
        if event.is_pressed():
            var key_pressed = ... #detect which key is pressed
            text += key_pressed

That's basically what I want to do (I can handle the backspace separately), I have found that I can use the event.scancodeto get a code representing the character which is pressed, and what I want to know is how to know which key was originally pressed using the scancode or anything else.

Thanks in advance

asked Jul 12, 2018 in Engine by PugMasterPug (110 points)

3 Answers

+2 votes

GlobalScope has an enum of scancodes called KEY_*. For example, KEY_A = 65.

You can use this to do something like:

if event is InputEventKey:
    if event.scancode == KEY_A:
        # do stuff

If you're checking lots of keys you can use a match statement or a dictionary here.

If you have the scancode and want to know the name of the key you can use OS.get_scancode_string() which will return the "name" of the key as a string, i.e. “Escape”, “Shift+Escape”. OS.find_scancode_from_string() does the opposite.

answered Jul 12, 2018 by kidscancode (10,690 points)

At the end I did the following:

var character = char(event.unicode)
print(character)

A much better solution to the problem

If you're only dealing with ASCII key inputs. However, be aware that if you have a scancode with modifiers (capital vs. lowercase, for example), unicode input, or other non-character keypresses, char() won't work.

0 votes

You can add custom names for key codes in the godot.project settings

Project -> Project Settings -> Input Map -> "custom_space" -> add action -> then add the scancode to the text field


func input(event):
if Input.is
actionjustpressed("custom_space" ):

http://docs.godotengine.org/en/3.0/classes/class_input.html?highlight=input

the isactionjust_press is not rendering property. code blocks just seem broken...

answered Jul 20, 2018 by hungrymonkey (419 points)
0 votes

something like this :

func _input(ev):
        if ev is InputEventKey :
            (print(ev.scancode))

or this also

func _input(ev):
        if ev is InputEventKey :
            (print(OS.get_scancode_string(ev.scancode)))
answered Jun 25 by ruruarchy (44 points)

it will print 2x on pressing a key, 1 for pressed 1 for released

we could also print it only once by adding

and ev.is_pressed == true :

or

and ev.is_pressed == false :

in if statement
the former is at press state
the latter is at released state

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.