【发布时间】: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