Разработка браузерной стратегии. Создание Вашего игрового сервера

01.04.2019

Network Media — одна из немногих российских компаний, которая разрабатывает браузерные игры любой сложности: от однопользовательских мини-игр (флэш-игр) до высокобюджетных BBMMOG (браузерных массовых многопользовательских онлайн-игр). Нам доступны все существующие жанры: шутер, стратегия, ролевая игра, спортивный менеджер, викторина, симулятор и т.д.

Мы разрабатываем игры «под ключ» для любых целей: для заработка, рекламы, продвижения бренда, товара или услуги.

Об основных преимуществах и выгодах game dev от Network Media можно узнать .

Что Вы получите Что входит в услугу «Разработка браузерных игр на заказ»

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

  • Графика: интерес к игре начинается с ее оформления

Вы получите игру с привлекательным графическим оформлением. Графика — это то, что в первую очередь «цепляет» пользователя. Это справедливо даже если речь идет о простой однопользовательской игре вроде пасьянса или линий. Что говорить о гораздо более сложных MMOG, многопользовательских играх?

Наши специалисты по game dev не только тщательно проработают графическое оформление, но и выберут тот его вариант, который наиболее полно отвечает содержанию игры. Если это военный шутер, то ставка будет сделана на максимальную реалистичность. Если это фентезийный мир, то — на красочность, яркость и оригинальность.

Хотя Network Media не чужды эксперименты. Возможно, военный шутер соберет гораздо больше пользователей, если будет выполнен в стиле аниме. Все это можно обсудить. Может быть воплощена любая графическая идея

  • Игровой процесс: увлекательность на первом месте

Вы получите игру, в которую интересно играть. Она может быть очень простой, но, тем не менее, крайне увлекательной. Специалисты Network Media по game dev найдет ту «фишку», которая сделает ее популярной.

Что касается продуктов класса MMOG, то наличие масштабного мира и большого количества игроков еще не обеспечивает игре успех. Основа успеха в данном случае — это опять же оригинальная идея и тщательно проработанный сценарий

  • Отсутствие багов: без права на провал в текстуры

Вы получите игру, в которой устранены все обнаруженные ошибки. В основном это относится к многопользовательским играм. Геймерам не нравится, когда их герой перестает реагировать на команды, или начинает проходить через стены, проваливаться в текстуры и т.д. Если количество подобных багов слишком велико, то велик шанс, что пользователь перестанет играть дальше. Поэтому Network Media уделяет повышенное внимание тестированию готового продукта, выявлению и устранению всех возможных ошибок

  • Стабильность и техническая поддержка: игра работает всегда и везде

Вы получите браузерную игру, которая отличается повышенной стабильностью работы. Это означает: 1) она открывается и работает в любых браузерах; 2) она работает на экранах с любым разрешением; 3) она стабильно функционирует, независимо от масштаба игрового мира и количества игроков. В последнем случае речь идет о многопользовательских играх, которые требуют постоянного обслуживания. Network Media готова обеспечить полную техническую поддержку разработанных игровых продуктов.

Для начала установите зависимости. Создайте папку проекта, перейдите в неё и запустите следующий код:

Npm init npm install --save express socket.io

Для быстрой настройки сервера целесообразно использовать фреймворк Express , а для обработки веб-сокетов на сервере - пакет socket.io . В файл server.js поместите следующий код:

// Зависимости var express = require("express"); var http = require("http"); var path = require("path"); var socketIO = require("socket.io"); var app = express(); var server = http.Server(app); var io = socketIO(server); app.set("port", 5000); app.use("/static", express.static(__dirname + "/static")); // Маршруты app.get("/", function(request, response) { response.sendFile(path.join(__dirname, "index.html")); }); // Запуск сервера server.listen(5000, function() { console.log("Запускаю сервер на порте 5000"); });

Это довольно типичный код для сервера на связке Node.js + Express. Он устанавливает зависимости и основные маршруты сервера. Для этого демонстрационного приложения используется только один файл index.html и папка static . Создайте их в корневой папке проекта. Файл index.html довольно простой:

Наша многопользовательская игра canvas { width: 800px; height: 600px; border: 5px solid black; }

