35 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как сделать онлайн игру на java

Игра на чистом JavaScript за 20 минут

На JS можно создавать сложные и простые игры любых жанров. Мы расскажем как создать 2D игру на JavaScript и HTML5 всего за 20 минут.

Для создания веб игр на языке JavaScript используется технология Canvas , которая позволяет выполнять JavaScript код в HTML5 документе. Вы можете более детально ознакомиться с этой технологией посмотрев видео ниже:

На html странице прописывается лишь тег канвас, а также подключение JS файла, в котором будет происходить обработка всей функциональности. К примеру, HTML файл может выглядеть следующим образом:

В JS файле необходимо найти нужный канвас по id и указать способ работы с ним.

Добавление изображений и аудио

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

  • Скачать аудио файлы можно по этой ссылке ;

Код добавления изображений и аудио в игру:

Рисование объектов

Чтобы нарисовать объекты, а также добавить функционал к игре необходимо прописать функцию, которая будет постоянно вызываться. Такую функцию вы можете назвать как вам будет угодно. Главное, вам нужно вызвать эту функцию из вне её хотя бы один раз, а внутри неё прописать метод requestAnimationFrame , который будет вызывать функцию постоянно.

Статья в тему:  Как включить реплеи в world of warships

Весь код игры стоит помещать в этот метод, ведь в нем он будет постоянно обрабатываться и игра будет выглядеть живой и анимированной.

Чтобы отследить нажатие игрока на какую-либо клавишу, необходимо использовать отслеживание событий – addEventListener . К примеру, чтобы отследить нажатие на любую клавишу на клавиатуре надо прописать следующий код:

Видео урок

Это были лишь небольшие азы перед созданием самой игры. Предлагаем вам ознакомиться с небольшим видео уроком, в ходе которого вы создадите небольшую 2D игру на чистом JavaScript’е.

Весь JS код игры

Ниже вы можете посмотреть на полностью весь код JavaScript файла, который был создан в ходе видео урока выше:

Как написать игру на JavaScript

Современные браузеры позволяют создавать игры с полноценной графикой. Рассказываем, как написать простые гонки на JavaScript и HTML5.

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

Дело в том, что технология Flash тяжеловесна, а также полна уязвимостей, поэтому от неё стали отказываться. Тем более что появилась альтернатива в виде HTML5 — в этой версии появился элемент canvas.

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

Статья в тему:  Что такое стиллер в доте

Из этой статьи вы узнаете, как создать браузерную игру на JavaScript и HTML5. Но прежде рекомендуем ознакомиться с объектно-ориентированным программированием в JS (достаточно понимать, что такое класс, метод и объект). Оно лучше всего подходит для создания игр, потому что позволяет работать с сущностями, а не с абстрактными данными. Однако есть и недостаток: ООП не поддерживается ни в одной из версий Internet Explorer.

Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.

Вёрстка страницы с игрой

Для начала нужно создать страницу, на которой будет отображаться холст. Для этого потребуется совсем немного HTML:

Теперь нужно добавить стили:

Обратите внимание, что в HTML элементу canvas были заданы нулевые ширина и высота, в то время как в CSS указано 100%. В этом плане холст ведёт себя как изображение. У него есть фактическое и видимое разрешение.

С помощью стилей меняется видимое разрешение. Однако при этом размеры картинки останутся прежними: она просто растянется или сожмётся. Поэтому фактические ширина и высота будут указаны позже — через скрипт.

Скрипт для игры

Для начала добавим заготовку скрипта для игры:

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

Статья в тему:  Берн люди которые играют в игры читать онлайн

Логика игры

Во время вызова функции Update () будут меняться состояния игровых объектов. После этого они отрисовываются на canvas с помощью функции Draw (). То есть на самом деле мы не двигаем объекты на холсте — мы рисуем их один раз, потом меняем координаты, стираем старое изображение и выводим объекты с новыми координатами. Всё это происходит так быстро, что создаётся иллюзия движения.

Рассмотрим это на примере дороги.

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

Для этого создадим класс Road:

В массив с фонами добавляются два объекта класса Road:

Теперь можно изменить функцию Update (), чтобы положение изображений менялось с каждым кадром.

Остаётся только добавить вывод этих изображений:

Теперь можно посмотреть, как это работает в игре:

Пора добавить игрока и NPC. Для этого нужно написать класс Car. В нём будет метод Move (), с помощью которого игрок управляет своим автомобилем. Движение NPC будет осуществляться с помощью Update (), в котором просто меняется координата Y.

