Box2dWeb로 스프링 만들기

17018 단어 JavaScriptBox2dWeb
이번에는 box2dweb로 거리 연결을 해보도록 하겠습니다.
용수철과 범퍼 같은 동작을 실현하다.
이번 캡처는
두 충돌 대상을 연결하는 곳에는 용수철과 같은 동작이 있다

이번의 모든 소스 코드는
test.html
<canvas id="canvas" width="600px" height="420px" style="background-color:#333333;"></canvas>

<script type="text/javascript" src="Box2dWeb-2.1.a.3.min.js"></script>
<script type="text/javascript">

    // Box2Dオブジェクトを取得
    var b2Vec2 = Box2D.Common.Math.b2Vec2 // 2Dベクトル
     ,  b2BodyDef = Box2D.Dynamics.b2BodyDef // Body定義
     ,  b2Body = Box2D.Dynamics.b2Body // Body
     ,  b2FixtureDef = Box2D.Dynamics.b2FixtureDef // Fixture定義
     ,  b2Fixture = Box2D.Dynamics.b2Fixture // Fixture
     ,  b2World = Box2D.Dynamics.b2World // 物理世界
     ,  b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape // 衝突オブジェクトの形状(ポリゴン)
     ,  b2CircleShape = Box2D.Collision.Shapes.b2CircleShape  // 衝突オブジェクトの形状(円)
     ,  b2DistanceJointDef = Box2D.Dynamics.Joints.b2DistanceJointDef // 距離ジョイント
     ,  b2DebugDraw = Box2D.Dynamics.b2DebugDraw // デバッグ描画


    // 世界を作る
    var world = new b2World(new b2Vec2(0,10), true);

    ////////////////////////////////////////////////


    //box1      
    var bodyDef = new b2BodyDef;
    bodyDef.type = b2Body.b2_dynamicBody;
    bodyDef.position.Set(10,2);

    var fixDef = new b2FixtureDef;
    fixDef.density = 10.0;
    fixDef.friction = 0.5;
    fixDef.restitution = .5;

    fixDef.shape = new b2PolygonShape;
    fixDef.shape.SetAsBox(1,1);

    var box1 = world.CreateBody(bodyDef);
    box1.CreateFixture(fixDef);

    //box2
    bodyDef.position.Set(12,8);
    fixDef.restitution = .2; 
    fixDef.shape = new b2PolygonShape;
    fixDef.shape.SetAsBox(1,1);

    var box2 = world.CreateBody(bodyDef);
    box2.CreateFixture(fixDef);

    // 地面
    var holderDef = new b2BodyDef;
    holderDef.type = b2Body.b2_staticBody;
    holderDef.position.Set(10, 14);

    var fd = new b2FixtureDef;
    fd.shape = new b2PolygonShape;
    fd.shape.SetAsBox(10,1);

    var ground = world.CreateBody(holderDef);
    ground.CreateFixture(fd);

    // 距離ジョイント
    var myjoint = new b2DistanceJointDef();
    var worldAnchorOnBody1 = new b2Vec2(box1.GetPosition().x, box1.GetPosition().y);
    var worldAnchorOnBody2 = new b2Vec2(box2.GetPosition().x, box2.GetPosition().y);
    myjoint.Initialize(box1, box2, worldAnchorOnBody1,worldAnchorOnBody2);
    myjoint.collideConnected = true;
    myjoint.frequencyHz = 1.0;
    myjoint.dampingRatio = 0.1;
    var distance_joint = world.CreateJoint(myjoint);

     ////////////////////////////////////////////////

    // デバッグ描画の設定      
    var debugDraw = new b2DebugDraw();
    debugDraw.SetSprite ( document.getElementById ("canvas").getContext ("2d"));
    debugDraw.SetDrawScale(30);     //描画スケール
    debugDraw.SetFillAlpha(0.3);    //半透明値
    debugDraw.SetLineThickness(1.0);//線の太さ
    debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);// 何をデバッグ描画するか
    world.SetDebugDraw(debugDraw);

    window.setInterval(update,1000/60);

    function update() {
        world.Step(1 / 60, 10, 10); // 物理世界を更新する
        world.DrawDebugData(); // デバック描画
        world.ClearForces(); // 物理世界上の力をリセットする
    };

</script>
거리 연결 변수 추가
    var b2DistanceJointDef = Box2D.Dynamics.Joints.b2DistanceJointDef // 距離ジョイント
거리 조인트를 정의하는 위치는 다음과 같습니다.
Initialize 함수에서 두 충돌 객체의 잠금 점을 지정합니다.
    // 距離ジョイント
    var myjoint = new b2DistanceJointDef();
    var worldAnchorOnBody1 = new b2Vec2(box1.GetPosition().x, box1.GetPosition().y);
    var worldAnchorOnBody2 = new b2Vec2(box2.GetPosition().x, box2.GetPosition().y);
    myjoint.Initialize(box1, box2, worldAnchorOnBody1,worldAnchorOnBody2);
    myjoint.collideConnected = true;
    myjoint.frequencyHz = 1.0;
    myjoint.dampingRatio = 0.1;
    var distance_joint = world.CreateJoint(myjoint);

좋은 웹페이지 즐겨찾기