Also die eigentliche Grafik als Kollisionsmaske zu nehmen ist immer dann problematisch, wenn es um schnelle Geschwindigkeiten geht, bei denen das Objekt pro Frame auch mal > 10 Pixel bewegt werden kann, und ein Kollisionsobjekt aber eventuell auch mal kleiner 10 Pixel ist. Deshalb würde ich von so einer Kollisionsmethode abraten, wenn du es mit hohen Geschwindigkeiten zu tun hast.
Ich würde zwar sowieso die Spielfigur etwas langsamer machen, denn hier auf meinem PC ist es extrem schnell. Weiß nicht obs am fehlenden Frame-Limiter liegt oder daran, dass es so schnell sein soll. Jedenfalls rast der Typ unnatürlich schnell.

Zurück zum Problem: Ich würde dir raten, für den Spieler und jedes Levelobjekt eine Maske per Zahlenwerte festzulegen. Also obere Grenze, untere Grenze, linke grenze und rechte Grenze. Dann bekommt die Spielfigur auch grenzwerte. Das sieht dann etwa so aus: Grenze links = Spielfigur_position_x - 20 Pixel. Grenze Rechts = Spielfigur_position_x + 20 Pixel. (etc)
Wenn jetzt diese Grenzen-Position eine Grenzpositon eines Levelobejekts überschreitet bzw sich innerhalb befindet, wird die Position auf den Rand außerhalb zurückgesetzt. Erst danach wird die Spielfigur an dieser Stelle dargestellt. Das sorgt dafür, dass der Spieler optisch nie innerhalb von Objekten erscheint, weil erst die Kollisionsprüfung erfolgt, danach das Darstellen am Monitor.
Das heißt, du machst dann keine Kollision anhand der eigentlichen Grafik sondern legst für jedes Objekt mittels ein paar Variablen einen Grenzbereich an, indem sich der Spieler nicht befinden darf. Wenn du dann die Leertaste zum Sprung drückst, wird bereits vor dem Darstellen des Sprungs dann mit diesen Koordinaten die Sprungbahn des Typs berechnet und bei Kollision wird er zurückgesetzt und dann dargestellt.
Dadurch, dass man mit diesen Kollisionsboxen rechnen kann, ist diese Methode viel schneller als Pixelweise Bewegung der Spielfigur, da sie nur auf Variablenrechnungen basiert.
z.B. wenn Spieler_x > objekt1_Linker_Rand und Spieler_X < objekt1_rechter rand und spieler_y > objekt1_oberer_rand und spieler_y < objekt1_unterer Rand -> Dann findet kollision statt - und der Spieler muss wieder auserhalb des Objekts dargestellt werden. Dazu muss man die zuletzt getätigte Bewegung (bzw deren Errechnete Positionsänderung) nur rückwärts zurücklaufen bis die Kollision nicht mehr stattfindet.