Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js/Nowjs-移动精灵并在服务器端跟踪时间_Node.js_Nowjs Sockets - Fatal编程技术网

Node.js/Nowjs-移动精灵并在服务器端跟踪时间

Node.js/Nowjs-移动精灵并在服务器端跟踪时间,node.js,nowjs-sockets,Node.js,Nowjs Sockets,我使用node.js和express,使用nowjs调用服务器端函数和同步变量。假设用户在画布上绘制为精灵。他的x,y坐标保存在服务器端的“位置”数组中 服务器端: position = { x : 0; y : 0 } updatePosition = function (a,b) { playerPosition.x += a; playerPosition.y += b; } 客户端: if keypress('right'){ updatePosition(32,

我使用node.js和express,使用nowjs调用服务器端函数和同步变量。假设用户在画布上绘制为精灵。他的x,y坐标保存在服务器端的“位置”数组中

服务器端:

position = { x : 0; y : 0 } 

updatePosition = function (a,b) 
{ 
  playerPosition.x += a; 
  playerPosition.y += b; 
} 
客户端:

if keypress('right'){ updatePosition(32,0); }
这些是伪代码。当用户按下“right”按钮时,将调用服务器端的“updatePosition”函数,该函数将向“position”数组的x坐标添加32(像素)。然后与客户端共享该数组,并使用客户端函数在画布上绘制新位置

假设我不想立即在新位置绘制精灵。我想播放一个行走动画,它将精灵逐渐向右移动32个像素,大约需要1秒的时间才能完成。我可以这样实施:

  • 用户按下“右”按钮
  • 动画开始在客户端播放
  • updatePosition通常称为服务器端
  • 客户端上的动画完成后,检查客户端的最终位置是否与服务器端存储的坐标匹配
  • 当用户按下“右”按钮/键时,他在1秒后才能重复按键。1秒长的“行走”动画必须完成,并使用服务器端坐标检查最终位置,然后才能再次按下“右键”移动精灵

    问题:如何跟踪1秒服务器端?我不能在客户端完成,因为用户可以通过黑客攻击他的客户端来减少动画时间

    “时间戳”的解决方案是位置数组吗?例如,位置={x:0;y:0,时间:0}。如果用户再次按下“右”按钮,服务器将检查上一次位置更新是否大于1秒前。如果少于1秒,服务器将忽略它。

    为什么不在用户会话中简单地存储一个“锁”

    session.editLock = new Date().getTime();
    
    当客户端触发另一个编辑时,只需:

    if(session.editLock && new Date().getTime() - session.editLock > 1000) {
      // Return error
    }
    

    修改位置对象对我来说不合适。position对象用于存储位置,而不是时间。

    我认为您做得不对。这种特性应该只在客户端实现。对于纯客户端功能,不必修改服务器代码。例如,为什么不在动画结束时调用
    updatePosition
    ?如果用户再次单击,是否会中断动画?或者干脆把它们堆起来?这是一个关键的功能,所以你?我需要动画需要1秒才能完成。用户可能会攻击他们的客户端,使其在0.5秒内完成动画。当有多个用户时,黑客的移动速度将是其他人的两倍。谢谢你的回复。玩家可以通过破解游戏来“解锁”自己吗?我正在使用express+passportjs处理登录会话。我想关键是使用“Data().getTime()”服务器端跟踪时间(位置更新的时间戳)。我在哪里保存时间戳(会话或位置数组)应该无关紧要?不,会话严格是服务器端的,用户不能篡改会话数据。这就是为什么它用于身份验证目的。从技术上讲,存储时间戳的位置没有任何区别。但是,当你在哪里存储数据的问题上犹豫不决时,我总是建议你问问自己什么更有意义。在这种情况下,我肯定会说,在会话中存储这些数据比在位置数据中存储这些数据更有意义,我希望存储位置数据。。。职位。没有时间戳,很好。我想我将使用会话来存储“锁”。并且仍然在位置上加时间戳。原因是我计划让多个用户在我的网站上移动精灵并进行交互(例如,当它们碰撞时的动画)。位置数组可能会在服务器端使用最终位置进行更新,但在客户端,精灵仍然“行走”在那里。最后一个问题:会话似乎是一个方便的地方,可以转储与玩家相关的所有变量。例如,如果我决定使用一个“健康”来减少每次精灵碰撞的次数,我可以在会话中存储“健康”变量。还是我弄错了?嗯,是的,在会话中存储所有内容可能很有诱惑力,也很方便。但您应该记住,会话并不意味着持久。如果存储会话数据的服务器崩溃,可能会丢失所有数据。对于锁或身份验证信息,这不是什么大问题。但为了健康起见,我会将其存储在数据库中的播放器记录中,当然,如果您的应用程序是数据库驱动的。如果此信息仅在整个会话期间有效,并且不能持久化,那么在我看来,将其存储在会话中是完全正确的。我只是意识到“锁”本质上是一个时间戳。也许我将定义一个“userInfo”数组,在其中保留位置数组和时间戳/锁值,并在会话中存储“userInfo”。我不需要这些数据来保存,但是谢谢你的提示,我会记住的。我想这已经解决了