移動について、座標の更新と壁判定の処理をそれぞれ関数化してコードを整理したいのですが
上手くいかないので助言を頂けると助かります.
問題点について詳しく説明します.
自分は参考書に書かれてるように移動と壁判定は下記のように分けてすっきりさせたいのですが
void Update(){
move();
collide();
}
自分の描いた実際に書いたソースコードはこのようになってます.
void Player::move() {
vy = (y - prev_y) + F;
if (vy > BaseSize - 1) {
vy = BaseSize - 1;
}
if (vy < -BaseSize + 1) {
vy = -BaseSize + 1;
}
prev_y = y;
y = y + vy;
F = 1;
x = x + vx;
//天井にぶつかったかどうかの判定
if (stage->Collision(x, y) || stage->Collision(x + width - 1, y)) {
y = y / BaseSize * BaseSize + BaseSize;
}
//床に着いてるかどうかの判定
if (stage->Collision(x, y + height - 1) || stage->Collision(x + width - 1, y + height - 1)) {
vy = 0;
jumping = false;
y = y / BaseSize * BaseSize;
}
//x = x + vx;
//左側の壁にぶつかってるかの判定
if (stage->Collision(x, y) || stage->Collision(x, y + height - 1)) {
x = x / BaseSize * BaseSize + BaseSize;
}
//右側の壁にぶつかってるかの判定
if (stage->Collision(x + width - 1, y) || stage->Collision(x + width - 1, y + height - 1)) {
x = x / BaseSize * BaseSize;
}
if (CheckHitKey(KEY_INPUT_Z) && !jumping) {
F = -20;
jumping = true;
}
}
BaseSizeはゲームオブジェクト全体の基本的なサイズで整数の32になっています
FはVerlet積分でのジャンプの処理に使っている変数です
Collision(x,y)はstageクラスが持つ2次元配列の地形データTerrain[y][x]が1か0を返す関数です
y座標の更新の直後に天井と床の判定が来てその次に
x座標の更新、左右の壁の判定が来るという感じで
座標の更新と壁判定が交互になっている状態です
x座標の更新をy座標の更新の直後に書いてコンパイルすると左右の壁にぶつかるとプレイヤーが床を突き抜けて画面に飛び出してしまいます。
どうすればよいでしょうか?