0

友人と私はトップダウン パズル ゲームを開発しています。
壁を歩いて衝突できるプレイヤー クラスを既に実装していますが、問題は衝突自体の後です。

例:
プレイヤーが右側の壁にぶつかると、x軸の速度が0に設定され、プレイヤーは停止します。しかしその後、ユーザーがupキーを押すと、プレーヤーは 1 ピクセル上に移動し、再び停止します。
その後、右と上を交互に押し続けると、プレイヤーはピクセルごとに壁を通り抜けます。

プレイヤーは壁を通り抜けます

そして、ここにプレーヤーの衝突検出があります:

for (int i = 0; i < lvl.getSizeInTiles().x; i++) {
        for (int j = 0; j < lvl.getSizeInTiles().y; j++) {
            if (lvl.getTileFromBuffer(i, j).getType() == "wall") {
                if (intersects(lvl.getTileFromBuffer(i, j).getPosition().x, lvl.getTileFromBuffer(i, j).getPosition().y, lvl.getTileFromBuffer(i, j).getSize().x, lvl.getTileFromBuffer(i, j).getSize().y)) {
                    if (faceDirection == "UP" && vel.y < 0) {
                        collidesUp = true;
                    }
                    else {
                        collidesUp = false;
                    }

                    if (faceDirection == "DOWN" && vel.y > 0) {
                        collidesDown = true;
                    }
                    else {
                        collidesDown = false;
                    }

                    if (faceDirection == "LEFT" && vel.x < 0) {
                        collidesLeft = true;
                    }
                    else {
                        collidesLeft = false;
                    }

                    if (faceDirection == "RIGHT" && vel.x > 0) {
                        collidesRight = true;
                    }
                    else {
                        collidesRight = false;
                    }
                }
            }
        }
    }
}
if (vel.x > 0 && !collidesRight) {
    pos.x += vel.x;
}
if (vel.x < 0 && !collidesLeft) {
    pos.x += vel.x;
}
if (vel.y > 0 && !collidesDown) {
    pos.y += vel.y;
}
if (vel.y < 0 && !collidesUp) {
    pos.y += vel.y;
}

簡単なメモ:このintersect(x, y, w, h)関数はプレーヤー クラスの一部です。必要な場合はお知らせください。

コードに関する返信をお送りいただくか、解決策を見つけることができる場所へのリンクをお送りいただければ幸いです。

助けてくれてありがとう、そして必要なら質問してください、アラドとロン。

4

1 に答える 1

0

提供された情報からの推測にすぎませんが、壁を通り抜けるとき、キャラクターは実際には右を向いていないことに注意してください. 上を向いているので、collidesRight は false になります。キャラクターが向いている方向に基づいて動きを禁止する代わりに、位置のみに基づいて禁止します。

if (intersecting_right(player, wall) && player.x_vel > 0)
    player.x_vel = 0;
于 2018-06-13T14:58:14.400 に答える