1

シンプルなテニスゲームを作ろうとしています。両側に壁があります。ボックスとボールもあります。私の環境には重力がありません。ボックスとボールには速度がありません。ボックスがボールに接触すると (私はこれをマウスで異なる速度で動かします)、それ (ボール) はその位置を変えるだけで動き続けず、時々これらのオブジェクトが互いに衝突しません:

ここに画像の説明を入力

角度や強さを変えてボールを打てる箱が欲しい。

ここに画像の説明を入力

これどうやってするの?ボールとボックスのプロパティで何を変更すればよいですか?

コード スニペットは次のとおりです。

public void createBall(Vector2 position, Vector2 velocity, float angle, Object userData){
    // First we create a body definition
    BodyDef bodyDef = new BodyDef();
    // We set our body to dynamic, for something like ground which doesnt move we would set it to StaticBody
    bodyDef.type = BodyType.DynamicBody;
    // Set our body's starting position in the world
    bodyDef.position.set(position);

    // Create our body in the world using our body definition
    Body body = world.createBody(bodyDef);

    body.setUserData(userData);
    // Create a circle shape and set its radius to 6
    CircleShape circle = new CircleShape();
    circle.setRadius(10f);

    PolygonShape poly = new PolygonShape();     
    poly.setAsBox(12, 12);

    // Create a fixture definition to apply our shape to
    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = circle;
    fixtureDef.density = 0.0f; 
    fixtureDef.friction = 0.2f;
    fixtureDef.restitution = 1f; // Make it bounce a little bit
    fixtureDef.isSensor=false;

    // Create our fixture and attach it to the body
    Fixture f = body.createFixture(fixtureDef);
    f.setUserData("ball");      
    circle.dispose();   
}

  private Body createBox(World world, float width, float height, float density) {
        BodyDef def = new BodyDef();
        def.type =  BodyType.KinematicBody;
        Body box = world.createBody(def);

        PolygonShape poly = new PolygonShape();
        poly.setAsBox(width/2, height/2);

        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = poly;
        fixtureDef.density = 0.0f; 
        fixtureDef.friction = 0.3f;
        fixtureDef.restitution = 0.1f; // Make it bounce a little bit
        fixtureDef.isSensor=false;

        // Create our fixture and attach it to the body
        Fixture f = box.createFixture(fixtureDef);
        f.setUserData("platform");
        poly.dispose();

        return box;
    }
        public void createWall(World world, Vector2 position, float hx, float hy){
    // Create our body definition
    BodyDef groundBodyDef =new BodyDef();  
    // Set its world position
    groundBodyDef.position.set(position);  
        groundBodyDef.type=BodyType.StaticBody;
    // Create a body from the defintion and add it to the world
    Body groundBody = world.createBody(groundBodyDef);  

    // Create a polygon shape
    PolygonShape groundBox = new PolygonShape();  
    // Set the polygon shape as a box which is twice the size of our view port and 20 high
    // (setAsBox takes half-width and half-height as arguments)
    groundBox.setAsBox(hx, hy);
    // Create a fixture from our polygon shape and add it to our ground body  
    groundBody.createFixture(groundBox, 0.0f); 
    // Clean up after ourselves
    groundBox.dispose();
}
4

3 に答える 3

3

ボックスの位置を変更することで、ボックスを移動しています。しかし、衝突解決の重要な部分は速度です。また、ボックスの速度は常にゼロです (box2d のルック ポイントから)。したがって、奇妙な衝突解決が発生します

于 2013-07-01T14:26:28.100 に答える
1

画面の幅と高さが大きすぎると思います...その場合は、ワールドの幅と高さを使用してみてください... 20x12 単位.. 800x480 ではありません。

于 2013-07-01T13:56:58.567 に答える
0

Box2D は、フィクスチャの密度が 0 であるボディが好きではありません。通常、シミュレーションは何とか実行されますが、動作が正しくありません。たとえば、値 0.3 を試してください。

オーバーラップの問題は、フラグ b2BodyDef::bullet を設定することで解決できる場合があります。Box2D リファレンスからの説明:

bool b2BodyDef::弾丸

これは、他の移動体をトンネリングすることを防止する必要がある高速移動体ですか? すべてのボディは、キネマティック ボディとスタティック ボディを通過できないことに注意してください。この設定は、ダイナミック ボディでのみ考慮されます。

警告: 処理時間が長くなるため、このフラグは慎重に使用する必要があります。

于 2013-07-01T10:33:33.637 に答える