読者です 読者をやめる 読者になる 読者になる

フニゲの開発日記

Electronとか...

Cocos2-JSなら物理ゲームも楽勝(のような気がする)

Cocos2d-JS

 物理エンジンとしてはBox2Dの方が有名だったと思うのだが、Cocos2d-JSはChipmunk2Dに絞ってサポートしていく方針なのだと思う。Box2D用のツールとか簡単に捨てるわけにもいかないのだが、まあしょうがない。
 Chipmunk2Dが選ばれた理由は「簡潔だから」に尽きるのではないかと思う。簡潔さは力だ。2つの物理エンジンで同じモデルを書けば、Chipmunk2Dのほうがかなりスッキリしたコードになる。

var world;
var gameLayer;

var MyScene = cc.Scene.extend({
    onEnter:function () {
        this._super();
        gameLayer = new GameLayer();
        this.addChild(gameLayer);
    }
});

var GameLayer = cc.Layer.extend({
    ctor:function () {
        this._super();
        this.scheduleUpdate();
        cc.eventManager.addListener(listener, this);

        // 物理モデル
        world = new cp.Space();
        world.gravity = cp.v(0, -980);

        var debugDraw = cc.PhysicsDebugNode.create(world);
        debugDraw.setVisible(true);
        this.addChild(debugDraw);

        // 地面
        this.addBody(400, 0, 800, 20, false);
    },

    update:function (dt) {
        world.step(dt);
    },

    addBody:function (x, y, width, height, isDynamic) {
        if (isDynamic) {
            var body = new cp.Body(1, cp.momentForBox(1, width, height));
            body.setPos(cp.v(x, y));
            world.addBody(body);
        } else {
            var body = new cp.Body(Infinity, Infinity);
            body.setPos(cp.v(x, y));
        }

        var shape = new cp.BoxShape(body, width, height);
        shape.setFriction(0.9);
        shape.setElasticity(0.1);
        world.addShape(shape);
    },
});

var listener = new cc.EventListener.create({
    event:cc.EventListener.TOUCH_ONE_BY_ONE,
    onTouchBegan:function (touch, event) {
        var pos = touch.getLocation();

        // タップした場所に箱を追加する
        gameLayer.addBody(pos.x, pos.y, 50, 50, true);
        return true;
    },
});

 描画のことはcc.PhysicsDebugNodeを貼っておけば適当に描画してくれるので、とりあえず考えなくていい。

f:id:funige:20150320171745p:plain

 動くサンプルはこちら。

広告を非表示にする