Ваш пользовательский интерфейс может содержать куда больше элементов, поэтому для более крупных проектов CSS-стили лучше помещать в отдельный файл. Для простоты я оставлю CSS в коде HTML. Обратите внимание, что я включил в код скрипт socket.io.js . Он автоматически заработает в рамках пакета socket.io при запуске сервера.

Теперь нужно настроить веб-сокеты на сервере. В конец файла server.js добавьте:

// Обработчик веб-сокетов io.on("connection", function(socket) { });

Пока что в игре нет никаких функций, поэтому в обработчик веб-сокетов ничего добавлять не нужно. Для тестирования допишите следующие строки в конец файла server.js:

SetInterval(function() { io.sockets.emit("message", "hi!"); }, 1000);

Эта функция будет отправлять сообщение с именем message и содержимым hi всем подключенным веб-сокетам. Позже не забудьте удалить эту часть кода, так как она предназначена только для тестирования.

В папке static создайте файл с именем game.js . Вы можете написать короткую функцию для регистрации сообщений от сервера, чтобы убедиться в том, что вы их получаете. В файле static/game.js пропишите следующее:

Var socket = io(); socket.on("message", function(data) { console.log(data); });

Запустите сервер командой node server.js и в любом браузере перейдите по ссылке http://localhost:5000 . Если вы откроете окно разработчика (нажать правую кнопку мыши → Проверить (Inspect)), то увидите, как каждую секунду приходит новое сообщение:

Как правило, socket.emit(name, data) отправляет сообщение с заданным именем и данными серверу, если запрос идет от клиента, и наоборот, если запрос идет от сервера. Для получения сообщений по конкретному имени используется следующая команда:

