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

时间:2012-05-25 00:15:58

标签: 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,0); }

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

假设我不想立即在新位置绘制精灵。我想播放一个步行动画,逐渐将精灵32像素向右移动,然后花1秒钟完成。我可以这样实现它:

  1. 用户按下“向右”按钮。
  2. 动画开始播放客户端。
  3. updatePosition像往常一样被称为服务器端。
  4. 当客户端上的动画完成时,检查客户端的最终位置是否与服务器端存储的坐标匹配。
  5. 当用户按下“向右”按钮/键时,他不能重复按键直到1秒钟后。 1秒长的“行走”动画必须完成并使用服务器端坐标检查最终位置,然后再次按“向右”移动他的精灵。

    问题:如何跟踪1秒服务器端?我不能在客户端做,因为用户将能够破解他的客户端以减少动画时间。

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

1 个答案:

答案 0 :(得分:0)

为什么不简单地存储"锁定"在用户会话中?

session.editLock = new Date().getTime();

当客户端触发另一个编辑时,只需:

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

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