Reddwarf для создания Java-сервера на примере онлайн-игры «Камень-ножницы-бумага»: Сервер

В статье RedDwarf — cерверная платформа для разработки онлайн-игр на Java я рассказал об особенностях этой платформы для создания игровых серверов. В данной статье я попробую показать на примере, как написать сервер и использованием RedDwarf.
В качестве примера решено было написать онлайн-реализацию игры «Камень-Ножницы-Бумага».
В этой статье мы напишем сервер и попробуем его запустить. В следующей статье напишем для этого сервера небольшой клиент и проверим их работоспособность.

Статья в тему:  Как писать скрипты для доты

Подготовка к работе

Для начала необходимо закачать сервер Reddwarf в архиве sgs-server-dist-0.10.2.zip отсюда и распаковать содержимое в папку sgs-server-dist-0.10.2.

Создание проекта

Создадим проект в любимой среде разработки.
Проект будет простой, поэтому maven использовать не будем.
Для разработки нужна библиотека sgs-server-api-0.10.2.jar из директории sgs-server-dist-0.10.2lib

Создаем папку META-INF, в ней должен находиться файл манифеста MANIFEST.MF. Без него платформа отказывается работать с jar-файлом проекта. У меня файл содержит только одну строчку:
Manifest-Version: 1.0

Также в папке META-INF необходимо создать файл app.properties. В этом файле содержатся настройки запуска сервера. Для нашего проекта файл содержит следующие свойства:

Это минимальный необходимый набор опций. При разработке могут быть ещё полезны следующие свойства:

  • com.sun.sgs.impl.transport.tcp.listen.port — порт, на котором слушает сервер (по умолчанию 62964)
  • com.sun.sgs.app.authenticators — имена классов, отвечающих за аутентификацию (процесс аутентификации вынесен из игровой логики и может идти независимым модулем)
  • com.sun.sgs.impl.service.session.allow.new.login — позволять ли подключаться уже подключенным игрокам с другого клиента. Если true, то того, кто сейчас в игре выкидывает. Если false, не позволяет подключаться с другого клиента.

Подробнее о других свойствах можно почитать в документации.

Архитектура игры

Для игры потребуются следующие сущности.
Server — класс, хранящий список игроков онлайн и занимающийся обработкой их подключения.
Player — представляет собой игрока. Игрок имеет следующие атрибуты: имя (оно же логин) и количество очков. Может участвовать в битве.
Battle — представляет собой битву. В этом объекте происходит ожидание ответов игроков и определение победителя. Хранит в себе ссылки на двух игроков.
Weapon — простое перечисление видов оружия: непосредственно камень, ножницы и бумага.

Статья в тему:  Как поменять ник в доте но не в стиме

Если изобразить в виде диаграммы классов, получается вот что:

Все игровые сущности (кроме Weapon) во время работы сервера хранятся во внутренней базе данных, обеспечивающей транзакционность, ссылаются друг на друга, поэтому они должны реализовывать интерфейсы java.io.Serializable и com.sun.sgs.app.ManagedObject.

Класс Server. Инициализация и подключение игрока

Класс Server является точкой запуска сервера, поэтому должен реализовывать интерфейс com.sun.sgs.app.AppListener:

void initialize(Properties props) вызывается при первом запуске сервера. Он заполняет внутреннюю базу данных необходимыми для работы начальными значениями. Важная особенность: если сервер остановить (или убить), а потом снова запустить, этот метод вызываться не будет, т.к. внутренняя база данных хранится между запусками сервера и позволяет продолжить работу с момента остановки.

ClientSessionListener loggedIn(ClientSession session) вызывается после успешной аутентификации и должен вернуть объект, олицетворяющий игрока. В нашем примере это будет Player.

Все игроки, подключенные к серверу, будут хранится в специальной коллекции. В Reddwarf для игровых сущностей существует специальная коллекция ScalableHashMap. Достоинства этой коллекции в том, что при изменениях она блокируется (имеется в виду блокировка во внутренней БД) не целиком, а частично. Причем в объекте Server хранить будем не саму коллекцию, а ссылку на нее (ManagedReference).

Переходя от слов к делу, получаем следующий код:

Для работы с базой данных используется DataManager, который позволяет писать в БД, читать из БД и создавать ссылки ManagedReference. Поскольку база данных представляет собой key-value хранилище, то в качестве ключа используется имя игрока с префиксом «player.», в значение же сериализуется объект Player целиком. Напишем функцию загрузки игрока из базы (если игрок не найден в базе, создадим его).

