我正在尝试使用 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.update()
scene.update_f
console.log(this.obj)
那么我在这里做错了什么?请给我一些关于这些事情的最佳实践的提示。我不想将所有内容都添加到 Scene 类,因为如果添加更多内容,它可能会变得很大。我只想将其他更新功能插入到Scene.update
.