[cocos2d-js]chipmunk例子(二)

var TAG_SPRITE_BALL = 1;
var TAG_SPRITE_USER = 2;
var TAG_SPRITE_NPC = 3;
var PTM_RATIO = 32;
var GRABABLE_MASK_BIT = 1<<31;
var NOT_GRABABLE_MASK = ~GRABABLE_MASK_BIT;

var MainLayer = cc.Layer.extend({
    _ball:null,
    _man:null,
    _rpc:null,
    _leftGoal:null,
    _rightGoal:null,
    _leftPower:null,
    _rightPower:null,
    _time:0,

    space:null,

    ctor:function () {
        this._super();
        var size = cc.director.getWinSize();




        this._ball = new Ball();
        this._ball.x = size.width / 2;
        this._ball.y = size.height / 2;
        this.addChild(this._ball);


        // 左方向
        var btnLeft = cc.MenuItemImage.create(
            res.btn_left_up,
            res.btn_left_down,
            function () {
                this._man.runLeft();
            }, this);
        btnLeft.x = 50;

        // 右方向
        var btnRight = cc.MenuItemImage.create(
            res.btn_right_up,
            res.btn_right_down,
            function () {
                this._man.runRight();
            }, this);
        btnRight.x = 125;

        // power
        var btnPower = cc.MenuItemImage.create(
            res.btn_power_up,
            res.btn_power_down,
            function () {
                this._man.power();
            }, this);
        btnPower.x = 250;

        // jump
        var btnJump = cc.MenuItemImage.create(
            res.btn_jump_up,
            res.btn_jump_down,
            function () {
                this._man.jump();
            }, this);
        btnJump.x = 330;

        // kick
        var btnKick = cc.MenuItemImage.create(
            res.btn_kick_up,
            res.btn_kick_down,
            function () {
                this._man.kick();
            }, this);
        btnKick.x = 420;

        // 暂停
        var btnPause = cc.MenuItemImage.create(
            "res/pause.png",
            "res/pause2.png",
            function () {
                this.onStop();
            }, this);
        btnPause.x = size.width - 30;
        btnPause.y = size.height - 50;

        var menu = cc.Menu.create(btnLeft, btnRight, btnPower, btnJump, btnKick, btnPause);
        menu.x = 0;
        menu.y = 20;
        this.addChild(menu, 10);





        // 主角
        this._man = new Footballer_cn();
        this._man.flippedX = true;
        this._man.x = 150;
        this._man.y = 50;
        this._man.anchorX = 0.5;
        this._man.anchorY = 0;
        this.addChild(this._man,0,TAG_SPRITE_USER);
        this._npc = new Footballer_br();
        this._npc.x = size.width - 150;
        this._npc.y = 50;
        this._npc.anchorX = 0.5;
        this._npc.anchorY = 0;
        this.addChild(this._npc,0,TAG_SPRITE_NPC);

        // 球门
        this._leftGoal = new Goalpost(true);
        this._leftGoal.x = 0;
        this._leftGoal.y = 50;
        this._leftGoal.anchorX = 0;
        this._leftGoal.anchorY = 0;
        this.addChild(this._leftGoal);

        this._rightGoal = new Goalpost();
        this._rightGoal.x = size.width;
        this._rightGoal.y = 50;
        this._rightGoal.anchorX = 1;
        this._rightGoal.anchorY = 0;
        this.addChild(this._rightGoal);



        // power
        this._leftPower = new PowerProgress(size.width/2-15,size.height-20,1,0.5,this);
        this.addChild(this._leftPower, 10);
        this._rightPower = new PowerProgress(size.width/2+15,size.height-20,0,0.5,this);
        this.addChild(this._rightPower, 10);



        // 系统计划任务,即每帧调用update函数
        this.scheduleUpdate();
        // 自定义计划任务
        this.schedule(this.uiSchedule, 1);

        cc.sys.dumpRoot();
        cc.sys.garbageCollect();

        this.initChipmunk();

        return true;
    },
    onStop:function () {
        this._bStop = !this._bStop;
        if (this._bStop == true) {
            cc.director.pause();
        }
        else {
            cc.director.resume();
        }
    },

    update:function (dt) {
        this.space.step(dt);
    },
    uiSchedule:function () {
        this._time++;
        this._leftPower.showPower();
        this._rightPower.showPower();
    },
    initChipmunk:function() {
        this.space = new cp.Space();
        var sprite =  this.createPhysicsSprite( cc.p(cc.director.getWinSize().width/2 , cc.director.getWinSize().height-50) );
        this.addChild( sprite,100 );

        this.addWalls();
        this.space.gravity = cp.v(0, -100);
    },
    initPhysics:function() {
        var space = this.space ;
        var staticBody = space.staticBody;
        var winSize = cc.director.getWinSize();

        // Walls
        var walls = [ new cp.SegmentShape( staticBody, cp.v(0,0), cp.v(winSize.width,0), 0 ),                // bottom
            new cp.SegmentShape( staticBody, cp.v(0,winSize.height), cp.v(winSize.width,winSize.height), 0),    // top
            new cp.SegmentShape( staticBody, cp.v(0,0), cp.v(0,winSize.height), 0),                // left
            new cp.SegmentShape( staticBody, cp.v(winSize.width,0), cp.v(winSize.width,winSize.height), 0)    // right
        ];
        for( var i=0; i < walls.length; i++ ) {
            var shape = walls[i];
            shape.setElasticity(1);
            shape.setFriction(1);
            space.addStaticShape( shape );
        }

        // Gravity
        space.gravity = cp.v(0, -100);
    },
    addWalls:function() {
        // Walls
        var winSize = cc.director.getWinSize();
        var walls = [ new cp.SegmentShape( this.space.staticBody, cp.v(0,0), cp.v(winSize.width,0), 0 ),                // bottom
            new cp.SegmentShape( this.space.staticBody, cp.v(0,winSize.height), cp.v(winSize.width,winSize.height), 0),    // top
            new cp.SegmentShape( this.space.staticBody, cp.v(0,0), cp.v(0,winSize.height), 0),                // left
            new cp.SegmentShape( this.space.staticBody, cp.v(winSize.width,0), cp.v(winSize.width,winSize.height), 0)    // right
        ];
        for( var i=0; i < walls.length; i++ ) {
            var shape = walls[i];
            shape.setElasticity(0.8);
            shape.setFriction(0.1);
            this.space.addStaticShape( shape );
        }
    },
    createPhysicsSprite:function( pos ) {

        var radius = 20;
        var mass = 1;

        var body = new cp.Body(mass, cp.momentForCircle(mass, 0, radius,cp.v(0, 0)));
        body.setPos( pos );
        this.space.addBody( body );
        var shape = new cp.CircleShape(body, radius,cp.v(0, 0)); //new cp.BoxShape( body, 48, 108);
        shape.setElasticity( 1 );
        shape.setFriction( 0.1 );

        this.space.addShape( shape );

        var sprite = cc.PhysicsSprite.create(res.b_ball_01);
        sprite.setBody( body );
        return sprite;
    },
    setupDebugNode:function()
    {
        // debug only
        this._debugNode = cc.PhysicsDebugNode.create( this.space );
        this._debugNode.visible = false ;
        this.addChild( this._debugNode );
    }
});

var MainScene = cc.Scene.extend({
    onEnter:function () {
        this._super();
        this.addChild(new GameBackgroundLayer());
        this.addChild(new MainLayer());
    }
});
原文地址:https://www.cnblogs.com/linn/p/3656818.html