1

我正在使用 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. 当客户端上的动画完成后,检查客户端的最终位置是否与服务器端存储的坐标相匹配。

当用户按下“右”按钮/键时,直到 1 秒后他才能重复按键。1 秒长的“行走”动画必须完成并使用服务器端坐标检查最终位置,然后他才能再次按“右”移动他的精灵。

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

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

4

1 回答 1

0

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

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

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

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

修改位置对象对我来说感觉不对。位置对象旨在存储位置,而不是时间。

于 2012-05-25T08:25:11.693 回答