我正在创建一个游戏,我保留了一些变量,例如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.
}
});
});
所以我需要的是以某种方式检查值在客户端更改时是否是正确的值。
答案 0 :(得分:0)
如果您正在编写多人游戏,则应never trust the client。
重新思考你的架构。是的,应该向客户提供一些信息以执行预测并渲染物理,但是您的服务器必须必须是权限才能解决游戏中发生的事情。