+3 votes

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

in Engine by (121 points)

3 Answers

+4 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.

by (18,555 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.

+1 vote

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...

by (429 points)
+1 vote

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)))
by (63 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.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.

Categories