ThreeJS,Websockets和NodeJS客户端/服务器实验

Net*_*ide 1 javascript node.js three.js socket.io

我在玩socket.io,ThreeJS,Javascript和NodeJS,以使用ThreeJS的图形创建一个简单的客户端/服务器。我不确定所有这些框架是否都可以一起工作,但是我决定试一试,因为尽管我找不到一个简单的例子来进行剖析或试验,但在网上也曾看到过类似的例子。主要是要进行试验,但是我也想做一个小的概念游戏,以证明到目前为止我学到的东西。

我在这里发布了我的代码:https : //gist.github.com/netsider/63c414d83bd806b4e7eb

抱歉,如果有点不整洁,但我已尽力使它尽可能易读。

基本上,现在服务器端的NodeJS脚本似乎运行良好(使用“ node server-alpha.js”运行),而客户端脚本(client-alpha.html,您可以在浏览器中打开它)连接到服务器,并显示用户列表(也已连接)。但是,我的目的是让每个用户都可以移动自己的多维数据集,而现在每个多维数据集仅被添加到屏幕上(而不是被添加,减去然后再添加一次),以产生移动的错觉)。如果您同时运行这两个代码并连接了一个或两个用户,并且每个用户移动了几次箭头键,您将看到我在说什么。

有人可以帮我吗?我尝试了几种不同的方法来删除多维数据集(并记得每次都调用render())……但是我尝试的一切似乎都没有效果。总是导致多维数据集仅被添加到屏幕,而从未被减去。

我在代码中添加了注释,使事情变得容易一些,因为我知道这需要大量代码(如果不是您自己的话)。

谢谢,任何帮助将不胜感激...因为我真的很难尝试使立方体移动。

另外,我在添加Fly-Controls时遇到了麻烦(FlyControls.js-在ATM上已注释掉),因此,如果有人可以告诉我我哪里出了问题,我也将不胜感激。

use*_*381 5

好的,所以您不想继续重建多维数据集,只需要做的就是更改位置。

同样在游戏开发中,几乎是使用面向对象的设计的要求,实现此目标的一种好方法是使玩家成为对象。

CPlayerList = new Array(); // an array of player objects

function ClientPlayer()
{
    this.Cube;
    this.Name = "unnamed";
    this.Id = 0;

    this.Create = function(name,pos,id)
    {
        this.Name = name;
        this.Id = id;

        var cubeGeometry = new THREE.BoxGeometry(10, 10, 10);
        var cubeMaterial = new THREE.MeshLambertMaterial({color: 'red', transparent:false, opacity:1.0});

        this.Cube = new THREE.Mesh(cubeGeometry, cubeMaterial);

	this.Cube.position.x = pos.x;
        this.Cube.position.y = pos.y;
        this.Cube.position.z = 20; // don't know why this is 20, remember y axis is up & down in opengl/threejs
	    
        scene.add(this.Cube);
    }
    
    this.Move = function(vector)
    {
        this.Cube.position.set(this.Cube.position.x + vector.x, this.Cube.position.y + vector.y, 20);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在服务器上,您需要一个ServerPlayer对象,该对象保存相似的数据,并在将ID发送给客户端之前在服务器上分配ID。因此,当您将其发送到客户端时,您想要创建一个新的ClientPlayer,请调用player.Create(),然后将其推送到CPlayerList,如下所示:

function newCPlayer(data)
{
    var newPly = new ClientPlayer();
    newPly.Create(data.name,data.pos,data.id);
    CPlayerList.push(newPly);
}
Run Code Online (Sandbox Code Playgroud)

然后,当您调用movePlayer()函数时,您可以简单地遍历玩家数组

function movePlayer(keyStroke, clientID)
{
    if (keyStroke == 39) 
    {
        CPlayerList.forEach(function(player,i,a)
        {
            if(player.Id === clientID)
            {
               player.Move(new THREE.Vector3(1,0,0));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是客户端代码,但这应该可以帮助您入门,如果您不清楚什么,请告诉我。

这也是使用类似设计的游戏示例:http://82.199.155.77:3000/(Chrome中的ctrl + shift + j用于查看客户端源代码)和服务器代码:http://pastebin.com/PRPaimG9