![image](https://habrastorage.org/getpro/habr/post_images/296/3e6/0c6/2963e60c6d1e1b17e4f09cd6260ada7b.png)
С момента запуска nesbox.com прошло уже более полутора лет, все это время меня не покидала идея сделать игру для двоих через интернет. Если интересно, как мы пришли к рабочему варианту, добро пожаловать под кат.
Начну с того, как работает наш эмулятор. Для комфортной игры он должен отрабатывать ~50-60 кадров в секунду. На каждый кадр мы передаем состояние обоих джойстиков, в виде 2 байт, в котором установленный бит отвечает за одну из кнопок джойстика, а на выходе получаем заполненный экранный буфер 256x240, и звуковой ряд размером 44100/60~=735 семплов.
![image](https://habrastorage.org/getpro/habr/post_images/499/a57/f10/499a57f10c1f60ce7b0d2b2d46f57663.png)
Как видно, интерфейс простейший, но чтобы заставить все это работать по сети, мы должны отправить состояние джойстика первого игрока второму игроку, получить его состояние джойстика, и после этого запустить генерацию кадра экрана со звуком. И это должно происходить 50-60 раз в секунду.
Первым прототипом была схема с примитивным С++ сервером, который получал через Flash Sockets данные о джойстиках, и пересылал их обоим клиентам. Прототип был вполне рабочим, но играть по сети могли пользователи которые находились вблизи сервера nesbox.com (ping ~ 60ms). Были мысли выложить его в open source, чтобы люди сами его собирали и запускали на своих серверах в непосредственной близости. Но тут Adobe выпускает RTMFP протокол и технологию Cirrus, которая решает все наши проблемы, и теперь мы можем подключить оба эмулятора через P2P, и пропадает проблема с пингом. По крайней мере, люди в пределах одного города могут комфортно играть вдвоём.
![image](https://habrastorage.org/getpro/habr/post_images/563/7ed/e76/5637ede765d8ffa438dca0401223af73.png)
Начать работу с Flash P2P элементарно, весь процесс уже описывался на хабре: Adobe Flash Player и передача потоковых данных без участия сервера, повторяться не будем. Общий смысл такой, мы подключаемся к Cirrus серверу, получаем 256-битный id, отсылаем их друг другу. Все, теперь можно слать данные peer-to-peer, что и реализовано в нашем эмуляторе.
Чтобы опробовать данную технологию и поиграть вдвоем в интренете предлагаю выбрать один из 16000 ромов на сайте nesbox.com и запустить эмуляцию. Далеко не все ромы рабочие, поэтому выбирайте зеленые с тегом verified.
![image](http://i28.fastpic.ru/big/2011/1202/77/d281d4de883ec0464cc470c3cf172b77.png)
Выбираем two players via internet.
![image](http://i31.fastpic.ru/big/2011/1202/ed/9146aad15ef9504a54f60600817c7aed.png)
Копируем полученный урл в буфер обмена и отсылаем второму игроку. Если все в порядке с конфигурациями ваших сетей, игра начнется через несколько секунд, если нет, соединение можно протестировать тут http://cc.rtmfp.net.
Моя мечта сбылась (и не только моя, очень много людей просили об этом), теперь можно играть в браузере в игрушки денди по сети с другом!
Ниже приведу несколько ссылок на популярные игры для двух игроков. На все ваши вопросы и пожелания отвечу в комментариях.
Battle City
![image](http://i30.fastpic.ru/big/2011/1202/a6/31a43136dfebf068afb1c727e8fbc0a6.jpg)
Battletoads & Double Dragon — The Ultimate Team
![image](http://i31.fastpic.ru/big/2011/1202/08/4dffd235c2414abbc212b8d59b2c2508.jpg)
Contra
![image](http://i27.fastpic.ru/big/2011/1202/4f/07cd17ce58d6e1856f9938b15b63a14f.png)
Chip 'n Dale Rescue Rangers
![image](https://habrastorage.org/getpro/habr/post_images/e6e/f75/a64/e6ef75a64477812c0a7a9b0187fc7840.jpg)