0

JavaScriptとThree.jsを使用してオブジェクト指向プログラミングを実現しようとしています。

以下のように、シーンをクラスでカプセル化し始めましたupdate。クラスにはアニメーションの関数があります。これは問題なく動作しますが、コントロールを備えた別のクラスが必要です。

このControlsクラスには、シーンのティックごとに呼び出す必要のある更新関数もあります。そこで、で呼び出す必要のあるすべての可能な更新関数への関数ポインターを保持する配列を作成しましたScene.update

このような:

Scene = function() {
     ... // scene init etc.
     this.update_f = []; // My array of function pointers

     this.AddToUpdate = function(f) {
         this.update_f.push(f); // add function pointer
     };

     this.Animate = function() {
          requestAnimationFrame(this.Animate.bind(this));
          this.renderer.render(this.scene, this.camera);
          this.Update();
     };

     this.Update = function() {
       for(var i = 0; i < this.update_f.length; i++) {
           this.update_f[i]();
        }
     };
};

そして、私のControlsクラスのいくつかの擬似コード:

Controls = function() {
     this.obj = new THREE.Object3D();
     ... // do stuff with obj
     this.update = function() {
          console.log(this.obj);
     }
};

そして、これが私のメインで、すべてを初期化します。

 var scene = new Scene();
 var controls = new Controls();
 scene.AddToUpdate(controls.update()); // add function pointer
 scene.Animate();

さて、実際の問題に移りましょう。配列()を介して関数を呼び出すscene.update()と呼び出されますが、インスタンス化されたオブジェクトは、 「未定義」と表示されるため、オブジェクトではないようです(mainでControlsとしてインスタンス化されます) 。controls.update()scene.update_fconsole.log(this.obj)

それで、私はここで何を間違っているのですか?これらのベストプラクティスに関するヒントを教えてください。さらに多くのものを追加すると巨大になる可能性があるため、Sceneクラスにすべてを追加したくありません。他の更新機能をにジャックインしたいだけですScene.update

4

1 に答える 1

0

ここに複数のエラーがあります。

Controls = function() {
     this.obj = new THREE.Object3D();
     ... // do stuff with obj
     this.update() {
          console.log(this.obj);
    }
};

関数をに割り当てませんControls。どうですか

this.update = function() {
    console.log(this.obj);
};

メインでは、更新関数を実行し、その戻り値をパラメータとしてに割り当てます。AddToUpdate

var scene = new Scene();
var controls = new Controls();
scene.AddToUpdate(controls.update);
scene.Animate();

したがって、関数ポインタを渡したい場合は、括弧を削除するだけです。

オブジェクトの関数を他のオブジェクトにthis渡すと、関数を渡したオブジェクトになることに注意してください。

于 2013-03-27T07:48:00.627 に答える