Mylloux Jaja mi intención cuando te dije que yo tenia uno que funcionara era para explicarte como hacerlo compañero, mira te voy a dejar el código aquí y te lo explicaré brevemente.
En realidad por mas fácil que lo intente explicar a veces las palabras pueden apantallar demasiado, y parecer que estoy diciendo muchas cosas pero es bastante sencillo si logras entender la lógica detrás.


ese es exactamente el código que uso, como podrás ver lo tengo escrito en la pestaña de Eventos comunes en la base de datos:

Ahora procederé a explicarlo resumidamente, y si tienes duda con algo no dudes en preguntar, y si ya de plano no me entiendes nada, pues... es que soy pésimo explicando TuT
Lo primero que vemos es un "label 1" o en español, una etiqueta #1, pero de momento ignoremos que eso esta allí.
Lo siguiente que hay en el engine es un par de eventos de "key input processing" o en español "asignar teclas"

este evento funciona con una variable, en este caso las variables tienen por nombre "correr 4" y "correr 1"

Tengo la variable "correr 4" y abajo tengo marcadas las casillas de las direccionales, abajo, izquierda, derecha y arriba.
como puedes observar al lado de cada direccional hay un numero entre paréntesis (abajo tiene un "1", izquierda un "2", derecha un "3" y por ultimo arriba un "4") esto lo que significa es que, si presiono abajo, la variable "correr 4" va a valer 1 mientras tenga la tecla presionada, si presiono izuierda la variable va a valer 2 mientras la tenga presionada y asi con el resto...

Luego tengo la variable "correr 1" en donde esta marcada únicamente la casilla de "shift" el cual tiene un "7" entre parentesis al lado, esto significa que mientras mantenga presionada la tecla "shift" la variable "correr 1 " va a valer 7
Nota: Dejar de presionar la tecla hará que la variable inmediatamente vuelva a valer 0
Nota 2: Si marcas la casilla de "wait for key input" el valor que adquiere la variable cuando presionas la tecla solo dura un parpadeo, esta opción tiene muchas aplicaciones pero de momento no nos interesa.
Siguiendo con el código, nos encontramos con un par de condiciones abajo de los "key input processing"

Estas son condiciones, quiere decir que lo que esta adentro solo va a pasar si se cumple dicha condición.
Primero tenemos una que dice:
-Si la variable "correr 1" tiene un valor que no sea "0" entonces se cumple la condición:
(en otras palabras, si presionamos shift, la variable "correr 1" va a valer "7" por tanto, se cumple la condición #1)
Luego dentro de esa condición hay otra condición que dice:
-Si la variable "correr 4" tiene un valor que no sea "0" entonces se cumple la condición:
(Osea que si presionamos cualquier direccional se va a cumplir esta condición porque nuestra variable "correr 4" dejará de valer "0")
Esto significa que, para que se cumpla lo que hay dentro de estas dos condiciones, debemos estar presionando "shift" y debemos estar presionando alguna direccional. Entonces bastaría con poner que la velocidad de nuestro personaje aumente cuando se cumplan estos dos requisitos, cierto?
No, aunque esto efectivamente hará que nuestro personaje corra, aun hay algunos problemas que solventar. ya que debemos decirle al programa, que en el momento en el que se suelte, ya sea "shift" o la direccional, nuestro personaje deje de correr, entonces pasamos a la siguiente parte.

Como puedes ver aquí volví a meter 2 variables nuevas "correr 3" y "correr 5", son exactamente iguales que "correr 1" y "correr 4" pero tenia que usar otras diferentes porque sino daba error, ya que correr 1 y 4 ya estaban ocupadas cumpliendo la condición. (lo sé... aquí se puso mas complicado pero es que no se me ocurrio de que otra manera explicarlo T.T)
abajo tenemos un par de condiciones, que se activan en el momento en el que "correr 3" o "correr 5" valgan 0 (en otras palabras cuando soltemos shift o las direccionales) y dentro de esas condiciones puse la instruccion de bajar velocidad y cambiar grafico del heroe, para simular que este deja de correr.
Y tambien puedes notar que esto esta dentro de un "loop" o "ciclo" en español, eso quiere decir resumidamente que el juego va a comprobar en todo momento que no hayas soltado "shift" o las direccionales, porque en el momento en el que lo hagas se cumpliran las condiciones y tu personaje dejará de correr...

y ya para terminar, recuerdas la etiqueta #1 que mencioné al principio? pues al final introduje esta instruccion llamada "jump to label #1" o en español "ir a etiqueta #1" lo que basicamente hará que el codigo vuelva a leerse desde arriba y se repita todo de nuevo.
Si tuviera que leer el código en lenguaje "humano" básicamente dice:
-Cuando presiones shift y las direccionales, tu personaje correrá, y el programa comenzara a comprobar constantemente que las estés presionando aún, porque en el momento en el que no lo hagas, tu personaje se detiene y todo vuelve a empezar.
Al final se hizo mucho mas largo de lo que pensé, pero te juro que trate de explicarlo lo mejor que pude y de verdad espero que te ayude. _ mucha suerte con tu proyecto y responderé cualquier duda como pueda.