2012-05-25 2 views
1

Я использую 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 секунду. Я мог бы реализовать его таким образом:

  1. Пользователь нажимает кнопку «вправо».
  2. Анимация начинается с клиентской стороны.
  3. updatePosition называется сервером, как обычно.
  4. Когда анимация на клиенте заканчивается, проверьте, соответствует ли конечная позиция клиентской стороне координатам, хранящейся на стороне сервера.

Когда пользователь нажимает кнопку «право», он не может повторять нажатие кнопки до 1 секунды позже. 1-секундная «ходячая» анимация должна завершить и окончательную позицию, проверенную с помощью координат на стороне сервера, прежде чем он снова сможет нажать «право», чтобы переместить его спрайт.

Вопрос: Как отслеживать 1-ю сторону сервера? Я не могу сделать это на стороне клиента, потому что пользователь сможет взломать своего клиента, чтобы уменьшить время анимации.

Является ли решение «временной отметкой» массива позиций? Например. position = {x: 0; y: 0, время: 0}. Если пользователь снова нажмет кнопку «право», сервер проверит, было ли последнее обновление позиции больше 1 секунды назад. Если менее 1 секунды сервер игнорирует его.

+0

Я бы сказал, что вы делаете это неправильно. Такая функция должна быть реализована только на стороне клиента. Код сервера не должен изменяться только для клиентских функций. Например, почему бы не просто называть 'updatePosition', когда анимация заканчивается? Или прерывание анимации, если пользователи нажимают на другое время? Или просто укладывать их? Является ли это важной функцией? – Pierre

+0

Мне нужна анимация, чтобы выполнить 1 секунду. Пользователи могут взломать своего клиента, чтобы завершить анимацию за 0,5 секунды. Когда есть несколько пользователей, хакер сможет перемещаться в два раза быстрее, чем все остальные. – Legendre

+0

Понял, спасибо. – Pierre

ответ

0

Почему бы не просто сохранить «блокировку» в сеансе пользователя?

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

Когда другое редактирование инициируются клиентом, просто:

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

модифицирующие объект позиции не чувствует себя хорошо для меня. Объект позиции предназначен для хранения позиции, а не времени.

+0

Спасибо за ответ.Могут ли игроки взломать сеанс, чтобы «разблокировать» себя? Я использую express + passportjs для обработки сеансов входа в систему. Я полагаю, что crux использует «Data(). GetTime()» на стороне сервера, чтобы отслеживать время (временная метка обновления позиции). Где я сохраняю временную метку (сеанс или массив позиций), не имеет значения? – Legendre

+0

Нет, сеанс строго связан с сервером, и пользователи не могут изменять данные сеанса. Вот почему он используется для аутентификации. Технически, когда вы храните метку времени, это не имеет никакого значения. Но когда вы сомневаетесь в том, где хранить некоторые данные, я всегда советую вам спросить себя о том, что делает больше смысла. В этом случае я бы определенно сказал, что сохранение этого в сеансе действительно имеет больше смысла, чем в данных о местоположении, которые я ожидаю сохранить ... позицию. Не временная метка. – Pierre

+0

Ницца. Я думаю, что буду использовать сеансы для хранения «блокировки». И еще отметьте позицию. Причина в том, что я планирую, чтобы несколько пользователей перемещали спрайты на моем веб-сайте и взаимодействовали (например, анимация, когда они сталкивались). Массив позиции может быть обновлен с конечной позицией на стороне сервера, но на стороне клиента спрайт все еще «идет». Последний вопрос: сеанс кажется удобным местом для сброса всех переменных, связанных с игроком. Например. Если бы я решил иметь «здоровье», которое уменьшается каждый раз, когда спрайты сталкиваются, я могу сохранить переменную «здоровье» в сеансе. Или я ошибаюсь? – Legendre