2

...

同じサイズのタイルで構成されるマップ上を移動できるボールがあります。プレイヤーは、より暗く、黒い境界線を持つタイルの上を歩けないようにする必要があります。どのタイルがソリッドかを確認するために使用するタイルの多次元配列があります。

プレーヤーが水平方向と垂直方向の両方に移動している場合は、壁に対してスライドしてもらいたいと思います。問題は、彼がそうすると、壁にくっつくことです。私はそれを各軸で完全に機能させることができましたが、個別に. 水平衝突チェックのコードは次のとおりです。

if (vx < 0) {
    // checks for solid tiles left of the player
    if (level.isBlocked(i, j) || level.isBlocked(i, jj)) {
        x = side * (i + 1); // moves player to left side of tile
        vx = 0;
    }
} else if (vx > 0) {
    // checks for solid tiles right of the player
    if (level.isBlocked(ii, j) || level.isBlocked(ii, jj)) {
        x = (ii * side) - getWidth(); // moves player to right side of tile
        vx = 0;
    }
}

level.isBlocked ()メソッドは、配列のインデックスがソリッド タイルで占められているかどうかをチェックします。iおよびj変数は、プレーヤーの右上隅が配置されている配列内のインデックスです。ii変数とjj変数は、プレーヤーの右下隅が配置されている配列内のインデックスです。

これは問題なく動作しますが、同じコードのチャンクを下に追加して、xyに、vxvyに置き換えると、問題が発生します。したがって、水平または垂直の衝突処理を追加すると機能しますが、同時には機能しません。それらを分離する必要があるか何かを説明している記事をいくつか見ましたが、それらの多くを理解していませんでした. 両方の軸で衝突をチェックし、スライド効果を維持するにはどうすればよいですか?

4

2 に答える 2

2

私はついにそれを機能させました。Angelatlargeの答えは問題を理解するのに役立ちましたが、私は最初から始めることにしました。私は最初に新しいxとyの位置を計算し、それらを別々の変数に格納することになりました。次に、プレーヤーの左中央の下にあるタイルと、右中央にあるタイルを確認しました。次に、プレーヤーが水平速度のためにタイルの上に立っている場合は、ブール値をtrueに設定しました。衝突がなかった場合は、実際のx変数を以前に計算した新しい変数に設定しました。次に、垂直衝突についても同じことを繰り返しました。

これは、水平方向のチェック用です。

float newX = x + vx * delta;
boolean xCollision = false;
if (vx < 0) {
    int i = level.toIndex(x);
    int j = level.toIndex(y + getHeight() / 2);
    xCollision = level.isBlocked(i, j);
} else if (vx > 0) {
    int i = level.toIndex(x + getWidth());
    int j = level.toIndex(y + getHeight() / 2);
    xCollision = level.isBlocked(i, j);
}
if (!xCollision) x = newX;
于 2013-03-21T11:09:34.327 に答える
1

問題は、ブロックとプレーヤーの位置が与えられ、それらが重なっているという事実を考えると、プレーヤーがブロックの垂直壁と水平壁のどちらに衝突したかがわからないということです。したがって、これをより明確に見て、次のブロックと2つの衝突パスを検討してください ここに画像の説明を入力してください

上のパスは左の壁と衝突し、vx=0;(水平方向の動きの停止)を必要としますが、下のパスは下の壁と衝突し vy=0;、垂直方向の動きを停止する必要があります。

希望する種類の衝突検出を行うには、プレーヤーがブロックと重なっているかどうかを確認するだけでなく、プレーヤーのパスとブロックの壁の交差を計算する必要があると思います。プレーヤーの長方形とブロックの長方形の重なり合う長方形を計算することで、目的の動作をハックできます。次の状況を考慮してください。

ここに画像の説明を入力してください

ここで、赤いシーケンスはプレーヤーを表します。オーバーラップ長方形(プレーヤーがブロックの上にある場所にある小さな長方形)が高さよりも広いという事実は、水平方向ではなく垂直方向の衝突が発生したことを示しています。ただし、これは絶対確実ではありません。また、プレーヤーの長方形の一部がブロックと重なっているかどうかをテストするだけでなく、ブロックの形状にアクセスできる必要があります。

于 2013-03-09T20:28:08.373 に答える