2

衝突検出を変更して正しく機能させる方法を見つけようとして立ち往生しています。すべての壁オブジェクトをリスト内に積み重ねてから、プレーヤーが移動すると、各壁オブジェクトをループして DetectCollision メソッドを呼び出すと、true または false が返されます。オブジェクトが壁の内側にあるかどうかによって異なります。

壁は衝突を検出します (X および Y 座標は壁の位置です)

public bool DetectCollision(float x, float y)
    {
        if ((x >= this.XCoordinate && x <= (this.XCoordinate + this.BlockWidth)) && (y >= this.YCoordinate && y <= (this.YCoordinate + this.BlockHeight)))
            return true;            
        else
            return false;
    }

したがって、プレーヤーが移動しようとすると、プレーヤー関数で一時的な X、Y 座標に動きを追加し、それらが壁に衝突するかどうかを確認し、何も起こらない場合はプレーヤーを移動します。

しかし、ゲームフィールドの内側に壁を追加すると、衝突検出のために右下隅のみがチェックされるので、正常に機能しないことに気付きました。

プレイヤーの移動方法:

        float x, y;
        if (direction == Direction.E)
        {
            x = LiveObjects.player.XCoordinate - MovementSpeed;
            y = LiveObjects.player.YCoordinate;
        }
        else if (direction == Direction.W)
        {
            x = LiveObjects.player.XCoordinate + MovementSpeed;
            y = LiveObjects.player.YCoordinate;
        }
        else if (direction == Direction.N)
        {
            x = LiveObjects.player.XCoordinate;
            y = LiveObjects.player.YCoordinate - MovementSpeed;
        }
        else
        {
            x = LiveObjects.player.XCoordinate;
            y = LiveObjects.player.YCoordinate + MovementSpeed;
        }

        if (GameMechanics.DetectWallCollision(x, y) || GameMechanics.DetectWallCollision((x + LiveObjects.player.BlockWidth), (y + LiveObjects.player.BlockHeight))
        {
            OnPlayerInvalidMove(null, new PlayerEventArgs());
            return;
        }

DetectWallCollision のループは次のとおりです。

foreach (Wall wall in LiveObjects.walls)
        {
            if (wall.DetectCollision(x, y))
                return true;
        }
        return false;

何か案は?

4

3 に答える 3

1

あなたの世界には無限に小さいもの (つまり、ピクセルのサイズ) はないと仮定しています。真のバウンディング ボックス コリジョンを実現するには、 1 つのオブジェクトだけでなく、両方のオブジェクトのサイズを考慮する必要があります。

boolean intersectsEntity(Entity e)
{
    return (e.position.x <= position.x + size.x) &&
           (e.position.y <= position.y + size.y) &&
           (e.position.x + e.size.x >= position.x) &&
           (e.position.y + e.size.y >= position.y);
}

もちろん、これはエンティティがその位置とサイズのベクトルを持っていることを前提としています。したがって、size.x == 幅、および size.y == 高さです。

于 2009-08-19T20:27:33.460 に答える
0

私を邪魔するものがあります.DetectCollisionメソッドが壁の位置を取得すると言いました-しかし、コードを正しく解釈すると、DetectWallCollisionにプレーヤーと手の位置(移動後の)であるxおよびyパラメーターを渡しますその位置から DetectCollision メソッドまで...

コードをデバッグして、コリジョン メソッドに渡される座標を確認し、if ステートメントが進むルートを追跡しましたか?

なんらかの理由でコードをデバッグできない場合 - トレース ファイルを作成してください - 解決策はあなたの膝に落ちると思います ;)

于 2009-08-19T10:51:49.440 に答える
0

あなたの東と西は間違った方向を向いています。左上が 0,0 の座標系で、下または右に移動するにつれて正の値が増加する場合、通常、西への移動は左への移動を意味し、X の値が減少することを意味し、東の場合はその逆になります。あなたは反対のことをしています。

于 2009-08-19T11:02:38.997 に答える