La gente di solito fa un sacco di confusione tra collisione e sovrapposizione ("overlap").

Overlap vuol dire che in un certo fotogramma due rettangoli hanno una parte della loro area in comune, cioè "uno sta sopra all'altro"; sebbene questo non sia un modo affidabile per rilevare le collisioni, molti lo usano in virtù della sua semplicità.
Rilevare una collisione è molto più complicato anche nei casi più semplici (es. cerchio che collide con una retta) e vuol dire considerare un'oggetto con tutta la sua fisica, e controllare che il vettore spostamento non intersechi mai un segmento impostato come limite. La collision response è un tema ancora più complesso.
Cercare overlaps frame per frame per approssimare la collision detection vuol dire in pratica ignorare tutto quello che accade tra un frame e l'altro: se ad esempio ci fossero degli oggetti molto piccoli e la velocità del tuo personaggio fosse molto alta (o il framerate molto basso) il tuo personaggio potrebbe passare attraverso tali oggetti perchè si troverebbea passare da una parte all'altra dell'oggetto senza mai essersi trovato sovrapposto.
Una buona soluzione (per quanto complessa) è:
1) per ogni spostamento del tuo personaggio principale considerare il segmento di spostamento [A, B] (posizione precedente - posizione successiva); il vettore di spostamento s = B- A
2) se il segmento overlappa uno dei rettangoli (facile), cercare l'intersezione più vicina P tra il segmento e il perimetro del rettangolo
3) calcolare il versore dello spostamento v = s / lunghezza(s)
4) calcolare il versore della risposta vr che è -v specchiato nella retta perpendicolare al bordo di collisione (facile se i rettangoli sono sempre axis aligned)
4) calcolare il vettore di risposta alla collisione r = (distanza(P,B) ) * vr * k (in pratica tutta la distanza che avresti percorso in più se non ci fosse stato un ostacolo in mezzo, nella direzione del rimbalzo, per una costante)
5) posizionare il personaggio in A + r
Questo da al personaggio un comportamento "rimbalzoso" in cui l'ammontare del rimbalzo dipende dalla costante scalare k. E' comunque una semplificazione (il personaggio è approssimato ad un punto e al passo 5 in realtà bisognerebbe iterare per controllare che il rimbalzo non ti abbia spinto in un'altra collisione... consiglio di tenere k piccolo)
Per approfondire il tema delle collisioni, c'è anche un meraviglioso articolo di metanet
http://www.metanetsoftware.com/technique/tutorialA.html sul teorema di separazione degli assi.
Sorry se il mio post sembra scritto in aramaico ma le collisioni sono toste, ed io sono sveglio dalle 6:00