Сообщение от keen
|
во-первых, отдели мух от котлет: игровой мир (структуры данных, "физические координаты" и прочее) и визуальный мир (то что видят игроки).
то есть, условно, сервер тебе присылает структуру вида
|
Ага, так сейчас и есть! клиент получает приблизительно вот такую шнягу:
var currentgame = {
players: {
playerID: {
nickname: nickname,
x: 1180,
y: 340,
z: 340,
currentframe: 0,
weapon: 0
}
},
weapons: {}};
после на клиенте я сортирую их по Z и начинаю рисовать дальнего от экрана игрока
Сообщение от keen
|
смотри - "по-хорошему" когда игрок нажимает стрелку вверх, клиент должен послать серверу сообщение об этом, сервер должен его обработать и прислать новый снапшот состояния игры, в котором игрок переместился вверх. на практике это приведёт к задержке и дёрганиям (пока запрос уйдёт, пока сервер ответит..).
|
Считаю точно так же,и от этого я отказался(так было в первой версии)
Сообщение от keen
|
к слову, в интерактивном режиме лучше пользоваться не аяксом, а веб-сокетами.
|
ага, аяксом тут не отделаешься - пользуюсь
socket.io
Теперь попробую уточнить...
Я согласен, что анимацию надо перенести на клиент,а теперь для наглядности проблемы:
Берем вариант что клиент спрашивает сервер раз в 100мс что рисовать,тогда:
1[00.00]C1:S Что рисовать?
2[00.05]S:C Ответ
3[00.10]C1: Отрисовывает
4[00.50]C1:S -> Иду вправо
(теперь надо отрисовать 3 кадра подряд)
А в этот момент некий C2 тоже начинает движение...
И как быть? Если отрисовка шагов C1 еще не закончилась,а уже пришел пакет на то, что C2 тоже куда то поперся.
Тут я представил, что можно сохранять мир при запросе к серверу "Что рисовать" и при пакете о движении С2 начать менять его координаты, но тогда мы теряем 1 кадр(типа если С1 рисует 3 кадра,а движение С2 началось с отрисовки 2ого кадра С1)
Если мы используем ту же функцию что и для отрисовки С1, тогда вообще не понятно что будет отрисовываться)) т.к в одно время будут рисовать сразу 2 функции(а если клиентов 10?100?)
2ой косяк, будет если анимация начнется с [00.95], тогда отрисуется 1 кадр анимации, и в [01.00] придет пакет который заменит весь сохраненный мир, и 2ым кадром Игрок будет на "новой координате", т.е на кадре "0" потеряв кадр 2 и 3.
Тут уже начинаю думать о неком Стеке анимаций,но как сделать что бы не случился рассинхрон накопленных анимаций с действиями в игре?

Или выполнять анимацию из стека пока не получили новый пакет "Что рисовать" и забить на потерю остатка анимаций?
Надеюсь суть проблемы понял, и спасибо что ответил!
Надеюсь услышать еще рассуждений на эту тему.