BOX2D测试

var TAG_SPRITE_MANAGER = 1;
var PTM_RATIO = 32;

Box2DTestLayer = cc.Layer.extend({
    world:null,
    //GLESDebugDraw *m_debugDraw;

    ctor:function () {
        this._super();

        cc.eventManager.addListener(cc.EventListener.create({
            event: cc.EventListener.TOUCH_ALL_AT_ONCE,
            onTouchesEnded: function(touches, event){
                //Add a new body/atlas sprite at the touched location
                var touch = touches[0];
                var location = touch.getLocation();
                event.getCurrentTarget().addNewSpriteWithCoords(location);
            }
        }), this);

        var b2Vec2 = Box2D.Common.Math.b2Vec2
            , b2BodyDef = Box2D.Dynamics.b2BodyDef
            , b2Body = Box2D.Dynamics.b2Body
            , b2FixtureDef = Box2D.Dynamics.b2FixtureDef
            , b2World = Box2D.Dynamics.b2World
            , b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape
            , b2CircleShape = Box2D.Collision.Shapes.b2CircleShape;

        var screenSize = cc.director.getWinSize();
        //UXLog(L"Screen width %0.2f screen height %0.2f",screenSize.width,screenSize.height);

        // Construct a world object, which will hold and simulate the rigid bodies.
        // 重力系数
        var gravity = new b2Vec2(0,-10); //new b2Vec2(0, -10)
        //允许睡眠
        var allowSleep = true;
        this.world = new b2World(gravity, allowSleep);
        // 允许物理现象
        this.world.SetContinuousPhysics(true);

        // Define the ground body.
        //var groundBodyDef = new b2BodyDef(); // TODO
        //groundBodyDef.position.Set(screenSize.width / 2 / PTM_RATIO, screenSize.height / 2 / PTM_RATIO); // bottom-left corner

        // Call the body factory which allocates memory for the ground body
        // from a pool and creates the ground box shape (also from a pool).
        // The body is also added to the world.
        //var groundBody = this.world.CreateBody(groundBodyDef);

        var fixDef = new b2FixtureDef;
        fixDef.density = 1.0; //密度
        fixDef.friction = 0.8; //摩擦
        fixDef.restitution = 1; //弹性

        //创建刚体定义数据对象
        var bodyDef = new b2BodyDef;

        //create ground

        //为静态刚体, 即不受碰撞影响
        bodyDef.type = b2Body.b2_staticBody;
        //设备形状为圆形
        fixDef.shape = new b2PolygonShape;//多边形
        //设置为矩形
        fixDef.shape.SetAsBox(20, 2);
        // upper
        // PTM_RATIO代表32个像素是一米
        bodyDef.position.Set(10, screenSize.height / PTM_RATIO);

        //世界创建刚体, 刚体创建设备, 设备拥有形状
        var body = this.world.CreateBody(bodyDef);
        body.CreateFixture(fixDef);

        // bottom
        bodyDef.position.Set(10, -1.8);
        this.world.CreateBody(bodyDef).CreateFixture(fixDef);

        fixDef.shape.SetAsBox(2, 14);
        // left
        bodyDef.position.Set(-1.8, 13);
        this.world.CreateBody(bodyDef).CreateFixture(fixDef);
        // right
        bodyDef.position.Set(26.8, 13);
        this.world.CreateBody(bodyDef).CreateFixture(fixDef);

        //Set up sprite

        // var mgr = cc.SpriteBatchNode.create(res.s_pathBlock, 150);
        // this.addChild(mgr, 0, TAG_SPRITE_MANAGER);
        var ball = new Ball(); //cc.Sprite.create(res.b_ball_01);
        this.addChild(ball,0,TAG_SPRITE_MANAGER);


        this.addNewSpriteWithCoords(cc.p(screenSize.width / 2, screenSize.height / 2));


        this.scheduleUpdate();
    },

    addNewSpriteWithCoords:function (p) {
        //UXLog(L"Add sprite %0.2f x %02.f",p.x,p.y);
        /*
         var batch = this.getChildByTag(TAG_SPRITE_MANAGER);

         //We have a 64x64 sprite sheet with 4 different 32x32 images.  The following code is
         //just randomly picking one of the images
         var idx = (Math.random() > .5 ? 0 : 1);
         var idy = (Math.random() > .5 ? 0 : 1);
         var sprite = cc.Sprite.create(batch.texture, cc.rect(32 * idx, 32 * idy, 32, 32));
         batch.addChild(sprite);
         */
        var sprite = this.getChildByTag(TAG_SPRITE_MANAGER);
        sprite.x = p.x;
        sprite.y = p.y;

        // Define the dynamic body.
        //Set up a 1m squared box in the physics world
        var b2BodyDef = Box2D.Dynamics.b2BodyDef
            , b2Body = Box2D.Dynamics.b2Body
            , b2FixtureDef = Box2D.Dynamics.b2FixtureDef
            , b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape;

        var bodyDef = new b2BodyDef();
        bodyDef.type = b2Body.b2_dynamicBody;
        bodyDef.position.Set(p.x / PTM_RATIO, p.y / PTM_RATIO);
        bodyDef.userData = sprite;
        var body = this.world.CreateBody(bodyDef);

        // Define another box shape for our dynamic body.
        var dynamicBox = new b2PolygonShape();
        dynamicBox.SetAsBox(0.5, 0.5);//These are mid points for our 1m box

        // Define the dynamic body fixture.
        var fixtureDef = new b2FixtureDef();
        fixtureDef.shape = dynamicBox;
        fixtureDef.density = 1.0;
        fixtureDef.friction = 0.3;
        body.CreateFixture(fixtureDef);

    },
    update:function (dt) {
        //It is recommended that a fixed time step is used with Box2D for stability
        //of the simulation, however, we are using a variable time step here.
        //You need to make an informed choice, the following URL is useful
        //http://gafferongames.com/game-physics/fix-your-timestep/

        var velocityIterations = 8;
        var positionIterations = 1;

        // Instruct the world to perform a single step of simulation. It is
        // generally best to keep the time step and iterations fixed.
        this.world.Step(dt, velocityIterations, positionIterations);

        //Iterate over the bodies in the physics world
        for (var b = this.world.GetBodyList(); b; b = b.GetNext()) {
            if (b.GetUserData() != null) {
                //Synchronize the AtlasSprites position and rotation with the corresponding body
                var myActor = b.GetUserData();
                myActor.x = b.GetPosition().x * PTM_RATIO;
                myActor.y = b.GetPosition().y * PTM_RATIO;
                myActor.rotation = -1 * cc.RADIANS_TO_DEGREES(b.GetAngle());
            }
        }

    }
    //CREATE_NODE(Box2DTestLayer);
});

var Box2DTestScene = cc.Scene.extend({
    onEnter:function () {
        this._super();
        var pLayer = new Box2DTestLayer();
        this.addChild(pLayer);
    }
});
原文地址:https://www.cnblogs.com/linn/p/3653340.html