1

だから私は、プレーヤーが地面ではなく更新されるたびに下に移動する単純な衝突検出を行っていますが、地面にある場合は、位置と地面の違いを移動します。しかし、私はぎくしゃくしています(上下に動きすぎて、完全に静止していません)。

私の質問は次のとおりです。このコードで差を適切に計算するにはどうすればよいですか?

Vector3f pos = new Vector3f(25,-50,25);
//Vector3f pos = new Vector3f(25,-50,25); isn't actually in the update method, 
//but is in the object's constructer.

onGround = false;

Vector3f projPos = new Vector3f(pos);
projPos.y += fallSpeed;
//get a vector of all the triangles touching the player
Vector<Tri> tris = getTrisTouching(pos);

float minY;

//make it so if we don't have a list we don't get tossed into infinity
if(tris.size() > 0) minY = Float.POSITIVE_INFINITY;
else minY = 0;

for(int i = 0; i < tris.size(); i++){
    Tri tri = tris.get(i);
    if(projPos.y + radius <= tri.max.y){

        float difference = tri.min.y - projPos.y;
        if(difference < minY) minY = difference;
        onGround = true;
    }
}

if(onGround){
    pos.y = minY;           
}

else{
    pos.y = projPos.y;
}
4

1 に答える 1

2

あなたの衝突検出コード (最初の 'if' ステートメント内の 3 行) は紛らわしいですが、地面にいるとき、プレーヤーは三角形に触れないと仮定しましょう (三角形の上に 1 ピクセルある可能性があるため)。次のフレームで下に移動し、次のフレームで上に移動します。

おそらく修正は、実際の位置の代わりに for ループ内で projPos を使用することです。

于 2012-06-24T22:19:26.390 に答える