Si je comprends bien ton code, quand il y a collision, tu testes les positions relatives des deux carrés. Si Player est trop a droite, tu le déplaces vers la gauche, et réciproquement.
Mais quand il y a collision par le haut et le bas, les coordonnées en abscisse de ton Player vérifient quand même les tests de collision des côtés (le if et le premier else if).
En gros, quand il y a collision, ton code vérifie d'abord si l’abscisse d'un des cotés de Player n'est pas comprise entre les abscisses des cotés de l'obstacle. Et comme c'est presque toujours le cas puisque Player est plus petit que l'obstacle, eh bien ton code ne prend jamais en compte la collision par le haut, mais toujours celle par le côté. D'ou le fait que l'ordi décale Player sur le côté à chaque fois.
C'est peut être pas très clair, si tu comprends pas ce que je veux dire, dis le et j'essaierai de reformuler ^^'
edit : d'ailleurs, c'est ce que vient de dire plus clairement Erwsaym ^^'