サイトのトップへ戻る

Cocos2d-x ドキュメント 日本語訳

サイト内検索

スクリプト記述



スクリプトコンポーネント

スクリプトコンポーネントは c++ Node オブジェクトを拡張するのに使用されます。 スクリプトコンポーネントNodeに追加することができ、 スクリプトコンポーネントonEnterイベントとonExitイベントと update イベントを受け取ります。

スクリプトコンポーネントは JavaScript と LUAの両方をサポートしています。 あなたが開発に使用しているプログラム言語に応じた適切な種類のスクリプトコンポーネントを使用する必要があります。 JavaScriptで開発している場合は ComponentJSを使用し、Luaで開発している場合は ComponentLUAを使用します。 ですが、それらを混合して使用したりc++プロジェクト内で使用したりすることはできません! これは、各プログラム言語ごとに適切なバインド処理が必要で、こうしたバインド処理はそれぞれのタイプのプロジェクト内でしか行えないからです。

Luaを使う例:


// create a Sprite and add a LUA component
auto player = Sprite::create("player.png");

auto luaComponent = ComponentLua::create("player.lua");
player->addComponent(luaComponent);
-- player.lua

local player = {
    onEnter = function(self)
        -- do some things in onEnter
    end,

    onExit = function(self)
        -- do some things in onExit
    end,

    update = function(self)
        -- do some things every frame
    end
}

-- it is needed to return player to let c++ nodes know it
return player

JavaScriptを使う例:

// create a Sprite and add a LUA component
auto player = Sprite::create("player.png");

auto jsComponent = ComponentJS::create("player.js");
player->addComponent(jsComponent);
// player.js
Player = cc.ComponentJS.extend({
    generateProjectile: function (x, y) {
        var projectile = new cc.Sprite("components/Projectile.png", cc.rect(0, 0, 20, 20));
        var scriptComponent = new cc.ComponentJS("src/ComponentTest/projectile.js");
        projectile.addComponent(scriptComponent);
        this.getOwner().getParent().addChild(projectile);

        // set position
        var winSize = cc.director.getVisibleSize();
        var visibleOrigin = cc.director.getVisibleOrigin();
        projectile.setPosition(cc.p(visibleOrigin.x + 20, visibleOrigin.y + winSize.height/2));

        // run action
        var posX = projectile.getPositionX();
        var posY = projectile.getPositionY();
        var offX = x - posX;
        var offY = y - posY;

        if (offX <= 0) {
            return;
        }

        var contentSize = projectile.getContentSize();
        var realX = visibleOrigin.x + winSize.width + contentSize.width/2;
        var ratio = offY / offX;
        var realY = (realX * ratio) + posY;
        var realDest = cc.p(realX, realY);

        var offRealX = realX - posX;
        var offRealY = realY - posY;
        var length = Math.sqrt((offRealX * offRealX) + (offRealY * offRealY));
        var velocity = 960;
        var realMoveDuration = length / velocity;

        projectile.runAction(cc.moveTo(realMoveDuration, realDest));
    },

    onEnter: function() {
        var owner = this.getOwner();
        owner.playerComponent = this;
        cc.eventManager.addListener({
            event: cc.EventListener.TOUCH_ALL_AT_ONCE,
            onTouchesEnded: function (touches, event) {
                var target = event.getCurrentTarget();
                if (target.playerComponent) {
                    var location = touches[0].getLocation();
                    target.playerComponent.generateProjectile(location.x, location.y);
                    jsb.AudioEngine.play2d("pew-pew-lei.wav");
                }
            }
        }, owner);
    }
});

JavaScript コンポーネントとLUA コンポーネントで覚えておいて欲しい違いが一つあります。 LUA コンポーネントではreturn 文を使って オブジェクトを返す必要がありますが、 JavaScriptコンポーネントではcc.ComponentJSをextend するだけで良いです。

より詳細な使用方法については、テストプロジェクト: tests/lua-tests/src/ComponentTesttests/js-tests/src/ComponentTestを参照してください。