マリオに関しては、まず移動させておいてから
めり込んでいる部分を押し返すだけでいいんじゃないかな、貫通するほどの速度もないし。
どの方向からぶつかったかというのはあまり意識しなくていいと思う。

ダッシュで1ブロック分の隙間を走り抜けたりするのも、意識しなくても勝手に再現されるよ。
プレイヤーの上昇方向の判定を少し狭くしておくと、
ジャンプが微妙にすり抜けて上の足場に着地するのも再現される。
ある程度めりこみが発生するのは構わないという前提で、甘めに判定するのがコツ。

HTMLとJavaScriptだけで作られたマリオ
ttp://www.janis.or.jp/users/segabito/JavaScriptMaryo.html