Tengo algunos bugs comunes que me gustaria saber como solucionarlos. Le agrego un poco de humor para que lo lean entero XD.

1- ¡I beliebe i can fly! 8) : Cuando estas tocando una pared en el aire, si caminas hacia la direccion de la pared el jugador levita (Como todo chino sabio deberia hacer :P).

2- ¡¡Soy el correcaminos y atraviezo paredes!! :D : Cuando corres vas muy rapido atravezas paredes por unos segundos. O sea, imaginate: Vos sos sonic (Si, sonic) y vas re fumado, con todos los humos a estamparte la boca contra la pared, de repente atravezas la pared hasta la mitad y rebotas hacia afuera (Por una fuerza de la 9na dimension). Vos te quedas re wtf porque viste el interior de el maldito cuadradito feo (A menos que seas medio deforme y uses circulos enves de cuadrados como colision base ;D)

Eso es todo, el segundo no se si lo podran responder porque casi que ni yo se porque es xd
{{{~~TheZanahoria - La zanahoria happy~~}}}
(No pregunten por mi nombre :c)

El primer problema, generalmente ocurre cuando mueves el personaje sin verificar que haya una colision antes de moverlo. Sin embargo al ser objetos solidos, como normalmente uno desea que fueran, el objeto evidentemente colisiona al tratar de moverse, y no cae porque está tratando de moverse hacia los costados. Entonces al dejar de presionar las teclas para mover horizontalmente, sencillamente cae.
Generalmente se utiliza la verificacion con ciclo de repeticion, por ejemplo:

var velocidad_movimiento_horizonal = 5;

repeat(velocidad_movimiento_horizontal){
    if (place_free(x+1,y)
          x = x+ 1;
}


Eso haría que se moviera 5 unidades por step, pero verificando que dentro de esas 5 unidades haya espacio libre para moverse y evitas que se atasque en las paredes.

2 - Lo segundo no llego a comprender del todo, pero por lo general un objeto se queda a mitad de otro cuando mueve más pixeles de los que verificó de espacios libres por ejemplo:

if (place_free(x+1, y))
   x = x +5;

Si hay un espacio libre en x+1 el personaje se movera evidentemente 5 lugares más sin importar de que haya, en cualquier caso una pared (o lo que fuera) luego del primer pixel, a saber: x+2, x+3... y así en lo sucesivo.
Ahora de que rebótes luego de tocar la pared hmm creo que eso ya depende de cómo este implementada la colision.
O a lo mejor no me entero bien, pues no terminé de entender lo de Sonic XD

Cuando corres muy rápido tu velocidad es tan grande que en el siguiente fotograma la siguiente posición está al otro lado de la pared. Lo que debes hacer es comprobar una línea de colisión entre tu posición actual y la siguiente (sumando la velocidad) y mirar si entre ambas hay una pared, y si la hay cancelas el movimiento o lo ajustas al borde de la pared.

collision_line(x, y, x+hspeed, y+vspeed, obj_Pared, false, false) { // hay colisión }