書籍のプログラムでは、キッチリと
『キャラ画像の左上端にブロックがあるか』
『キャラ画像の右上端にブロックがあるか』
で、頭を天井にぶつけているかを判定しているので、
『壁にぴったりくっついた状態で右移動しつつジャンプ』をすると
1フレーム後は右に3ピクセル移動(60fps換算)した状態( 壁にめり込んだ状態 )での判定が行われ、
『壁に当たっていると同時に頭も天井にぶつけている』と判定されてしまいます
簡単な解決方法は gamemain.cpp の CheckBlock 関数の以下の部分
result.UL = _CheckBlockSub(x, y);
result.UR = _CheckBlockSub(x + IMG_CHIPSIZE - 1, y);
を
result.UL = _CheckBlockSub(x + 8, y);
result.UR = _CheckBlockSub(x + IMG_CHIPSIZE - 1 - 8, y);
このように、キッチリ左上端・右上端を調べるのではなく、キャラが1フレームに
移動する距離より内側の位置で天井の判定を行う方法です
これだけで1フレームで3ピクセルぶんプレイヤーキャラが左右に移動した状態で天井判定しても
『天井に頭をぶつけている』という判定にはなりません
よろしければお試しください