今のプログラムでは、座標を足してから戻そうとしてますが、XとYを1ずつ引いても、左か上に動きながら壁に当たるとうまくいきません。 本当は今のように壁にめり込んだ分を計算して戻すのが理想ですが、 長いプログラムになりそうなので、 動くのが今の早さ程度だったら次のやりかたの方が簡単に済みます。 座標を足す前に BGGET(1,X+SX,Y+SY)==832 と判定して、 壁に当たる場合は動かさない、とすると、自然な動きになりそうです。 また、スプライトの大きさは16x16あるので、今だと左上の一点しか当たり判定がありません。左上・右上・左下・右下の4点を取らないと、うまくいってないように見えると思います。