javascript - 如何在对象类中调用 .render 和 .animate 函数?

标签 javascript three.js

这是我寻找答案的第七天。 我想编写一个简单的游戏,并且想调用一个对象。

我的想法是我想要一个模块化游戏,所以我以通常的方式调用场景和所有这些:

main.js:

var scene, controls, camera, renderer;
var SCREEN_WIDTH, SCREEN_HEIGHT;
.....

var thing;

init();
animate();

function init() {
    .....
    thing = new Player();
    .....
}


function animate() {
    .....
}

function render() {
    ......
}

然后我就有了我的(可以说是->)Player.js 类:

function Player() {
    var bobby;
    this.loader = new THREE.JSONLoader();

    this.loader.load(

        'obj/models/minecraft_sole.json',
        function ( geometry, materials ) {

            var material = new THREE.MultiMaterial( materials );
            var bobby = new THREE.Mesh( geometry, material );
            bobby.position.set(0, 0, 0);

            bobby.castShadow = true;
            bobby.receiveShadow = false;

            scene.add( bobby );

        }
    );

}

Player.prototype.animate = function() {

    this.bobby.rotation.y -= 0.5;

}

在第一批代码中,我调用一个新对象:

thing = new Player();

所以一切都像一个魅力 - 模型加载,它的纹理加载和所有这些东西,但是 - 这是我无法弄清楚的:

在 Player 类中,我想为我的 Player 对象定义 render() 和 animate() 方法/函数,这样当我最终在主文件 ( main.js ) 中调用我的 Player OBJECT 时,我希望它出现在场景中并根据其内部循环/渲染/动画方法进行动画处理。

请帮助并告诉我创建具有所有属性的新对象的正确方法。

最佳答案

首先,this.bobby 将在您的 animate 方法中返回 undefined,除非您在构造函数中将其声明为 this.bobby:

function Player() {
    this.bobby = null; // was: var bobby;
    this.loader = new THREE.JSONLoader();

但这可能没有必要。

要在对象即将渲染时执行一些代码,您可以为该对象定义一个 onBeforeRender 方法。 renderer.render 方法会自动为每个渲染对象调用 onBeforeRender ,因此在您的情况下,您将为 this.bobby 对象定义它。

(定义:onBeforeRender(渲染器、场景、相机、几何体、 Material 、组))

这是一个例子:

function Player() {
    var bobby = null;
    this.loader = new THREE.JSONLoader();

    this.loader.load( '...',
        function ( geometry, materials ) {    
            // the rest of your code is fine
            bobby = new THREE.Mesh(...);
            bobby.onBeforeRender = function(){
                // note that in this callback, "this" now refers to the "bobby" object
                this.rotation.y -= 0.5;
            };
        }
    );    
}

这还有优化的空间,但我会把它留给你。

关于javascript - 如何在对象类中调用 .render 和 .animate 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44284456/

相关文章:

javascript - Angular 2 对如此多的 javascript 文件的依赖是否会妨碍/影响其性能?

javascript - jQuery 在函数执行时更改图像以显示进度

javascript - 为父项重置选定的子项

javascript - THREE.js 面向边界框

javascript - Three.js顶点着色器: update attributes and how to save a value for the next processing round

javascript - Google Sheets 应用程序脚本 HTML 页面隐藏关闭 (X) 按钮

javascript - 更优雅的按钮将数据提交到脚本

javascript - ThreeJS Material.setValues 不是函数

javascript - 将变量从内部函数分配到外部作用域

javascript - Three.js 为什么渲染器带有视口(viewport)和剪刀,而我有一个完整的黑色 Canvas