1

Cocos2d-js v3.2 を使用して、cc.Spriteusingのカスタム サブクラスを作成していextend()ます。そのサブクラスのインスタンスは、クリック可能 (タッチ可能) であることを意図しており、フレームごとにいくつかの計算が必要です。コードを読みやすくするために、タッチ リスナーを登録し、コンストラクター内にスケジューラー コールバックを追加したいと思います。このようにして、新しいスプライトが作成されるたびに、自動的に使用できるようになります。このアプローチに関して 2 つの質問があります。

  1. リスナーをコンストラクターに登録することは、そのようなことを行うのに最適な場所ですか? スプライトがノード ツリーに追加される前にコンストラクターが呼び出されるため、現時点では認識されていない副作用があるのではないかと心配しています。
  2. タッチ リスナー/スケジューラ コールバックは、いつ、どこで登録解除する必要がありますか? スプライトがノード ツリーから削除されたとき、非表示になったとき、またはオブジェクトが破棄されたとき

コード:

var MySprite = cc.Sprite.extend({
    ctor: function () {
        this._super();

        this.initUserInput();
        this.initUpdates();
    },
    update: function (dt) {
        // Do some per-frame calculactions
    },
    initUpdates: function(){
        cc.director.getScheduler().scheduleUpdateForTarget(this, 1, !this._isRunning);
    },
    initUserInput: function(){
        var $this = this;
        var listener = cc.EventListener.create({
            event: cc.EventListener.TOUCH_ONE_BY_ONE,
            onTouchBegan: function (touch, event) {
                var p = touch.getLocation();
                var rect = $this.getBoundingBox();
                if(!cc.rectContainsPoint(rect, p))
                {
                    return false;
                }
            },
            onTouchEnded: function (touch) {
            },
            onTouchMoved: function (touch) {
            }
        });
        cc.eventManager.addListener(listener, this);
    }
});
4

1 に答える 1

1

まあ、イベントの登録と登録解除のタイミングは状況によって異なります。eventManager はレンダリング システムから独立しているため、副作用について心配する必要はありません。ただし、ノードをノード ツリーに追加するときではなく、登録後に eventListener が有効になることを知っておく必要があります。そのため、必要なときにリスナーを登録してください。 .

cc.eventManager.addListener を呼び出すときに、2 番目のパラメーターが ccnode の場合、このノードが破棄されるとイベントリスナーは自動的に登録解除されます。2 番目のパラメータが優先度の場合、イベントリスナーが不要になったら手動で削除する必要があります。

于 2015-01-21T08:54:20.083 に答える