Hola a todos el condigo que ocupo esta diseñado para que mientra este en colicion con el objeto me pueda mover pero mientras no allá colicion no pueda moverse , es lo contrario el espacio libre es el muro, pero el problema es que me muevo, si pero solamente en 2 direcciones , abajo y derecha,izquierda y arriba no funcionan. no se mueve acá abajo le dejo el código

if(keyboard_check(vk_up)and !place_empty(x,y-19)){vspeed=-3;}else{vspeed=0;}
    if(keyboard_check(vk_down)and !place_empty(x,y+19)){vspeed=3}else{vspeed=0;}
    if(keyboard_check(vk_left)and !place_empty(x-19,y)){hspeed=-3}else{hspeed=0;}
    if(keyboard_check(vk_right)and !place_empty(x+19,y)){hspeed=3}else{hspeed=0;} 
    if(keyboard_check_released(vk_up)){vspeed=0;}
    if(keyboard_check_released(vk_down)){vspeed=0;}
    if(keyboard_check_released(vk_left)){hspeed=0;}
    if(keyboard_check_released(vk_right)){hspeed=0;}
:3 visita mi canal-cito de youtube :3

Hola elmmertonw! Lo que sucede es que se juntan los códigos y te da un mal resultado. Me explico:

Vamos a ver sólo esta parte del código:
if (keyboard_check(vk_up) and !place_empty(x,y-19)) {vspeed=-3;} else {vspeed=0;}
if (keyboard_check(vk_down) and !place_empty(x,y+19)) {vspeed=3} else {vspeed=0;}


Supongamos que presionas la flecha de arriba. El código que detecta esa tecla hace que tu personaje tenga una vspeed de -3, pero el que detecta la tecla hacia abajo lo cambia a 0, ya que al no presionarse la flecha de abajo se ejecuta el else.
Lo mismo acá:
if (keyboard_check(vk_left) and !place_empty(x-19,y)) {hspeed=-3} else {hspeed=0;}
if (keyboard_check(vk_right) and !place_empty(x+19,y)) {hspeed=3} else {hspeed=0;}


Podés cambia el código por esto:
//Direcciones
//Horizontales
hspeed = (keyboard_check(vk_right) - keyboard_check(vk_left)) * 3;
//Verticales
vspeed = (keyboard_check(vk_down) - keyboard_check(vk_up)) * 3;

//Comprobar que colisione contra el objeto
//Horizontalmente
if (place_empty(x+hspeed, y)) {hspeed = 0;}
//Verticalmente
if (place_empty(x, y+vspeed)) {vspeed = 0;}


En hspeed, el cálculo que hace es el siguiente:
Si se presiona una tecla es 1 y si no se presiona es 0. Por ejemplo, si se presiona la tecla derecha y no la izquierda sucede esto:
hspeed = (1 - 0) * 3;
Entonces queda hspeed = 3;

También al no presionar la derecha y si la izquierda:
hspeed = (0 - 1) * 3;
hspeed = -3;

Son muy importantes los paréntesis entre el "(keyboard_check(vk_down) - keyboard_check(vk_up))". Sin ellos queda así:
Izquierda:
hspeed = 0 - 1 * 3;
hspeed = -3;

Derecha:
hspeed = 1 - 0 * 3;
hspeed = 1;
Sucede lo mismo en el vspeed.

Y en las colisiones:
if (place_empty(x+hspeed, y)) {hspeed = 0;}
Si está vacío en x+hspeed pone la hspeed en 0. El x+hspeed funciona con las dos direcciones:
Derecha:
if (place_empty(x+3, y)) {hspeed = 0;}
Izquierda:
if (place_empty(x-3, y)) {hspeed = 0;}
Y lo mismo en las verticales.

Espero que te sirva! :D