zoukankan      html  css  js  c++  java
  • 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);
        }
    });
  • 相关阅读:
    批量备份mysql数据库(shell编程)
    批量检查多个网址是否正常(shell编程)
    就linux三剑客简单归纳
    sql语句浅谈以及mysql遇到的问题解决见解
    linux shell每天一阅 -- 安装nginx以及apache
    Linux文件系统检查错误
    Linux账号管理和ACL
    简书博客
    Block内的强引用
    一次没有意义的优化
  • 原文地址:https://www.cnblogs.com/linn/p/3653340.html
Copyright © 2011-2022 走看看