Socket.on("name", function(data) { // аргумент data может содержать любые отправляемые данные });

С помощью socket.emit() вы можете отправить любое сообщение. Можно также передавать объекты JSON, что для нас очень удобно. Это позволяет мгновенно передавать информацию в игре от сервера к клиенту и обратно, что является основой многопользовательской игры.

Теперь пусть клиент отправляет некоторые состояния клавиатуры. Поместите следующий код в конец файла static/game.js:

Var movement = { up: false, down: false, left: false, right: false } document.addEventListener("keydown", function(event) { switch (event.keyCode) { case 65: // A movement.left = true; break; case 87: // W movement.up = true; break; case 68: // D movement.right = true; break; case 83: // S movement.down = true; break; } }); document.addEventListener("keyup", function(event) { switch (event.keyCode) { case 65: // A movement.left = false; break; case 87: // W movement.up = false; break; case 68: // D movement.right = false; break; case 83: // S movement.down = false; break; } });

Это стандартный код, который позволяет отслеживать нажатие клавиш W , A , S , D . После этого добавьте сообщение, которое оповестит сервер о том, что в игре появился новый участник, и создайте цикл, который будет сообщать серверу о нажатии клавиш.

Socket.emit("new player"); setInterval(function() { socket.emit("movement", movement); }, 1000 / 60);

Эта часть кода позволит отправлять на сервер информацию о состоянии клавиатуры клиента 60 раз в секунду. Теперь необходимо прописать эту ситуацию со стороны сервера. В конец файла server.js добавьте следующие строки:

Var players = {}; io.on("connection", function(socket) { socket.on("new player", function() { players = { x: 300, y: 300 }; }); socket.on("movement", function(data) { var player = players || {}; if (data.left) { player.x -= 5; } if (data.up) { player.y -= 5; } if (data.right) { player.x += 5; } if (data.down) { player.y += 5; } }); }); setInterval(function() { io.sockets.emit("state", players); }, 1000 / 60);

Давайте разберёмся с этим кодом. Вы будете хранить информацию о всех подключенных пользователях в виде объектов JSON. Так как у каждого подключённого к серверу сокета есть уникальный id, клавиша будет представлять собой id сокета подключённого игрока. Значение же будет другим объектом JSON, содержащим координаты x и y .

Когда сервер получит сообщение о том, что присоединился новый игрок, он добавит новый вход в объект игроков при помощи id сокета, который будет в этом сообщении. Когда сервер получит сообщение о движении, то обновит информацию об игроке, который связан с этим сокетом, если он существует.

io.sockets.emit() - это запрос, который будет отправлять сообщение и данные ВСЕМ подключённым сокетам. Сервер будет отправлять это состояние всем подключённым клиентам 60 раз в секунду.

На данном этапе клиент ещё ничего не делает с этой информацией, поэтому добавьте со стороны клиента обработчик, который будет отображать данные от сервера в Canvas .

Var canvas = document.getElementById("canvas"); canvas.width = 800; canvas.height = 600; var context = canvas.getContext("2d"); socket.on("state", function(players) { context.clearRect(0, 0, 800, 600); context.fillStyle = "green"; for (var id in players) { var player = players; context.beginPath(); context.arc(player.x, player.y, 10, 0, 2 * Math.PI); context.fill(); } });

Этот код обращается к id Canvas (#canvas) и рисует там. Каждый раз, когда от сервера будет поступать сообщение о состоянии, данные в Canvas будут обнуляться, и на нём в виде зеленых кружков будут заново отображаться все игроки.

Теперь каждый новый игрок сможет видеть состояние всех подключенных игроков на Canvas . Запустите сервер командой node server.js и откройте в браузере два окна. При переходе по ссылке http://localhost:5000 вы должны будете увидеть нечто похожее:

Вот и всё! Если у вас возникли проблемы, посмотрите архив с исходным кодом .

Некоторые тонкости

Когда будете разрабатывать более функциональную игру, целесообразно разделить код на несколько файлов.

Такие многопользовательские игры - отличный пример архитектуры MVC (модель-представление-контроллер). Вся логическая часть должна обрабатываться на сервере, а всё, что должен делать клиент - это отправлять входные пользовательские данные на сервер и отображать информацию, которую получает от сервера.

Однако в этом демо-проекте есть несколько недостатков. Обновление игры связано со слушателем сокета. Если бы я хотел повлиять на ход игры, то мог бы написать в консоли браузера следующее:

While (true) { socket.emit("movement", { left: true }); }

Теперь данные о движении будут отправляться на сервер в зависимости от характеристик компьютера более 60 раз в секунду. Это приведёт к тому, что игрок будет передвигаться невероятно быстро. Так мы переходим к концепции определения полномочного сервера.

Ни на каком этапе клиент не должен контролировать какие-либо данные на сервере. Например, никогда не нужно размещать на сервере код, который позволит клиенту определять своё положение/здоровье на основе данных, которые передаются через сокет, так как пользователь сможет легко подделать сообщение, исходящее из сокета, как показано выше.

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

Лучшая аналогия, которую я могу привести, заключается в том, что клиенты должны посылать на сервер только информацию о своих намерениях, которые затем будут обрабатываться и использоваться для изменения состояния игроков, если они валидны.

В идеале циклы обновлений как у клиента, так и на сервере не должны зависеть от сокетов. Попытайтесь сделать так, чтобы обновления игры находились за пределами блока socket.on() . В противном случае вы можете получить много странных нелогичных действий из-за того, что обновление игры будет связано с обновлением сокета.

Кроме того, старайтесь избегать такого кода:

SetInterval(function() { // код... player.x += 5; // код... }, 1000 / 60);

В этом отрезке кода обновление координаты х для игрока связано с частотой смены кадров в игре. SetInterval() не всегда гарантирует соблюдение интервала, вместо этого напишите нечто подобное:

Var lastUpdateTime = (new Date()).getTime(); setInterval(function() { // код... var currentTime = (new Date()).getTime(); var timeDifference = currentTime - lastUpdateTime; player.x += 5 * timeDifference; lastUpdateTime = currentTime; }, 1000 / 60);

Это не так изящно, зато обеспечит более плавную и последовательную работу. Усложните демо-проект и попробуйте сделать так, чтобы обновление осуществлялось согласно времени, а не частоте смены кадров. Если не захотите на этом останавливаться, попытайтесь создать на сервере физический движок, который будет управлять движениями игроков.

Также можно сделать так, чтобы из игры удалялись отключенные игроки. Когда сокет отключается, автоматически отправляется сообщение о разъединении. Это можно прописать так:

Io.on("connection", function(socket) { // обработчик событий... socket.on("disconnect", function() { // удаляем отключившегося игрока }); }); ,

Всем привет!

Что представляет собой игра? Видимо наиболее коротким описанием будет «клон Цивилизации» =). Но это не значит что у меня не хватило фантазии придумать что-то свое. Просто сделать «Цивилизацию» было моей мечтой. Вряд ли бы я получил столько удовлетворения от написания другой игры. Ну а фанаты Цивилизации наоборот считают, что моя игра совсем не похожа на Цивилизацию, разве что только с виду. Может это и к лучшему.

Игра называется The Fate of Nation http://fatenation.com

Расписывать архитектуру и логику работы приложения можно до бесконечности поэтому придется видимо разделить на несколько частей статью, если к ней будет интерес. Кроме того не вижу большого смысла приводить много кода, так как реализовать написанное мной можно на любом языке и платформе.

Для создания игры я использовал php и MySQL на сервере, html и javascript на клиенте. Flash не используется. Из html5 есть только видео на сайте и несколько областей с канвасом в самой игре - включая поверхность карты и мини-карту. Объем кода клиентской части в несколько раз превышает серверную часть, поэтому в основном буду рассказывать о клиентской разработке, но начнем с сервера.

Общая архитектура Общая архитектура приложения выглядит как полностью асинхронное веб приложение на JavaScript. Перезагрузок страниц не предусмотрено. Обмен данными с сервером исключительно через Ajax и JSON . В JSON"е передаются только данные, без html кода. Html разметка загружается отдельно в начале загрузки приложения и процессится с данными через клиентский шаблонизатор по мере загрузки данных с сервера.

На сервере никаких фреймворков не использовал - хотя начинал писать с использованием Zend Framework, который выкосил потом за ненадобностью. Вместо него создал свою простую архитектуру отдаленно напоминающую контроллеры и экшены из ZendFramework .

Как видно из рисунка, на сервере одна точка входа - файл index.php. В процессе игры на сервер идут запросы вроде такого: /Unit/Move. И посылается JSON с параметрами, в данном случае это id юнита и координаты перемещения. Сервер перенаправляет этот запрос на index.php, в котором последовательно выполняется подключение к БД, проверка текущего пользователя и парсинг строки запроса для определения контроллера (Unit) и действия (Move). Если контроллер не задан то сервер выдает индексную страницу с кодом для построения клиентского приложения, но об этом позже. Если же контроллер задан то ищется файл этого контроллера, подключается его код и запускается обработка запросов этого контроллера, где соответственно ищется необходимый экшн, а в нем производится проверка входных данных и дергается бизнес логика.

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

Теперь немного о самой игре.

Карта Первое что было сделано это карта на которой происходят почти все игровые действия: строительство городов, улучшений (посевы, дороги), перемещение юнитов и исследование карты. Размер карты составил 1000 на 1000 клеток для каждой отдельная запись в БД. Я видел игры где карта сделана бесконечной и записи о клетках динамически вставлялись тогда, когда с клеткой производились какие-либо действия. Но меня такой подход немного пугал своей непредсказуемостью. Гораздо проще планировать игру, когда точно знаешь, что у тебя есть фиксированная карта. Можно запланировать расположение игроков их количество, количество городов и юнитов, приблизительно оценить нагрузку.

Итого получилось 1000 * 1000 = 1 000 000 записей в БД для карты. До этого я не работал с таким количеством записей и меня это насторожило. Думал что будет тормозить.

Я решил перехитрить MySql и разместить карту в 10-ти таблицах по 100 000 записей в каждой с надеждой, что станет быстрее работать. В итоге пришлось написать дурацкую логику по выборке клеток из нескольких таблиц сразу, а замеры показали что производительность только упала. Вернул все назад в 1-у таблицу.

  • x, y - это координаты клетки.
  • terrain - тип территории (луг, лес, гора...).
  • resource - ресурс если он есть на клетке (глина, лошади).
  • wens9_code - название поля произошло от west-east-north… 9 - означает что изображение данной клетки зависит от территорий 8-ми рядом стоящих клеток и естественно от территории самой этой клетки - всего 9. Эту логику я спер с 3-ей цивилизации, насмотревшись их спрайтов территорий там где по 512 вариантов иконок для одной клетки!)) Потом у меня вскипел мозг разбирая зависимости по которым они выбирали иконки и я понял, какой это большой геморрой. =) И все только для одного: чтобы спрайты имели жесткие концы в виде ромбиков 128 на 64 пикселя. В конце концов мы решили использовать png24 с полупрозрачными краями накладывающиеся друг на друга и создающих в 10 раз лучший и разнообразный ландшафт, чем в описанном примере из Цив3. А выбираем иконки случайно независимо от соседних клеток. Это видно на скрине - сразу не скажешь где там одинаковые иконки полей. Вот горы по краям размыть забыли и они имеют четкие границы - что плохо смотрится.
  • starting_position - означает что в этой клетке появится игрок.
Конечно это не весь список полей, но здесь и далее для упрощения буду приводить только те поля, о которых рассказываю в статье.Регионы Клиент написан таким образом, что он не запрашивает с сервера определенные клетки, а запрашивает их партиями по 100 штук (10 на 10), которые я назвал регионами. То есть каждая клетка принадлежит какому-то региону и клиент запрашивает регионы и не конкретные клетки. Как только игрок перемещает карту так, что становится виден новый регион, мы посылаем запрос на сервер за этим регионом и граничащими с ним. Данные каждого загруженного регионакешируются на 30 секунд на клиенте. Это позволяет легко прокручивать карту без тормозов и лишних запросов на сервер и избавляет от задержки при появлении нового региона на карте - так как мы загружаем все соседние наперед.

Когда я делал эти «регионы» я не предполагал насколько они увеличат производительность. Оказалось выделить 100 клеток фильтруя по полю региона получается многократно быстрее чем фильтруя по координатам. Несмотря на то, что я объединил x и y координаты клетки в одно поле location = 1000*x + y. Сделал это прежде всего для удобства - чтобы легче было достать одну клетку.

Затем каждую сущность (города, юниты, ресурсы), которые располагаются на карте и имеют соответственно конкретные координаты, я также пометил регионом, что увеличило производительность выборок в сотни раз. Одно дело искать значения в таблице по ключу с миллионом уникальных значений и другое дело по ключу с 10 000 значений.

Таким образом получилась такая система: клиент запрашивает регионы - сервер достает из БД карту и все сущности на ней, быстро фильтруя по регионам - клиент отрисовывает это все в браузере на канвасе. У каждой сущности есть такие поля как время до окончания битвы или время до перемещения в следующую клетку - в этом случае по истечении этих таймаутов мы обновляем локально только то что требуется. Например если мы исследуем карту то догружаем только что открытые клетки и не более. Если вражеский юнит переместился - догружаем следующую точку его перемещения.

Исследование карты Однако меня терзал еще один вопрос. Мне позарез хотелось сделать исследование карты - чтобы изначально она была не разведана и нужно было ходить по ней чтобы что-то увидеть.

Такого я не видел еще в браузерных играх (собственно как и юнитов передвигающихся по карте, а не по воздуху). Я принялся за расчеты. Стартовая позиция игрока расположена внутри региона. То есть максимальное количество игроков 10 000 как и регионов. Каждый игрок может разведать всю карту. Итого 10 000 * 1 000 000 = 10 миллиардов записей может быть в таблице пермишенов на клетки! Таблица карты показалась на фоне этого детским лепетом =). Конечно эта цифра завышена. Вряд ли кому-то удастся разведать всю карту - она очень большая. Но десятки и сотни миллионов записей в таблице пермишенов точно могут быть в конце игры.

И на эту таблицу нужно было джойнить все сущности включая саму карту каждый раз при выборке регионов. Здесь опять спас меня ключ по полю региона, который позволил делать эти джоины намного быстрее.

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

Перемещение юнитов Чтобы сделать перемещение юнитов пришлось тоже подумать и переписать логику несколько раз.
Первое что нам нужно, это точно отслеживать время открытия новых клеток чтобы можно было отфильтровывать клетки, юниты и города по этим данным. Сразу напрашивается использовать таблицу пермишенов на карту, но со спец-полем - означающим время когда эта запись станет активной. Так и было сделано. Клиент отправляет id юнита, и новую координату дислокации. Сервер просчитывает текущую позицию юнита, координаты клеток по которым он будет перемещаться, и в зависимости от территории этих клеток, типа юнита и других параметров высчитывает время когда этот юнит будет в каждой клетке. Затем дополнительно просчитываются таким же образом соседние клетки в зависимости от радиуса обзора юнита.

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

Далее записи пермишенов, которые говорят о перемещении юнита мы помечаем еще 2 полями: id юнита и типом записи: "обзорные клетки " или "клетки по которым идет юнит ". Первое поле нужно чтобы при остановке юнита или смене пункта назначения можно было их удалить, второе нужно чтобы при выборке юнита записать ему времена смены дислокации.

Затем коллеги по работе мне подсказали еще один довольно очевидный момент: ввести поле означающее время выхода юнита с данной клетки. Я назвал его out_timestamp. Это позволило легко выбирать текущие позиции всех юнитов и соответственно фильтровать вражеских юнитов по видимым нами клеткам.

Уверен, что мой пример не самая удачная архитектура для подобной игры, но вроде работает =) В следующих статьях могу рассказать о клиентской архитектуре, кешировании, используемом фреймворке и о том, как мне удалось сделать демонстрационную версию игры работающую без запросов к серверу, чисто на клиенте.

Да, кстати, часто после различных постов об игре народ начинает хвалить графику, а не геймплей. Так что скажу сразу - я ее не рисовал!!! Это все наш художник-дизайнер Максим Кудрицкий.

Введение

Браузерная игра - это онлайновая игра, которая выполняется в любом современном интернет-браузере и не требует установки на компьютер игрока никакого дополнительного программного обеспечения.
В нашем новом обучающем курсе мы с Вами займемся разработкой многопользовательской стратегической браузерной игры. В играх этого жанра одновременно могут взаимодействовать тысячи игроков. В основном, игры подобного жанра имеют обычный HTML или Flash интерфейс со вставками Java-Script кода, который подразумевает получение некой информации от игрока в процессе игры, передачи ее на сервер для принятия решения в соответствии с игровой логикой и возврата ответа на эти действия.
В настоящий момент наиболее распространенными жанрами онлайновых браузерных игр являются ролевые и стратегические. Пройдя наш курс, Вы научитесь создавать браузерные игры стратегического жанра. Такие игры собирают очень большие аудитории своих почитателей и, соответственно, приносят разработчикам хороший доход при внедрении платных игровых сервисов.
Конечно же большинство пользователей веб-развлечений и просто любителей компьютерных игр, наверняка слышал и об одной из самых популярных браузерных, стратегий - "Travian". Эта игра переносит игрока в овеянный легендами мир античности, где суровые воины сражаются за свои поселения и объединяются для захвата чужих земель.
Так как игра браузерная, то минимальным требованием для ее начала является обычный браузер и у игрока нет необходимости скачивать какие-либо дополнительные клиенты. Игра разработана "Travian Games GmbH" в 2004 году и с тех пор снискала себе огромную популярность среди геймеров всего мира. Игра переведена на десятки языков, в нее играют в более чем в 50 странах. Travian - одна из самых популярных браузерных игр в мире. Успех Травиана обусловлен тщательно продуманным балансом сил, разнообразием выбора тактики игры, необходимостью слаженного командного взаимодействия. Не последнюю роль сыграла оригинальная графика игры, нарисованная с большим юмором, и "легкость" загружаемых страниц.
На протяжении обучения на курсе создания браузерных стратегий мы с Вами создадим поселок с добычей ресурсов - зерна, глины, дерева и железной руды, научимся строить здания и апгрейдить их до более высоких уровней. Наши занятия затронут тему создания глобальной игровой карты с поселками других игроков, а также других игровых зон, таких как оазисы. Мы рассмотрим вопросы обмена ресурсами на рынке между несколькими пользователями игры, перемещения торговцев к поселкам других игроков, научимся строить войска и исследовать новые типы войск пехоты и кавалерии, а затем совершать набеги на поселки других игроков с целью уничтожения войск и захвата ресурсов. Кроме этого, мы научимся использовать героя, повышать его характеристики и с его помощью захватывать соседние оазисы, а также рассмотрим многие другие вопросы создания игровой логики на примере разработки нашей с Вами стратегической браузерной игры.


Для кого предназначен курс

Данный курс предназначен как для начинающих программистов, так и для программистов, имеющих некоторый опыт, желающих освоить эффективное программирование с применением web-ориентированных технологий на примере увлекательного создания собственной стратегической браузерной игры.
Курс базируется на использовании скриптового языка PHP и базы данных MySQL на стороне сервера и языка разметки веб-страниц HTML и JavaScript на стороне клиента. Естественно, в качестве как серверной, так и клиентской машины, мы будем использовать один и тот же компьютер. Рекомендуемым условием прохождения курса является платформа Windows XP/Vista с установленным Service Pack не ниже первого или Windows 7.
Для успешного прохождения курса необходимы базовые навыки программирования на любом языке, опыт создания сайтов, любовь к компьютерным играм и, безусловно, большое желание разрабатывать компьютерные игры самому.

Что вы будете уметь

Освоив полный курс обучения созданию браузерных стратегических игр, Вы получите необходимые практические навыки применения игровой логики в web-ориентированных приложениях.
Начинающие программисты откроют для себя технику создания интерактивных web-сайтов с ярко выраженной игровой направленностью. Те, кто уже знаком с интернет-технологиями, смогут расширить свой кругозор за счет изучения области создания многопользовательских браузерных игр. Постепенно изучая материал нашей учебной программы, Вы быстро достигнете практических результатов. Удобно построенная и четко продуманная структура наших с Вами уроков будет постоянно стимулировать Вас к продолжению учебы.
Итогом наших с Вами занятий станет хорошее понимание процессов взаимодействия клиент-серверного web-ориентированного приложения, разработанного на языке PHP, и базой данных MySQL применительно к игровым ситуациям создаваемой на нашем курсе онлайновой стратегической игры.
для получения первого (БЕСПЛАТНОГО), ознакомительного урока курса "Создание стратегических браузерных игр "!

Ваши дальнейшие шаги

Если Вы читаете эти строки, то наверняка у Вас уже были идеи создания подобного "Травиан" или другого, схожего с подобными играми, проекта, и Вы не знали с чего начать. Тогда наш новый учебный курс - прекрасная стартовая площадка для понимания и облегчения процесса разработки таких игровых моделей!
После прохождения этого курса, Вы сможете в домашних условиях создавать свои онлайновые игровые проекты и, кто знает, может быть именно Ваша игра станет очередным шедевром на рынке браузерных игр и принесет огромное удовольствие тысячам ее поклонников, а Вы получите большое, как моральное, так и материальное удовлетворение от реализации Вашего замысла!
Нам же остается пожелать Вам успехов независимо от Вашего выбора, и, если Вы пожелаете пройти обучение, то нам будет очень приятно передать Вам знания касательно разработки стратегических браузерных игр.
Еще раз напомним, что пройдя процедуру , Вы получаете доступ к первому (БЕСПЛАТНОМУ), ознакомительному уроку курса "Создание стратегических браузерных игр ".

Закрыть

Политика конфиденциальности и защиты информации

Оставляя данные на сайте, Вы соглашаетесь с Политикой конфиденциальности и защиты информации.

Защита данных

Администрация сайта (далее Сайт) не может передать или раскрыть информацию, предоставленную пользователем (далее Пользователь) при регистрации и использовании функций сайта третьим лицам, кроме случаев, описанных законодательством страны, на территории которой пользователь ведет свою деятельность.

Получение персональной информации

Для коммуникации на сайте пользователь обязан внести некоторую персональную информацию. Для проверки предоставленных данных, сайт оставляет за собой право потребовать доказательства идентичности в онлайн или офлайн режимах.

Использование персональной информации

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

Коммуникация

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

Безопасность

Сайт обеспечивает безопасность учетной записи Пользователя от несанкционированного доступа.

Уведомления об изменениях

Сайт оставляет за собой право вносить изменения в Политику конфиденциальности без дополнительных уведомлений. Нововведения вступают в силу с момента их опубликования. Пользователи могут отслеживать изменения в Политике конфиденциальности самостоятельно.