Браузерная онлайн игра средствами jQuery, CoffeeScript, SVG и node.JS

в 16:43, , рубрики: coffee script, javascript, jquery, node.js, игра, Песочница, метки: , , ,

image
Давно хотел написать свою небольшую игрушку. И вот, изучив подходящие технологии, создал «шедевр».

На игру меня вдохновили coffee script и node.JS. Очень захотелось создать что-нибудь, во что могли бы играть двое. Начнем с клиента. Для компиляции coffee в java script я использовал innotify.

Вот такой bash скриптик получился:

coffee --compile --output ../js/ js/
while inotifywait -q -r -e modify .; do
    coffee --compile --output ../js/ js/
done

Он слушает все coffee файлы в папке js текущего каталога и, при их изменении, сохраняет скомпилированный файл в папку js каталога на уровень выше.

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

Вот простой пример клиента на coffee (jQuery подключен):

class @Hello
	constructor: ->
		window.WebSocket = window.WebSocket || window.MozWebSocket;
		if !window.WebSocket
			alert(['Браузер не поддерживает WebSocket'])
			return false
		# пробуем подключиться к серверу
		@connection = new WebSocket('ws://localhost:1337')
		@connection.onopen = @onopen
		@connection.onmessage = @message
	
	# метод, который срабатывает при успешном подключении к node серверу
	onopen: =>
		# при успешном подключении шлем на сервер сообщение с приветом
		@connection.send(JSON.stringify(
			'index':'test_message'
			'text':'Привет'
		))	
	
	# метод, который принимает сообщения с сервера
	message:(message) =>
		# алертуем полученное сообщение
		alert(message.data)

# добавляем наш класс игры как метод "hello" в jQuery
$.fn['hello'] = () => 
	object = new @Hello()
	return $(@).data('hello', object)

Создан класс «Hello», метод «constructor» которого пробует подключиться к node серверу.

При успешном подключении срабатывает метод «onopen», который сразу посылает на сервер тестовое сообщение в JSON формате.

И финальный этап: если сервер удачно обработал сообщение и прислал ответ, то срабатывает метод «message», который делает alert полученному сообщению.

Вот сервер, который отвечает требованиям моего небольшого примера:

process.title = 'node-test';

var webSocketServer = require('websocket').server;
var http = require('http');
var fs = require('fs');
var sys = require('sys');

var server = http.createServer(function(request, response) {});
server.listen(1337, function() {console.log('Web server runing...');});
var wsServer = new webSocketServer({httpServer: server});

wsServer.on('request', function(request) {
    var connection = request.accept(null, request.origin); 
    connection.on('message', function(message) {
	var json = JSON.parse(message.utf8Data);
	switch (json.index) {
	    case 'test_message':
		connection.sendUTF('Ну привет!');
		break;
	}	
    });
});

Тут объяснять особо нечего. Подключаем нужные модули, создаем сервер, на «connection.on» вешаем функцию, которая обрабатывает полученные с клиента сообщения. Если переменная «index» из объекта сообщения равна «test_message'»(именно то что мы шлем с клиента), то отвечаем клиенту «Ну привет!». Список connections нужно сохранить в массив.

Вот и весь механизм, на котором построены взаимоотношения моей игры с node сервером. Теперь ближе к игре. Я решил воспроизвести легендарную «Battle City». Получилась достаточно неплохая вещь (хоть и немного сыроватая в плане дизайна). Рабочую локальную версию можно посмотреть у меня на сайте. А тут (опять же у меня на сайте) можно скачать архивы с локальной и web версиями.

Для реализации интерфейса игры я активно использовал jQ темплейты. Само поле боя прорисовывается с помощью SVG.

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

Все поле боя поделено на клеточки (20 на 20). В одной клеточке может быть только один объект (снаряды не в счет).

Карты уровней хранятся в файлах в JSON формате и загружаются node сервером по запросу клиента. Для их изменения есть админка.

Начало игры происходит следующим образом:
1) Форма ввода ника (есть проверка на чистую латиницу). Ник проверяется на уникальность на сервере
2) Форма создания/выбора игры. Тут можно создать новую или выбрать уже созданную, не начатую игру. Название игры также проверяется на уникальность на сервере и служит уникальным идентификатором игры.
3) Форма подготовки к началу игры. Тут можно либо сразу начать игру, либо подождать подключения второго игрока.
4) Прорисовка поля боя и таблиц данных о состоянии игроков и игры

Вот и все, если коротко. Для более подробного ознакомления качайте готовые версии и смотрите. Скриншот поля боя игры:

image

Всем спасибо за внимание.

Автор: immirik

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js