2d движки на golang или как делать просчёт координат на сервере?

Есть клиент- у него есть шарик с координатами.
Он хочет переместиться в другую область канваса за определённое время.
Просчёт должен сделать сервер. Тоесть сервер знает, что клиент1 сейчас находится в координатах х=20;y=50 а клиент навёл мышкой на область х=120;y=150, тоесть отправил серверу-"хочу туда".
Сервер должен,скажем, за 2 секунды переместить Клиента1 в ту точку, если от клиента не будет новых указаний и каждые,скажем,100мс сообщать координаты Клиента1. Тоесть клиент только отрисовывает то,что прислал сервер и говорит-куда хочу. Подобное есть в игре agar.io
Как вообще на golang делать подобные просчёты?
Спасибо.
  • Вопрос задан
  • 667 просмотров
Пригласить эксперта
Ответы на вопрос 2
@mantyr
Пишу много Golang кода с удовольствием:)
По сути у вас две задачи:
1. анимация перемещения
2. взаимодействие с другими предметами/игроками

Анимация делается на js отдельно, для этого серверу не требуетс каждые 100мс сообщать куда двигаться (конечно если не было изменение маршрута).
А вот взаимодействие с другими предметами и игроками сложная штука, по сути там формула поиска пересечений траекторий объектов и принятие решений об изменении дальнейшей траектории или изменения состояний объектов. В некотором роде клиент и сервер дублируют эту задачу, просто делают это по разному.
Ответ написан
Комментировать
twobomb
@twobomb
Делал такое, кстате тоже аналог agar.io даже код остался. Но я использовал сервер Node.js.
Проще всего сделать так, клиент отсылает серверу угол и скорость и все. На канвас вешаем событие mousemove в нем определяем угол между шариком и мышью. Далее к шлем серверу. НО! Важно сделай ограничение к примеру чтобы отсылало не чаще чем 50мс, потому-что мышкой можно быстро шевелить и слишком много будет отсылаться на сервер.
На сервере же движения шарика организуй так
ball.x += speed * Math.cos(ball.angle);//Угол в радианах
ball.y += speed * Math.sin(ball.angle);//Угол в радианах
И отошли клиенту координаты шарику а он их тупо отрисует.
Ну и я так понимаю у тебя на сервере уже сделан игровой цикл, типа
fps = 30;//Количество просчетов в секунду
function gameLoop(){
//Твои действия, движения , просчеты
setTimeout(gameLoop,1000/fps);
}
И еще лучше чтобы скорость не клиент отсылал а она просчитывалась на сервере, а то читеры будут...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы