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