Comments 60
Не совсем понял про АИ, если честно, если речь идёт об artificial intelligence, то его в FOTM попросту нет, бои идут только между игроками. Два клиента противников общаются между собой через socket сервер через socket.emit в пределах игровой комнаты. По поводу второго вопроса: если после определённого действия изменилось только состояние той команды, чей сейчас ход (например, после передвижения), тогда я отправляю на сервер только информацию о ней:
Client:
Server:
Если изменилась информация об обоих командах (например, после применения способности):
Client:
Server:
Client:
mainSocket.emit("updateActiveTeam", $rootScope.currentBattle.room, $scope.myTeam.characters);
Server:
socket.on('updateActiveTeam', function(room, chars) {
socket.broadcast.to(room).emit('updateActiveTeamResult', chars);
});
Если изменилась информация об обоих командах (например, после применения способности):
Client:
mainSocket.emit("updateTeams", $rootScope.currentBattle.room, $scope.myTeam.characters, $scope.enemyTeam.characters);
Server:
socket.on('updateTeams', function(room, chars1, chars2) {
io.sockets.in(room).emit('updateTeamsResult', chars1, chars2);
});
У вас один игрок может изменять состояние второго игрока?.. А как вы это всё на сервере валидируете?
Не игрока конкретно, а состояние его персонажей во время боя. Персонажи — это фабрики, которые собираются перед началом боя из сущности в БД, где хранится только базовая информация. После боя инстансы естественно удаляются, сохраняется только информация о команде (изменение рейтинга и ресурсов). Сервер в данном случае работает как зеркало и просто кидает информацию о командах обратно игрокам. Со стороны каждого клиента есть хэндлеры на updateTeamsResult.
О, то есть читерство через консоль, получается, неограничено? :)
Валидация на сервере, на самом деле, крайне важная часть архитектуры. В идеале это должно выглядеть как «игрок посылает своё действие, сервер его обрабатывает и рассылает диффы игрокам», причём доступные действия выглядят как «иду налево» или «атакую вверх», самой своей формулировкой отсекая заранее читерские варианты (иду на такую-то клетку, например). Понятно что у вас проект ни на что особое (пока) не претендует, но если вы хотите чтобы в него играли массово, озаботиться валидацией придётся, потому как по закону подлости всегда найдётся какая-нибудь злобная редиска, которая будет портить игру другим.
Валидация на сервере, на самом деле, крайне важная часть архитектуры. В идеале это должно выглядеть как «игрок посылает своё действие, сервер его обрабатывает и рассылает диффы игрокам», причём доступные действия выглядят как «иду налево» или «атакую вверх», самой своей формулировкой отсекая заранее читерские варианты (иду на такую-то клетку, например). Понятно что у вас проект ни на что особое (пока) не претендует, но если вы хотите чтобы в него играли массово, озаботиться валидацией придётся, потому как по закону подлости всегда найдётся какая-нибудь злобная редиска, которая будет портить игру другим.
Да вот как раз проблема, то в том, что можно и на любую клетку ходить (с помощью спелов, например), и урон сильно варьируется. Слишком много условий для валидации. В дальнейшем просто введу uglify на продакшн и gulp'ом сошью всё в одну простыню, чтобы никто ничего не разобрал))
Лучше webpack, серьёзно :)
Увы, всё что углифицировано, может быть бьютифицировано; это не говоря уж об упомянутом выше перехвате трафика. Поэтому я и описал верную схему, когда игрок посылает не новую диспозицию (которую, действительно, практически невозможно валидировать), а лишь своё действие, результаты которого вычисляются уже на сервере. Реализовать это, на самом деле, вовсе не сложно, особенно учитывая гомогенность приложения (везде js): просто границу клиент/сервер надо перенести, взвалив побольше ответственности на последний.
Увы, всё что углифицировано, может быть бьютифицировано; это не говоря уж об упомянутом выше перехвате трафика. Поэтому я и описал верную схему, когда игрок посылает не новую диспозицию (которую, действительно, практически невозможно валидировать), а лишь своё действие, результаты которого вычисляются уже на сервере. Реализовать это, на самом деле, вовсе не сложно, особенно учитывая гомогенность приложения (везде js): просто границу клиент/сервер надо перенести, взвалив побольше ответственности на последний.
Дело в том, какое минимальное действие отправлять. Допустим, всем будет заниматься backend, на клиенте мы выбрали способность у персонажа и использовали на вражеском персонаже — минимальные данные (кто, способность уровня X, на кого). Но «X» всё равно можно хакнуть. Эту информацию просто невозможно отделить от клиента. Хоть в этом случае руки у редиски уже связаны посильнее…
https://fotm.herokuapp.com/
у меня не работает, в консоль ошибки пишет, вроде с гугл аналитикой что-то
Как вы её нашли?))
Win 7, Chrome, черный экран…
Особое внимание необходимо уделить руководству к игре, его можно найти здесь https://vk.com/fotm_game
Хотелось бы больше технических подробностей.
Выглядит хорошо. Хотелось бы посмотреть на кусочки кода, или хотя бы алгоритмы.
Зашел в игру, очень долго ждал соперника, так никто и не появился. Хоть онлайн был 2-3 человека.
Как для одного программиста игра очень даже прикольная.
Интересно, планируется ли переход на Ангуляр 2?
Как для одного программиста игра очень даже прикольная.
Интересно, планируется ли переход на Ангуляр 2?
Круто, что был проделан весь путь изучения веб технологий ради создания игры) Кстати не рассматривали meteor js? Делал на нем простенькую онлайн игру, очень удобно в плане общения сервера и клиента, mongo и angular «из коробки»
Да, это был очень непростой, но интересный путь. На meteor я наткнулся уже позже, во время создания. Изучение нового framework'а отняло бы часть времени, которое хотелось потратить на имплементации нового функционала. В самом начале я смотрел в сторону MEAN stack, но потом решил использовать те же инструменты по-старинке)
на мой взгляд, не хватает чатика
Спасибо за развёрнутый комментарий)
В целом я думаю, что ты прав, разобраться с наката не получится. На добавление системы левелинга аля HS уйдёт не мало времени. Пока же я планирую выпустить серию обучающих видео с нюансами тактики и механики классов. А по поводу казуалов — им и так есть во что поиграть, мне же хотелось сделать игру похардкорней)
В целом я думаю, что ты прав, разобраться с наката не получится. На добавление системы левелинга аля HS уйдёт не мало времени. Пока же я планирую выпустить серию обучающих видео с нюансами тактики и механики классов. А по поводу казуалов — им и так есть во что поиграть, мне же хотелось сделать игру похардкорней)
О таком я пока не думал, подозреваю кучу проблем с интегрированием VK API на Express.js. Тем более касательно приколюх с выкидыванием такого же игрока из сессии…
Раз у вас всё завязано на почте, лучше использовать почтовые сервисы, как упомянутый мною gmail. В таком случае никаких особых проблем тут не наблюдается — нажал на кнопку, подтвердил у гугла, если это первый вход — ввёл свой ник (с существующей уже валидацией) иначе просто сразу входишь. Со стороны сервера нужно только на каждый вход через кнопку сделать один запрос к гугл апи вида «у пользователя с вот таким токеном действительно вот такая почта?».
Подключается http://passportjs.org
Эта библиотека для аутентификации, к которой с помощью модулей подключаются всевозможное способы входа
Эта библиотека для аутентификации, к которой с помощью модулей подключаются всевозможное способы входа
Спасибо за толковую статью!
Если действительно будет цикл статей по техническим аспектам, то с радостью прочту.
Если действительно будет цикл статей по техническим аспектам, то с радостью прочту.
У меня прям крылья выросли как прочел. Как раз сейчас только встаю на эту трапу — разработки игр (давняя мечта). Буду ждать обновлений, если будут, ну и по-рублюсь в игруху:)
Иконки скилов крутые. Сами рисовали?
Нет, иконки все free, брал с сайта http://game-icons.net/
Случайно обнаружил баг: первоначально вписал ник «qwe», создавая второго персонажа. Ответом было сообщение, что данный ник уже занят. После чего я просто переписал его, но кнопка создания персонажа уже не работала:
i.imgur.com/3i5f4sz.png
i.imgur.com/3i5f4sz.png
Первое награждение самых настойчивых игроков за первые 2 дня игры)
https://vk.com/fotm_game?w=wall-111631987_4
https://vk.com/fotm_game?w=wall-111631987_4
Первый стрим по игре с разъяснениями ряда игровых моментов)
https://www.twitch.tv/needfulele
https://www.twitch.tv/needfulele
Sign up to leave a comment.
Опыт разработки игры на Node.js и Angular.js