Статья в тему:  Как создать новый аккаунт в world of warships
Класс Player и протокол

Пришла очередь создать класс Player. Этот класс олицетворяет игрока и получает от платформы уведомления о пришедших сообщениях. А значит, самое время поговорить о протоколе. Reddwarf дает возможность работать с входящими и исходящими сообщениями как с массивом байт, оставляя реализацию протокола на усмотрение разработчика игры. Для игры «Камень-ножницы-бумага» будем использовать простой текстовый протокол.

(сервер –> клиент) SCORE — сервер сообщает игроку количество очков
(клиент –> сервер) PLAY — запрос игрока на начало игры
(сервер –> клиент) BATLE — началась битва с указанным игроком
(сервер –> клиент) ERROR — игрок для битвы не найден (никого на сервере нет или все в битве)
(клиент –> сервер) ROCK — игрок говорит «Камень»
(клиент –> сервер) SCISSORS — игрок говорит «Ножницы»
(клиент –> сервер) PAPER — игрок говорит «Бумага»
(сервер –> клиент) DRAW — ничья
(сервер –> клиент) WON — игрок победил
(сервер –> клиент) LOST — игрок проиграл

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

Кодировать текст в байты и обратно можно с помощью данного кода:

Теперь переходим к написанию объекта игрока.
Игрок будет хранить у себя следующие поля:

  • имя
  • количество очков
  • ссылка на сервер (чтобы иметь доступ к списку онлайн-игроков)
  • ссылка на сессия (чтобы отправлять сообщения на клиент)
  • ссылка на битва (если игрок сейчас в битве, иначе null)
Статья в тему:  Как включить скрипты в доте 2
Классы Weapon и Battle

Перечисление Weapon очень простое и комментариев не требует.

Переходим к битве.

Битва имеет уникальный идентификатор, содержит ссылки на двух игроков, данные ими ответы, а также флаг активности.

Как только битва создана, запускается отдельная задача, которая завершит битву через 5 секунд.
По прошествии этого времени подводятся итоги битвы. Если ответ дал только один из игроков, то он считается победителем, если оба — победитель определяется по обычным правилам «Камень-ножницы-бумага».

Задача ставится на исполнение с помощью сервиса TaskManager, который можно получить с помощью AppContext.getTaskManager(). Этот менеджер позволяет запускать задачи, выполняемые в отдельной транзакции либо сразу, либо через заданный промежуток времени, либо периодически. Как и следует ожидать, все задачи также хранятся во внутренней БД, а значит, будут выполняться и после перезапуска сервера.

Итак, код класса Battle.

При чтении данного кода может возникнуть вопрос: «Почему внутренний класс BattleTimeout сделан статическим и хранит в себе ссылку на battle в явном виде? Можно же объявить его нестатическим и обращаться к полям Battle напрямую».
Дело в том, что нестатический внутренний класс будет хранить ссылку на родительский Battle в неявном виде и обращаться к Battle через нее. Но особенности платформы Reddwarf (транзакционность) запрещают обращаться к ManagedObject (которым является Battle) из другой транзакции напрямую: в таком случае будет выброшено исключение, т.к. прямая ссылка на объект в другой транзакции некорректна. Именно с этим связана рекомендация создателей платформы использовать только статические внутренние классы.

Статья в тему:  Что такое инта в доте

Отдельно хочется отметить получение managed-объекта по ссылке.
В вышеприведенном коде для ManagedReference используются как метод get(), так и getForUpdate().
В принципе, можно использовать только get(). Использование getForUpdate() позволяет серверу ещё до завершения транзакции знать, какие объекты будут изменены и в случае обнаружения конфликтующих транзакций отменить задачу чуть раньше. Это дает некоторый выигрыш в скорости по сравнению с использованием get().

Наконец наш сервер почти готов.
Добавим немного логирования (для простоты используем java.util.logging) и можно собирать проект.
В результате сборки мы должны получить jar-файл, допустим, deploy.jar.
Если вы не хотите собирать это всё вручную, готовый файл deploy.jar можно взять отсюда.
Этот файл необходимо поместить в sgs-server-dist-0.10.2dist.
Теперь, находясь в директории sgs-server-dist-0.10.2 выполняем следующую команду:

В результате чего в консоли можно увидеть следующее:

Многопользовательская браузерная игра [Java]

