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

时间:2017-05-31 12:10:04

标签: javascript three.js

这是我寻找答案的第7天。 我想写一个简单的游戏,我想要一个对象。

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

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时,我希望它出现根据他们的内循环/渲染/动画方法在场景和动画。

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

1 个答案:

答案 0 :(得分:3)

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

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

但这可能没有必要。

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

(定义:onBeforeRender( renderer, scene, camera, geometry, material, group )

以下是一个例子:

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;
            };
        }
    );    
}

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