Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在对象类中调用.render和.animate函数?_Javascript_Three.js - Fatal编程技术网

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

Javascript 如何在对象类中调用.render和.animate函数?,javascript,three.js,Javascript,Three.js,这是我寻找答案的第七天。 我想写一个简单的游戏,我想调用一个对象 我的想法是,我想要一个模块化的游戏,所以我用通常的方式调用场景和所有这些: main.js: var scene, controls, camera, renderer; var SCREEN_WIDTH, SCREEN_HEIGHT; ..... var thing; init(); animate(); function init() { ..... thing = new Player(); .

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

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

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对象时,我希望它出现在场景中,并根据它们的内部循环/render/animate方法设置动画


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

首先,
此。bobby
将在动画方法中返回
未定义的
,除非您将其声明为
此。bobby
在构造函数中:

function Player() {
    this.bobby = null; // was: var bobby;
    this.loader = new THREE.JSONLoader();
但这可能没有必要

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

(定义:
onBeforeRender(渲染器、场景、摄影机、几何体、材质、组)

下面是一个例子:

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

这有优化的余地,但我将留给您。

看来您已经做到了,因此调用
newplayer()将其添加到场景中。因此,在
animate
循环中,只需调用
thing.animate()render()之前的code>。如果这没有你想要的效果,请描述哪一步不起作用。玩家没有出现在场景中吗?这不是动画吗?有控制台错误吗?没有错误。播放器确实调用正确,但是我必须在main animate()中添加东西.animate(){}。在mains.js中,我想知道是否有方法在Player.js文件中调用animate()。我要寻找的效果是,在调用Player()对象后,将与Mesh.data textures/etc一起调用有关对象应如何设置动画的信息。不管在Player.js的Object Definition/Class.in中有什么,我都按照你说的做了,但它不起作用:THREE.js
<代码>onBeforeRender
在r80中不存在。你会考虑升级到最新版本吗?哦哇!我完全不知道有新版本。我现在就去试试,我会把贝克交给你。另外,非常感谢你这么快的回复。哦,我的天哪!它确实有效。谢谢你,我的导师!