1. cocos2d-js chipmunk物理引擎入门笔记

时间:2023-02-08 19:53:14


Chipmunk引擎的核心概念:

1.空间(space) 物理空间,所有的物体都在这个空间发送

2.物体(body) 物理空间中的物体

3.形状(shape)  物体的形状

4.关节(joint) 用于连接两个物体的约束

相关教程:http://www.cocoachina.com/bbs/read.php?tid=220250

http://www.cocos.com/doc/tutorial/show?id=1491

http://www.ladeng6666.com/blog/2012/06/22/让刚体听我的-applyforce、applyimpulse、setlinearvelocity/


1. cocos2d-js chipmunk物理引擎入门笔记









效果预览:

1. cocos2d-js chipmunk物理引擎入门笔记

var SPRITE_WIDTH = 64; //物体宽

var SPRITE_HEIGHT = 64;//物体高
var DEBUG_NODE_SHOW = true;//调试遮罩


var HelloWorldLayer = cc.Layer.extend({
    space: null,
    ctor: function () {
        //////////////////////////////
        // 1. super init first
        this._super();


        this.initPhysics();


        this.scheduleUpdate();


    },
    setupDebugNode: function () {
        this._debugNode = new cc.PhysicsDebugNode(this.space);
        this._debugNode.visible = DEBUG_NODE_SHOW;
        this.addChild(this._debugNode);
    },
    onEnter: function () {
        this._super();
        cc.log("onEnter");
        cc.eventManager.addListener({
            event: cc.EventListener.TOUCH_ONE_BY_ONE,
            onTouchBegan: this.onTouchBegan
        }, this);
    },
    onTouchBegan: function (touch, event) {
        cc.log("onTouchBegan");
        var target = event.getCurrentTarget();
        var location = touch.getLocation();
        target.addNewSpriteAtPosition(location);//产出新的盒子
        return false;
    },
    onExit: function () {
        this._super();
        cc.log("onExit");
        cc.eventManager.removeListeners(cc.EventListener.TOUCH_ONE_BY_ONE);
    },
    initPhysics: function () {


        var winSize = cc.director.getWinSize();

       //创建物理空间--------------------------------------------(A)
        this.space = new cp.Space();
        this.setupDebugNode();//设置调试node对象


        // 设置重力
        this.space.gravity = cp.v(0, -100);
        var staticBody = this.space.staticBody;//从物理空间获取静态物体


        // 设置空间边界
        var walls = [ 

            // bottom

            new cp.SegmentShape(staticBody, cp.v(0, 0), cp.v(winSize.width, 0), 0),   

           // top         
            new cp.SegmentShape(staticBody, cp.v(0, winSize.height), cp.v(winSize.width, winSize.height), 0),   

           // left
            new cp.SegmentShape(staticBody, cp.v(0, 0), cp.v(0, winSize.height), 0),     

           // right          
            new cp.SegmentShape(staticBody, cp.v(winSize.width, 0), cp.v(winSize.width, winSize.height), 0) 
        ];


        for (var i = 0; i < walls.length; i++) {
            var shape = walls[i];
            //弹性系数
            shape.setElasticity(1);
            //摩擦系数
            shape.setFriction(1);
            this.space.addStaticShape(shape);
        }


    },
    addNewSpriteAtPosition: function (p) {
        cc.log("addNewSpriteAtPosition");

      var SPRITE_HEIGHT = 64;//物体高
     var DEBUG_NODE_SHOW = true;//调试遮罩
{
        cc.log("addNewSpriteAtPosition");

        //cp.Body构造函数创建了一个动态的物体,构造函数第一个参数是质量,这里的1是一个经验值,

       //可以通过它的大小而改变物体的物理特性

        //第二个参数是惯性,它决定了物体运动时候收到的阻力
        //设置惯性使用cp.momentForBox函数
        //cp.momentForBox函数是计算多边形的惯性值
        //cp.momentForBox第一个参数是惯性矩形,这的1也是个经验值,第二个参数是设置物体的宽度,第三个参数是物体的高度
        //类似的函数还有很多 如:cp.momentForBox、cp.momentForSegment和cp.momentForCircle等
        var body = new cp.Body(1, cp.momentForBox(1, SPRITE_WIDTH, SPRITE_HEIGHT));
        //设置物体中心(物体的几何中心)
        body.setPos(p);
        //添加物体到空间
        this.space.addBody(body);


         //创建形状对象
        var shape = new cp.BoxShape(body, SPRITE_WIDTH, SPRITE_HEIGHT);


        shape.setElasticity(0.5);
        shape.setFriction(0.5);
        this.space.addShape(shape);


        //创建物理引擎精灵对象
        //ccPhysicsSprite由cocos2d-JS提供的物理引擎对象,
        //用cc.PhysicsSprite类自动地将精灵和物理位置和旋转角度同步起来,
        //在游戏循环函数中需要简单的语句就可以实现同步,在update函数里面
        var sprite = new cc.PhysicsSprite("res/BoxA2.png");
        sprite.setBody(body);
        sprite.setPosition(cc.p(p.x, p.y));
        this.addChild(sprite);
    },
    update: function (dt) {


        var timeStep = 0.03;
        //timeStep表示上一次过去循环的时间,它还影响到物体本次循环简要移动的距离和旋转角度
        //,不建议使用update的dt参数作为timeStep,因为dt时间是上下浮动的
        this.space.step(timeStep);
    },
    onExit: function () {


    }
});


var HelloWorldScene = cc.Scene.extend({
    onEnter: function () {
        this._super();
        var layer = new HelloWorldLayer();
        this.addChild(layer);
    }
});