0

さて、ゲームを作る過程でうなじとイムに比較的新しいイム、私はタイプキネマティックのプラットフォームと呼ばれるボディを作りました、そして私は単にそれをステージ上の特定の範囲で前後に動かしたいと思います。誰かが私がどこで間違っているのか見てください、ありがとう。

private function enterFrameHandler(ev:Event):void
{
if (movingPlatform.position.x <= 150 )
            {
                movingPlatform.position.x +=  10;
            }
            if (movingPlatform.position.x >= 260)
            {
                movingPlatform.velocity.x -=  10;
            }
}
4

2 に答える 2

2

まず、ifブロックposition.xの1つで10ずつインクリメントし、もう1つで10ずつデクリメントします。両方のvelocity.x意味だと思います。position.x

次に、想像してみmovingPlatform.position.xてください。150で、enterFrameHandler1回実行します。movingPlatform.position.x160は160になり、次回enterFrameHandlerは呼び出されます。160は150以下でも260以上でもないため、ifブロックは実行されません。

速度を使用して、移動している側を示し、エッジを超えたら、次のように反転することができます。

// assuming velocity is (1,0)
private function enterFrameHandler(ev:Event):void {
    if (movingPlatform.position.x <= 150 || movingPlatform.position.x >= 260) {
        movingPlatform.velocity.x = -movingPlatform.velocity.x;
    }

    movingPlatform.position.x += movingPlatform.velocity.x;
}

明らかに、オブジェクトがすでにx = 100にある場合、これは問題を引き起こす可能性があります。オブジェクトは速度を反転し続けるだけなので、150〜260の間に配置するか、方向を2回以上反転しないようにチェックを追加してください。 。

これはそれを行うためのより良い方法かもしれません:

// assuming velocity is (1,0)
private function enterFrameHandler(ev:Event):void {
    if (movingPlatform.position.x <= 150) {
        movingPlatform.velocity.x = 1;
    } else if (movingPlatform.position.x >= 260) {
        movingPlatform.velocity.x = -1;
    }

    movingPlatform.position.x += movingPlatform.velocity.x;
}
于 2013-03-26T20:25:44.380 に答える
1

一般に:

キネマティックボディは速度のみで移動することになっています。位置を直接変更すると、「テレポーティング」ほど実際には移動しません。物理学に関する限り、速度は正確に0であるため、衝突や摩擦は期待どおりに機能しません。

速度ではなく位置を引き続き使用する場合は、キネマティクス用に設計されたBodyクラスのメソッドsetVelocityFromTargetがあります。

body.setVelocityFromTarget(targetPosition, targetRotation, deltaTime);

ここで、deltaTimeは、次のspace.step()の呼び出しで使用しようとしているタイムステップです。

これが実際に行っているのは、現在の位置/回転、目標位置/回転、およびそこに到達するのにかかる時間に基づいて、適切な速度とangularVelを設定することです。

于 2013-03-26T20:57:15.460 に答える