Показать сообщение отдельно
  #1 (permalink)  
Старый 04.04.2013, 01:00
Интересующийся
Отправить личное сообщение для ak-o Посмотреть профиль Найти все сообщения от ak-o
 
Регистрация: 04.04.2013
Сообщений: 10

Анимация в real-time приложениях(Нужны советы)
Всем привет! Пришла мысль, сделать dendy игру аналог на jquery+nodejs.
Пишу на jquery не так давно,и играми естественно никогда не занимался.
Встрял на Анимации персонажей и окружающего мира.
1ая реализация была такая:
Подключившись к серверу, клиент получает содержимое текущего мира и "отрисовывает" его в браузере.
На деле было так: на клиент приходил массив, всех игроков которые были в игре, каждый игрок добавлялся на страницу как Дом элемент.
При движении в N сторону, посылался запрос на сервер о движении персонажа, после чего он вносил новые координаты текущего игрока в окружающий мир и после этого, давал команду на анимацию клиенту и всем остальным участникам.
Открыто сказать работало это всё дело коряво, ситуация усугублялась тем ,что сам клиент должен был оставаться на месте, прокручивая окружающий мир в N сторону.От этого происходила путаница кого в какую сторону надо двигать,да еще и начальная координата была "-170" что еще больше путало.
2ая реализация работает уже так: всё тоже самое, только вместо ДОМ элементов теперь использую Canvas, клиент постоянно спрашивает у сервака "че происходит" и тот ессесно, любезно рассказывает.
Всё явно стало работать лучше,рассинхрону случится просто негде,т.к каждый кадр это Вопрос к серверу "Что на экране".При событии движения сервер меняет координату текущего игрока и в следующем запросе клиента видно, что тот походил.

Проблема встала в том, что так хорошо получается сделать анимацию в 2 кадра,а сейчас надо минимум 2.
Следующая проблема это то, что каждый кадр приходится рисовать заново с нуля.А игрок, может ходить как по горизонтали,так и по вертикали,как следствие - нужно определять кто стоит выше а кто ниже.
В идеале, хотелось бы сделать, что бы при движении в N сторону, игрок делал 2 кадра, после чего возвращался в исходную позицию.

Анимация двух кадров работает так:
1.клиент setInterval(100) посылает серваку "че?"
---
Клиент::Движение: говорим серверу Я иду вправо, тот меняет координату с 0 на 1, текущий спрайт с 0 на 1, после чего опять setInterval(50),который возвращает спрайт с 1 на 0.
На клиенте мы видим анимацию в 1 кадр,да при этом, в зависимости от
время нажатия клавиши движения относительно последнего запроса мы Всё равно попадаем в момент, когда анимация на сервере происходит быстрее, и клиент без кадра движения телепортируется на точку движения

Вообщем, знаю что это бредово, но пока это всё что я придумал, и хотел бы услышать ваши соображения по поводу такой задачи и её грамотной реализации
К слову, думаю засесть ковыряться с исходниками BrowserQuest,но уровень кода+связка с другими технологиями о которых я не знаю,усложняет понимание..
Ответить с цитированием