Node.js / Socket.io如何从控制台停止简单的值更改?

时间:2016-08-09 13:51:52

标签: javascript node.js sockets websocket socket.io

我正在创建一个游戏,我保留了一些变量,例如fallingSpeed,runningSpeed等。现在我的解决方案是使用setTimeout(...){someFunction(...)}来停止浏览器中的简单控制台编辑;将正确的数据发送给客户。

所以会发生的是,当玩家连接时,速度为1会被发送到客户端。之后,当按下或释放“空间”时,服务器等待发送给它的请求。但是,这会导致问题,因为setTimeout(...){...}只运行一次。所以客户端只需按下“空格”一次,然后在空中打开控制台,只需输入fallingSpeed = 0;并开始在地图上徘徊。

// use socket.io
var io = require("socket.io").listen(server);
var speedTimer;

io.sockets.on('connection', function(socket) {
    socket.emit('fallingSpeed', {'fallingSpeed': 1});

    // get data for if space is pushed or not
    socket.on('spaceData', function(_spaceData) {
        // if space has been pushed set falling speed to 8
        if (_spaceData.pushed == 1) {
            speedFunction(socket, 8);
        }
        // else fall back to speed 1
        else {
            speedFunction(socket, 1);
        }
    });
});

function speedFunction(socket, speed) {
    speedTimer = setTimeout(function() {
        socket.emit('fallingSpeed', {'fallingSpeed': speed});
    }, 1000/60); // send data every frame.
}

我尝试过使用setInterval(...){...},但这只会创建一个循环,当连接多个用户时,我们都知道这些循环并不是最好的。这是我使用setInterval(...){...}的代码。

// use socket.io
var io = require("socket.io").listen(server);
var speedTimer;

io.sockets.on('connection', function(socket) {
    socket.emit('fallingSpeed', {'fallingSpeed': 1});

    // get data for if space is pushed or not
    socket.on('spaceData', function(_spaceData) {
        // if space has been pushed set falling speed to 8
        if (_spaceData.pushed == 1) {
            clearInterval(speedTimer);
            speedTimer = setInterval(function() {
                socket.emit('fallingSpeed', {'fallingSpeed': 8});
            }, 1000/60); // send data every frame.
        }
        // else fall back to speed 1
        else {
            clearInterval(speedTimer);
            speedTimer = setInterval(function() {
                socket.emit('fallingSpeed', {'fallingSpeed': 1});
            }, 1000/60); // send data every frame.
        }
    });
});

所以我需要的是以某种方式检查值在客户端更改时是否是正确的值。

1 个答案:

答案 0 :(得分:0)

如果您正在编写多人游戏,则应never trust the client

重新思考你的架构。是的,应该向客户提供一些信息以执行预测并渲染物理,但是您的服务器必须必须权限才能解决游戏中发生的事情。