2

私はXNAで2Dゲームを開発しており、現在、物理学のクラスに取り組んでいます。私の現在のタスクは、オブジェクトが別のオブジェクトと衝突したときにオブジェクトを停止することです。2つのオブジェクトが衝突するたびに、ゲームでこの関数を呼び出すようにしました。

public void BlockMovement(gameObject target) {
    //you can call width by just typing width. same for height
    owner.position.X += (owner.position.X - target.position.X);
    owner.position.Y += (owner.position.Y - target.position.Y);
} 

問題は、停止する代わりにそれです。移動していたオブジェクトは、その幅の分だけ押し戻されます。誰かがこれを行う方法を教えてください/教えてもらえますか私は多くのプロジェクトでこれに長い間立ち往生しています。

ありがとう

4

2 に答える 2

1

ターゲットと所有者の幅と高さを計算に入れていません。ターゲット/所有者のX、Yはどこにありますか?真ん中?左上?

衝突が直接の場合、

velocity=sqrt(x_velocity*x_velocity+y_velocity*y_velocity); //some pseudo   

public void BlockMovement(gameObject target) {
    //you can call width by just typing width. same for height
    owner.position.X -=owner.x_velocity*penetration_length/(owner.velocity);
    owner.position.Y -=owner.y_velocity*penetration_length/(owner.velocity);
} 

//so, if big part of speed is in x-direction then the position will
//change mostly on x-direction and opposite to velocity

速度変数がない場合は、2回の反復の位置履歴を導入して、実際の速度方向を計算できます。

于 2012-09-07T19:20:01.110 に答える
0

2つの選択肢があります。

1)移動する前に衝突を予測し、衝突が発生しないようにします。または2)移動し、衝突を検出して、それに応じて衝突を解決します。

私のゲームでは、方法2を使用して、オブジェクトが通過できないタイルと衝突したときにオブジェクトを停止します。このような手順を以下に説明します。

objectPreviousPosition = object.position
object.move()
if(object.isCollidingWith(wall))
    object.position = objectPreviousPosition

これは非常に基本的なものであり、衝突がどのように検出されるかについては説明していません。衝突ロジックがtrueを返した場合の対処方法についてのみ説明しています。また、この方法では、プレーヤーの更新によって衝突が発生した場合に、すべての動きが防止されます。したがって、この方法を使用して壁に沿って「スライド」効果を実現することはできません。

必要に応じてスライド効果を実現するには、プレーヤーの移動方向を決定し、その方向に基づいてプレーヤーの位置を調整して衝突を解決する必要があります。

例えば:

if(object.movementDirection == movementDirection.UpRight)
    if(player colliding with wall to right)
        keep Y coordinate and set X coordinate to put player on left side of wall

これはすべて擬似コードであるため、コードをリテラルと見なさないでください。

于 2012-09-07T18:06:04.820 に答える