0

私は単純なプラットフォーマーに取り組んでおり、いくつかの衝突システムを経験してから、これまでのところ期待できるほど安定しているソリューションを最終的に見つけました。それは、プレイヤーが y 軸の CENTER 位置が 0 に等しいブロックと衝突するまでです。最初に x の動き/衝突をチェックするので、y 軸だけにあると思われますが、非常に奇妙です。何も思いつきません。

単純な AABB タイプのコリジョン チェック/レスポンスを実行します。最初に x 速度を適用し、オーバーラップする場合は、プレーヤーの位置を変更して、右のプレイヤー バウンド = 左のブロック バウンドがオーバーラップから抜け出すようにします。次に、プレーヤーの垂直方向を y 軸にして同じことを行い、プレーヤーがブロックの下側または上側に当たったかどうかを調べます。唯一のコントロールはジャンプです。プレイヤーは正の x 方向に加速力を持っているため、左に移動することはありません。

問題は、プレーヤーが青い点線のブロックから離れますが、赤い点線のブロックに当たると Y 軸で衝突が検出されるため、プレーヤーはオーバーラップから上に移動しますが、次のフレームでプレーヤーの速度が x で実行されることです。通常どおり追加されますが、衝突が登録され、プレーヤーが赤いブロックの左側に配置されます。次のフレームは青いブロックとの衝突を検出し、以下に示すようにプレーヤーをその上に配置します。

以下のセットアップでは、プレーヤーがこのシーケンスをループします。

例

情報:

player.centerPosition = (2, 2)

player.width = 0.5f

プレーヤーの高さ = 0.8f

blueBlock.centerPosition = (1, 1)

redBlock.centerPosition = (4, 0)

ブロックの幅 = 3

ブロックの高さ = 1

private void checkBlockCollision(float deltaTime) {
    List<GameObject> colliders = grid.getPotentialColliders(player);
    int len = colliders.size();
    for (int axis=0;axis<2;axis++) { // 0 = X-axis, 1 = Y-axis
        if (axis == 0) {
            player.position.add(player.velocity.x*deltaTime, 0);
            player.updateBounds();
        } else {
            player.position.add(0, player.velocity.y*deltaTime);
            player.updateBounds();
        }
        for (int i=0;i<len;i++) { // Cycle through all blocks found in broad phase
            GameObject collider = colliders.get(i);
            if (OverlapTester.overlapRectangles(player.bounds, collider.bounds)) {
                if (axis == 0) {
                    player.position.x = collider.position.x - (Player.PLAYER_WIDTH + collider.bounds.width)/2;
                    player.velocity.x = 0f;
                    Log.d("TAG", "Move player LEFT");
                } else {
                    if (player.velocity.y > 0) {
                        player.position.y = collider.position.y - (Player.PLAYER_HEIGHT + collider.bounds.height)/2;
                        player.velocity.y = -player.velocity.y*0.333f;
                        Log.d("TAG", "Move player DOWN");
                    } else {
                        player.position.y = collider.position.y + (Player.PLAYER_HEIGHT + collider.bounds.height)/2;
                        player.velocity.y = 0;
                        player.state = Player.PLAYER_STATE_GROUNDED;
                        Log.d("TAG", "Move player UP");
                    } 
                }
            }
        } // end for loop colliders
    } // end for loop axis
} // END METHOD

誰かがトラックがここで何が起こっているのかに光を当てることができれば、それは素晴らしいことです. 読んでくれてありがとう。興味のある人にさらに情報やソースを提供できます。

マリオス・カロゲロウ

解決:

私の問題に対する迅速で汚い修正を見つけました。プレイヤーをさらに 0.001 単位上に移動しただけで、実際にオブジェクトが分離されました。他のブロックは正常に機能していたので、それは奇妙です。それを読んでくれてありがとう。私の解決策が同様の問題を抱えている人に役立つことを願っています。

4

0 に答える 0