Я разрабатываю небольшую карточную игру, которая называется “Тарниб”. Сама игра похожа на карточную игру в бридж, но с другими правилами. Так или иначе, я закончил всю игру как отдельное настольное приложение, используя Java 6. ЭтоКартинка игры. В любом случае, теперь мне нужно преобразовать это в веб-приложение с многопользовательскими возможностями, чтобы пользователи могли, например, создать новую комнату и присоединиться к существующим комнатам, где играется. К сожалению, я не имею ни малейшего представления о сети в Java но я искал довольно много, и я нашел некоторые другие продукты Java, которые могут помочь мне (JavaFX, JSP, GlassFish), но я все еще не мог понять, что именно мне нужно для выполнения моей задачи. Все, что мне сейчас нужно, – это направление, в котором я буду двигаться, и я буду делать свои исследования и, надеюсь, узнаю новые навыки, необходимые.

Статья в тему:  Как взломать онлайн игру на пк

7 ответов:

Другие ответы уже указали вам на некоторые ресурсы.

Но самая большая проблема, с которой вы, вероятно, столкнетесь, заключается в том, что обычно невозможно (или чрезвычайно трудоемко до полной перезаписи) “добавить” многопользовательские возможности впоследствии, если вы не спланировали архитектуру соответствующим образом.

Поскольку у вас может быть много взаимодействия и много обновлений, которые я должен – поправьте меня, если я ошибаюсь – быть на клиенте как можно быстрее, я бы предложил взглянуть на Cometd, который держит соединение http открытым для каждого клиента и отправляет обновления с сервера клиенту. Если вы используете jetty в качестве веб-сервера (и, следовательно, его “продолжения”), он даже сильно масштабируется.

Дело в том, что нет ни одного стандартного способа сделать это, о котором вам нужно прочитать.

Как вы хотите реализовать это веб-приложение? Как апплет? Использование стандартных веб-страниц? Как веб-приложение запуска, которое люди должны загрузить?

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

Но в остальном, как указывал С. Лотт, прежде чем делать что-либо еще, вам нужно пойти и научиться создавать веб-приложения. Эти учебники были бы хорошим началом, также вы определенно должны изучить (X)HTML, JavaScript и веб-технологию Java, такую как JSP, JSF или Struts. Именно то, что вам нужно, будет зависеть от ваших требований, без дополнительных деталей трудно рекомендовать один.

Статья в тему:  Как уменьшить пинг в онлайн играх на андроид

Во-первых, узнайте, что такое “веб-сайт” и “веб-приложение”.

Как только вы закончите все учебные пособия, вы создадите веб-приложение.

После того, как вы создали учебное веб-приложение, вы можете создать свое веб-приложение.

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

Есть ли возможность запуска игры в виде Java-апплета? Это значительно упростило бы вашу работу (позволило бы гораздо чаще использовать ее повторно) и сделало бы конечный результат более удобным.

Невозможно быстро перенести клиентское приложение в веб-приложение. В зависимости от того, как вы хотите это сделать, похоже, что вам нужно либо использовать решение JSP/Javascript, либо решение JavaFX. JavaFX на самом деле позволяет более плавное (более плавное, чем JSP/Javascript, но все равно займет больше, чем день =D ) портирование клиентских приложений, но у него более крутая кривая обучения, чем у технологии JSP/Javascript в целом. Интересно отметить, что JavaFX-это не просто веб-приложение. язык. Если бы вы закодировали свое первоначальное клиентское приложение в JavaFX, вы бы выполнили около 50% работы.

Используйте Java NIO, это довольно просто, и если вы поймете основы, не будет никакой реальной необходимости во всех этих бесчисленных библиотеках. или, во всяком случае, вы бы знали их внутренние органы. Одна из важных вещей, однако, уже упоминавшаяся здесь, заключается в том, что структура игры должна быть адаптирована для сетевого взаимодействия с самого начала. В худшем случае это может быть полная перепись. В основном, вам нужно будет создать клиентскую базу данных, сокетные соединения, а со стороны сервера-каждое соединение (представленное SelectorKey object), должен быть инкапсулирован в объект, представляющий собой “присоединенный клиент”. Затем операции чтения / записи будут выполняться в сокет ключа. Но это еще не все. Сервер должен быть центром вашего приложения link, так что вам придется разработать целый сетевой протокол сообщений для вашей игры (через TCP, нет необходимости в UDP в этом виде игры). Также-читайте больше о протоколах (TCP / UDP / sockets, ethernet), чем больше вы читаете – тем лучше.

Тоже! Обратите внимание на HTML5 websockets материал. Это великая вещь.

Статья в тему:  Что такое инта в доте
голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: