【问题标题】:Node.js/Socket.io How do I stop simple value changing from the console?Node.js/Socket.io 如何停止从控制台更改简单值?
【发布时间】:2016-08-10 04:47:19
【问题描述】:

我正在创建一个游戏,其中保留了一些变量,例如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.
        }
    });
});

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

【问题讨论】:

  • 你可以把你的变量/代码放在一个闭包中,这样就更难从控制台访问了。

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


【解决方案1】:

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

重新思考您的架构。是的,应该向客户端提供一些信息以执行预测和渲染物理,但您的服务器必须是游戏中正在发生的事情的权威

【讨论】:

  • 有没有关于如何正确对数据进行验证检查的示例?
  • 在服务器端运行最小的物理引擎和游戏循环。您可以从 this article 开始,然后看看他们的库是否对您有用。
猜你喜欢
  • 2014-04-22
  • 2016-02-05
  • 2016-09-13
  • 2015-05-04
  • 1970-01-01
  • 2018-04-10
  • 2011-03-08
  • 1970-01-01
相关资源
最近更新 更多