Se puede hacer de muchas formas. El método que me parece más fácil, cuando las máscaras de colisión son rectangulares, es que el movimiento se divide en 2 partes, una para cada eje.
Primero desplaza el personaje en el eje X, si detecta colisión que se desplace hasta luna posición en el borde del obstáculo.
Después desplaza el personaje en el eje Y, si detecta colisión también que se desplace hasta quedar en el borde del obstáculo.
Otra opción es pensar que los dos objetos son circulares. Cuando el personaje colisiona con el obstáculo se desplaza en dirección contraria al centro del obstáculo. Esta forma se puede hacer con poco código, pero debes entender un poco de matemáticas vectoriales.
Primero desplaza el personaje en el eje X, si detecta colisión que se desplace hasta luna posición en el borde del obstáculo.
Después desplaza el personaje en el eje Y, si detecta colisión también que se desplace hasta quedar en el borde del obstáculo.
Otra opción es pensar que los dos objetos son circulares. Cuando el personaje colisiona con el obstáculo se desplaza en dirección contraria al centro del obstáculo. Esta forma se puede hacer con poco código, pero debes entender un poco de matemáticas vectoriales.