Я использую node.js и express, и я вызываю серверные функции и синхронизирую переменные с помощью nowjs. Предположим, что пользователь нарисован как спрайт на холсте. Его координаты x, y сохраняются на стороне сервера в массиве «позиция».Node.js/Nowjs - перемещение спрайта и отслеживание времени на стороне сервера
сторона сервера:
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 секунду. Я мог бы реализовать его таким образом:
- Пользователь нажимает кнопку «вправо».
- Анимация начинается с клиентской стороны.
- updatePosition называется сервером, как обычно.
- Когда анимация на клиенте заканчивается, проверьте, соответствует ли конечная позиция клиентской стороне координатам, хранящейся на стороне сервера.
Когда пользователь нажимает кнопку «право», он не может повторять нажатие кнопки до 1 секунды позже. 1-секундная «ходячая» анимация должна завершить и окончательную позицию, проверенную с помощью координат на стороне сервера, прежде чем он снова сможет нажать «право», чтобы переместить его спрайт.
Вопрос: Как отслеживать 1-ю сторону сервера? Я не могу сделать это на стороне клиента, потому что пользователь сможет взломать своего клиента, чтобы уменьшить время анимации.
Является ли решение «временной отметкой» массива позиций? Например. position = {x: 0; y: 0, время: 0}. Если пользователь снова нажмет кнопку «право», сервер проверит, было ли последнее обновление позиции больше 1 секунды назад. Если менее 1 секунды сервер игнорирует его.
Я бы сказал, что вы делаете это неправильно. Такая функция должна быть реализована только на стороне клиента. Код сервера не должен изменяться только для клиентских функций. Например, почему бы не просто называть 'updatePosition', когда анимация заканчивается? Или прерывание анимации, если пользователи нажимают на другое время? Или просто укладывать их? Является ли это важной функцией? – Pierre
Мне нужна анимация, чтобы выполнить 1 секунду. Пользователи могут взломать своего клиента, чтобы завершить анимацию за 0,5 секунды. Когда есть несколько пользователей, хакер сможет перемещаться в два раза быстрее, чем все остальные. – Legendre
Понял, спасибо. – Pierre