Web 3d игры

Описание: Наиболее перспективное направление развития компьютерных наук. Надо быть в теме!

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#1 dyvniy » Пн, 16 ноября 2015, 11:27:03

веб версия легендарного квэйка
лагает ((
https://code.google.com/p/quake2-gwt-port/
http://quake2playn.appspot.com/

Надо посмотреть, как они курсор мыши захватывают.
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#2 dyvniy » Пн, 16 ноября 2015, 11:54:05

Как сделать 3D шутер на JavaScript за пару дней
http://habrahabr.ru/post/164003/
Спойлер
В субботу у меня ближе к полуночи появилось свободное время и жгучее желание сделать игрушку под браузер, забавы ради и увеличения опыта для. С жанром определился довольно быстро: т.к. на MMORPG в этот раз у меня точно не хватило бы времени, я решил делать просто мясорубку. Минут 20 ушло на написание базового кода для управления игроком и его противниками. И тут встал вопрос — 2D или 3D (вернее так: Canvas/SVG или все же полноценный WebGL)?

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

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

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

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

Собственно, в качестве результата в ночь на воскресенье я имел следующую картинку:

image

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

Первым делом, после того как я вошел в офис, я попросил нашего моделлера сделать мне для антуража модель сухого дерева, а сам подобрал на просторах сети модельку пушки. Модель противника я взял из примеров к библиотеке Three.js.
Народ в офисе периодически подходил посмотреть чем я занят. Все мило улыбались и ждали ссылку.

Буквально за несколько минут было придумано название (его смысл раскроется попозже), а затем я попросил нарисовать заставку, кнопки, иконки фрагов и здоровья, это с удовольствием сделал наш дизайнер.

image

Потом я подумал, что на дворе зима и без снега будет неуютно. Сказано – сделано, за 10 минут был прикручен снег на основе системы частиц.

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

Возвращаясь к описанию механики сцены я напомню, что нам всегда известны углы направления пушки и углы противников. Зная это, мы легко можем определить, попадает пуля в противника или нет, и в очередной раз замечу, что этот подход существенно упростил процесс расчета полета и попадания пули в противника. В итоге наша пушка научилась стрелять, а пуля – попадать в противника.
Осталось научить наших противников быть похожими на что-то живое. Я использовал уже анимированные модели, что само по себе позволило очень быстро наладить простейший механизм смены анимации и состояния противника: он бежит, падает, встает и идет нахмурившись, а под конец и вовсе умирает.
Кстати, достигнув определенного расстояния до игрока, противник переходит в режим атаки и, собственно, пытается забрать жизнь у игрока.

image

Чуть позже были добавлены обработчики клавиатуры для установки паузы и перехода в полноэкранный режим, а затем и собственно обертка для функционирования игрового процесса. Наверное, все это добавило немного каши в код, но время близилось к намеченному на 8 часов вечера корпоративу, и уже было несколько не до того :)

В конце концов все это дело перекочевало на сервер, и все, кто хотел – получили свою ссылку.

После анализа первых фидбеков были внесены небольшие правки, добавились боссы, противники стали умирать не сразу, а пули стали наносить плавающий урон.

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

Все исходники проекта открыты для исследования. Я не добавлял комментарии, но старался писать код структурированным и понятным для изучения.

PS И да, я не претендую на образцовое решение и идеальные варианты реализации, это just for fun который работает в Google Chrome, Safari и Mozilla Firefox.
javascript, three.js, webgl, 3d, разработка игр
+94

71,2к

408


Сергей @tsmar карма4,3 рейтинг0,0

Похожие публикации
+18
Почему я потратил четыре года на разработку игры своей мечты 43,5к 158 54
+21
Использование AI и утилит при разработке игр жанра Tower Defense 21,5к 188 2
+15
Принципы минимализма при разработке игр для мобильных платформ 19,3к 166 21
Самое читаемое
Сейчас Неделя Месяц
Сборка 4-мерного кубика Рубика 5
Дайджест интересных материалов из мира веб-разработки и IT за последнюю неделю №185 (8 — 15 ноября 2015) 2
Викторина из 15 вопросов: хорошо ли вы знаете CSS 8
Неправильно использованные шаблоны мобильного интерфейса 16
Let's encrypt: старт публичной беты с 3 декабря 28
Маленькая ОС с нуля на C++ и ассемблере 4
Samba и запрещенные символы 20
Лучшие доклады конференции DotNext 2015 Piter: Часть 2 (Видео внутри) 0
Взгляд IT-специалиста на SAP ERP 157
«МойОфис»: Первые шаги 47
Вопросы по теме
Как вытащить данные из функции? 2
Как изменить координаты на картах яндекс или гугл? 0
Где взять примеры для практики javascript? 3
Можно ли запустить расширение Google Chrome с помощью js? 2
Как поправить now и end что бы оставшееся время считалось правильно? 1
Комментарии (65)

+10 Pavel26 декабря 2012 в 13:05#
Нано-шутер :)
+2 silvansky26 декабря 2012 в 13:19#
Что-то не понял, как там ходить?
В FF/OSX не заработало управление совсем, в Chrome стреляю, но ходить не вышло ни стрелками, ни WASD.

А за проделанную работу и открытый код — респект!
0 tsmar26 декабря 2012 в 13:22#↵↑
спасибо!
по поводу «ходить» — я специально написал, что выбрал простой вариант — пушка закреплена в центре координат
0 silvansky26 декабря 2012 в 13:23#↵↑
Хм, я видимо этот фрагмент пропустил при чтении =)
+8 Pavel26 декабря 2012 в 13:22#↵↑
я так понял, что ходить там вообще нельзя. Мне, как лентяю, это нравится. Пожалуй, первый шутер, в котором не надо никуда идти…
+7 Newbilius26 декабря 2012 в 13:23#↵↑
Тогда это не шутер, а тир…
+2 ComodoHacker26 декабря 2012 в 17:17#↵↑
Tower defense от первого лица.
+1 mapron26 декабря 2012 в 21:59#↵↑
Ждем косынку от первого лица в жанре «Симулятор».
0 BloodJohn27 декабря 2012 в 09:36#↵↑
Вообще-то survive,
TD подразумевает строительство башен, которые стреляют за тебя.
+10 mwizard26 декабря 2012 в 13:22 (комментарий был изменён)#
НЛО прилетело и оставило эту надпись здесь.
+4 mwizard26 декабря 2012 в 17:47#↵↑
Епрст, друзья, я написал дублирующий комментарий и удалил его, какого черта это минусовать? Это не попытка пошутить не в тему, если что! НЛО не имеет отношения к данной игре!
+5 MikeLP26 декабря 2012 в 13:23#
Все исходники проекта открыты для исследования. Я не добавлял комментарии, но старался писать код структурированным и понятным для изучения.

Github?
–4 tsmar26 декабря 2012 в 13:29#↵↑
как-то не хочу захламлять своими поделками github
+8 MikeLP26 декабря 2012 в 13:35#↵↑
Ничего себе «поделка»… зря вы так! Некоторые о таком даже и не мечтают… (не буду показывать пальцем). В общем интересная хорошая работа. Спасибо! А гитхаб и так захламлен всякими свисто-перделками на html. Терять вам нечего.
+1 Newbilius26 декабря 2012 в 13:44#↵↑
Это нечто бОльшее, чем просто поделка. Выкладывайте, не стесняйтесь. Linux тоже начался как «небольшая ОС одного студента»… :)
+7 silvansky26 декабря 2012 в 14:03#↵↑
Гитхаб для того и нужен ;)
0 shebanoff26 декабря 2012 в 17:53#↵↑
Выкладывайте, я уже готов отфоркать сию прелесть.
+2 tsmar27 декабря 2012 в 11:15#↵↑
положил на github
0 bulletproofcupid26 декабря 2012 в 13:24#
Смотрю на скриншоты и подпись «за пару дней», завидую.
Кстати, как ни печально, но под макосью 10.7.5, Safari 6.0.2 — бесконечный «loading...»
+2 tsmar26 декабря 2012 в 13:29#↵↑
в сафари надо включить webgl — discussions.apple.com/thread/3300585?start=0&tstart=0
0 bulletproofcupid26 декабря 2012 в 13:40#↵↑
Спасибо! Начал пользоваться сафари только с новой версии, до этого на хроме сидел.
0 Newbilius26 декабря 2012 в 13:45 (комментарий был изменён)#↵↑
У разработчика была маленькая форма — опыт работы c библиотекой :) Блин, надо юнити покопать наконец…
0 Newbilius26 декабря 2012 в 13:26#
Не увидел списка поддерживаемыех браузеров :( Не запустилось ни в Опере, ни в Хроме, ни в FF. Надо вручную включать webgl?
+1 mlnd26 декабря 2012 в 13:28#↵↑
если он отключен, то лучше попробовать все-таки включить :)
0 imbeat26 декабря 2012 в 13:28#↵↑
В последней версии хрома 23.0.1271.97 m работает прекрасно.
+2 tsmar26 декабря 2012 в 13:28#↵↑
в хроме включено по умолчанию, в фф — тоже, но иногда не хочет, так что лучше хром, про оперу могу сказать только одно — не пробуйте
0 Newbilius26 декабря 2012 в 13:31 (комментарий был изменён)#↵↑
В Хроме не видно противников и вообще объектов (стрелаю в пустоту, по мне фигачит пустота), в FF бесконечная загрузка, в Опере аналогично.

shot.qip.ru/00bl6T-2o8tiVHYk/

Версия Версия 23.0.1271.97 m
+1 tsmar26 декабря 2012 в 13:36#↵↑
видимо стелс режим у противника, стреляйте на удачу!
а по существу — не знаю чем вам помочь, посмотрите консоль javascript, может там ошибки какие есть
0 Newbilius26 декабря 2012 в 13:40 (комментарий был изменён)#↵↑
А ить и верно.

THREE.WebGLRenderer 53 three.min.js:385
THREE.WebGLRenderer: Float textures not supported.

Это после загрузки, но до старта. После старта:

WebGL: INVALID_OPERATION: getUniformLocation: program not linked planner5d.com:1
WebGL: INVALID_OPERATION: getAttribLocation: program not linked planner5d.com:1
WebGL: INVALID_OPERATION: useProgram: program not valid

и т.п.

слишком дохлая видеокарта?) (Intel встроенная, G33/G31 Express)
0 tsmar26 декабря 2012 в 13:42#↵↑
видимо да :) повод сделать себе подарок на НГ!
+3 Newbilius26 декабря 2012 в 13:43 (комментарий был изменён)#↵↑
Это рабочий компьютер) На домашнем ноутбуке точно запустится.

P.S. Дожили...))
+2 jazzman26 декабря 2012 в 13:28#
самое то для ленивых праздничных поигрушек. у меня вот запланированы давно закупленные XCOM и Hotline Miami, а также диджей-контроллер Vestax VCI-380. вот между ними и буду стартублить!
+1 shelestov26 декабря 2012 в 13:39#
В 23-м Chrome под Ubuntu не грузится.
В консоли:
Error creating WebGL context.
Uncaught TypeError: Cannot call method 'getExtension' of null.
0 tsmar26 декабря 2012 в 13:41#↵↑
к сожалению ваша система не поддерживает webgl, рекомендую под убунту nvidia карточку (у нас в офисе работает на ура)
0 philpirj30 декабря 2012 в 04:48#↵↑
Chromium под Linux'ом не умеет WebGL. Firefox — на ура.
0 Tonik26 декабря 2012 в 14:06#↵↑
Тоже самое, но 22 Хром под OpenSuse 12.1
0 vkolotov26 декабря 2012 в 14:27#↵↑
Тоже самое в Chromium и FF под Gentoo.
+1 Ierixon26 декабря 2012 в 18:08#↵↑
на встроенной карточке помог запуск со следующими параметрами:
google-chrome --ignore-gpu-blacklist --enable-webgl
0 zzzmmtt26 декабря 2012 в 13:42#
FF 17.0.1
работает.
замечания — босс, в отличие от других мобов умирает сразу, остальные пытаются встать.
и пожелание — добавьте прицел =)
0 tsmar26 декабря 2012 в 13:44#↵↑
да, у босса иное поведение — он типа «танк» — у него с каждым разом все больше и больше хп и он не падает, а идет на пролом — это единственный способ убить умелого игрока
0 zzzmmtt26 декабря 2012 в 14:52#↵↑
но всё равно как-то быстро «боссы» умирают =)
В общем очень даже круто для двух дней!
0 izelenyuk26 декабря 2012 в 13:44#
Реально круто для таких сроков. Только вот меня замочили два бота, которые стояли ко мне спиной за пределами радиуса поворота пушки :)
Но все равно круто, развивайте!
+2 Pavel26 декабря 2012 в 16:38#↵↑
ха, меня убили подлые мелкие чуваки, которые, как я думал, далеко находятся :) а они просто меньше ростом и стояли рядом!
+1 Anonym26 декабря 2012 в 13:48#
Мышка не захватывается?
+1 unclechu26 декабря 2012 в 14:28#
В Firefox запустилось, в Chromium 20 — “loading” и всё, WebGL включен.

Я так понимаю есть проблема с мышью, потому что курсор доходит до края и на этом всё? В браузерном EcmaScript предоставляется доступ к захвату курсора мыши?

Ещё есть вопрос с звуковым сопровождением, в частности я уже на хабре задавался вопросом, но ни к чему оптимальному не пришёл, — что если нужно расположить звук в пространстве? В HTML5 Audio есть даже реализация фильтров, где-то ссылочка была, например если отвернулся, — срезаем верха, отдалился — уменьшаем громкость. А вот как панорамировать звук — неизвестно.

Вот также интересная демонстрация WebGL в виде racing: triggerrally.com/x/Preview/Arbusu/drive
0 tsmar26 декабря 2012 в 21:45#↵↑
По поводу курсора — угол поворота камеры по горизонтали равен 180 градусам и они честно распределены по всей ширине области просмотра, по этому при выходе за края области — ничего не происходит. В браузере нельзя захватить курсор (я даже этому несколько рад).
По поводу звука — что нибудь придумаю, спасибо за ссылки, хотя эту демку я уже видел, но честно говоря не разглядывал ее детально.
0 unclechu27 декабря 2012 в 12:08#↵↑
Кстати насчёт захвата курсора я вспомнил что видео Quake 3, там просто отрисовывается карта и всё, можно побегать-посмотреть, но обзор мышью — полный, значит курсор можно захватить. А то, что нельзя — это бы не позволило сделать полноценный обзор кругом, это плохо, пусть и разрешения пользователя спрашивало, но возможность должна быть.
0 unclechu27 декабря 2012 в 12:20#↵↑
Нашёл: media.tojicode.com/q3bsp/ — при нажатии на Fullscreen — разворачивается на весь экран и захватывает мышь, полный обзор. Так что гипотетически все инструменты для шутера есть.
0 tsmar27 декабря 2012 в 14:28#↵↑
F11 и кнопка F == тот же эффект
0 unclechu27 декабря 2012 в 16:10 (комментарий был изменён)#↵↑
Это вы к чему? F11 только убирает все панели, делает страницу на весь экран, «игра» по прежнему в небольшой области на странице. По нажатию F вообще ничего не происходит. А вот если там справа снизу нажать Fullscreen, — тогда сама область «игры» разворачивается на весь экран и захватывается мышь (фуррифокс спрашивает даже: «разрешить или запретить»). Так что != и тем более !==.
0 unclechu27 декабря 2012 в 12:21#↵↑
Вот ещё кое-какие интересные демо: www.chromeexperiments.com/webgl
0 MaGIc2laNTern27 декабря 2012 в 12:25#↵↑
Ещё была публикация на Хабре с примерами.
0 MaGIc2laNTern27 декабря 2012 в 12:23#↵↑
Курсор мышки можно блокировать (см. также документацию в MDN).

Ну и, конечно, было бы круто добавить поддержку Fullscreen API — тем более, обычно это очень просто.

А вообще автор очень большой молодец. :)
0 muslimov26 декабря 2012 в 16:53 (комментарий был изменён)#
Интересно же почитать, скиньте пож-та на github
+3 tsmar27 декабря 2012 в 11:15#↵↑
положил на github
0 muslimov27 декабря 2012 в 11:17#↵↑
отлично
0 gasizdat26 декабря 2012 в 22:19 (комментарий был изменён)#
Очень здорово! Заработало, правда, только в Хроме.
Опять зачесались руки попробовать это сделать на Canvas (пропали выходные, эх). Если это возможно, не могли бы Вы выложить модели? У меня с моделированием как-то не очень, увы.
+1 tsmar26 декабря 2012 в 22:40#↵↑
модели доступны для всех — planetquake.gamespy.com/View.php?view=Quake2.Detail&id=368
0 Fade27 декабря 2012 в 11:26#
Примитивненько, но для 2 дней очень круто. Я думаю, если нарядить немного монстров в новогодней тематике можно сделать крутую игру-открытку на новый год
0 Dallas27 декабря 2012 в 12:49#
Тема названия startublo не раскрыта)
0 tsmar27 декабря 2012 в 14:31#↵↑
Ха-ха, действительно, вы первый кто это заметил, но я правда пока и не собираюсь ее раскрывать, это будет в следующей версии, т.е. когда у меня появится побольше свободного времени.
0 alexpf28 декабря 2012 в 16:06#
В хроме 23.0.1271.97 m не заработало с index.html
Скопировал в хром ссылку из FF, после того как там поиграл, и загрузилась
0 tsmar31 декабря 2012 в 13:30#
Добавил управление с клавиатуры — стрелки для поворота пушки и пробел для стрельбы
0 NekR 5 января 2013 в 19:58#↵↑
Лучше бы PointerLock добавили для мышки, а то на 360 никак не повернуться (ну стрелки да, можно, но неудобно). Да и fullscreen через FullScreen API можно было бы сделать.
0 tsmar 5 января 2013 в 23:06#↵↑
Как появится время — обязательно

Вот сама игры
https://planner5d.com/startublo/
здесь можно полюбоваться её исходниками) и использовать у себя, наверно
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#3 dyvniy » Пн, 23 ноября 2015, 18:34:40

Chrome 64 бита, чтоб игры в память влазили
статья http://download.my-chrome.ru/
ссылка https://dl.google.com/tag/s/appguid={8A69D345-D56 ... rs/ChromeStandaloneSetup64.exe
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#4 dyvniy » Чт, 27 октября 2016, 08:55:42

web2exe
http://www.top4download.com/free-web2exe/

to cmd
http://www.cyberforum.ru/cmd-bat/thread1240784.html
Спойлер
10.08.2014, 17:14 Упаковка бинарных ресурсов в батник ("CBI method" by Dragokas) [В закладки] [Плавающее окно] #1 (permalink)
Cabinet's Batch inline. "CBI method" by Dragokas

Метод предоставляет возможность встраивать бинарную информацию (любые файлы)
в качестве ресурсов BAT-файла, получая на выходе 1 комбинированный файл
с расширением BAT или CMD.
Батник затем сможет распаковать свой ресурс при необходимости его использования.

В статье представлены описание метода и программная реализация.

Описание метода

Оригинальная идея принадлежит человеку с ником: Somebody.

Она звучала так:
Можно сделать cab архив с расширением bat, а в конце - пустую строку и extrac32 /e %0.
extrac32 в винде вроде всегда есть. Побочный эффект - попытка запуска "MSCF"
(заголовок .cab).
Данный способ не подходит для случаев упаковки бинарных ресурсов различного содержания,
т.к. некоторые комбинации символов для формата CMD являются недоспустимым и
приводят к его "падению" прежде, чем BAT-файл начнет исполнение своей части кода
из конца Cabinet архива.

К счастью структура формат CAB предоставляет возможность резервирования произвольного
количества байт (начиная со смещения 0x28) для хранения цифровой подписи.

Эту область мы задействуем под свой нужны, расположив в ней основной код
и команду распаковки.

Техническая часть

Код батника будет содержать команду для распаковки себя же:
Код
@extrac32.exe /E /Y /L "папка, куда распаковуем" "%~f0"
/e - распаковать все
/y - без подтверждения при замене

Структура формата Cabinet архива описана в статье базы знаний: MSKB417343

Она разделена на 4 блока:
CFHEADER
CFFOLDER
CFFILE
CFDATA

Описание первого блока:

C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Размер | имя параметра | смещене | описание параметра

struct CFHEADER
{
u1 signature[4] // 0x00 - сигнатура архива "MSCF"
u4 reserved1 // 0x04 - зарезервировано
u4 cbCabinet // 0x08 - размер архива в байтах
u4 reserved2 // 0x0С - зарезервировано
u4 coffFiles // 0x10 - смещение первого вхождения блока CFFILE
u4 reserved3 // 0x14 - зарезервировано

u1 versionMinor // 0x18 - версия формата архива (minor)
u1 versionMajor // 0x19 - версия формата архива (major)

u2 cFolders // 0x1A - количество блоков CFFOLDER
u2 cFiles // 0x1C - количество блоков CFFILE
u2 flags /* 0x1E - флаги наличия или отсутствия зарезервированной областей
abReserve[], szCabinetPrev[], szDiskPrev[], szCabinetNext[], szDiskNext[] */
u2 setID // 0x20 - должен быть одинаковый для всех частей составного архива
u2 iCabinet; // 0x22 - порядковий номер этого файла в составном архиве
u2 cbCFHeader; // 0x24 - (опционально) размер зарезервированной под ЭЦП области архива

u1 cbCFFolder; // 0x26 - (опционально) размер зарезервированной области каждой папки
u1 cbCFData; // 0x27 - (опционально) размер зарезервированной области каждого блока данных
u1 abReserve[]; // 0x28 - (опционально) область, зарезервированная под ЭЦП (сюда будем записывать батник)
u1 szCabinetPrev[]; // (опционально) имя предыдущего файла CAB
u1 szDiskPrev[]; // (опционально) имя предыдущего диска
u1 szCabinetNext[]; // (опционально) имя следующего файла CAB
u1 szDiskNext[]; // (опционально) имя следующего диска
};
Чтобы создать скомбинированный файл, сперва нужен сам архив.
Наиболее родной способ - воспользоваться встроенной в систему утилитой makecab.
Синтаксис у нее непростой, поэтому лучше воспользоваться готовой реализацией:

Кликните здесь для просмотра всего текста


Тем не менее, у Microsoft есть и другая утилита из состава Resource Kit
под названием CabArc.

Ввел в YANDEX слово Cabarc и получил "Сфинкс". Круто! M$ отдыхает
Создать архив CAB можно такой простой командой:
Код
cabarc N test.cab *.*
Упакует все файлы в текущей папке в архив test.cab

Чтобы вставить код Batch в такой архив, нам нужно зарезервировать область
соответствующего размера, и здесь Cabarc будет как нельзя кстати.

Описание возможностей Cabarc


Ключ -s позволяет установить произвольный размер зарезервированного под ЭЦП блока
(от 1 до 65535 байт (0xFFFF)).

Теперь смотрим, какой размер у батника, к которому мы хотим добавить ресурс.
Пусть будет 250 байт (0xFA).

Прибавляем 6 байт (ниже узнаете зачем).
250 + 6 = 256 (0x100).

Создаем архив с резервной областью в 256 байт:

Код
cabarc -s 256 N test.cab *.*
Принцип слияния кода батника с архивом такой:

Берем смещение архива 0x28 (блок abReserve[]).
Добавляем туда 2 переноса строки (0x0D, 0x0A, 0x0D, 0x0A) - 4 байта.

Далее вставляем сам код и еще + перенос строки (0x0D, 0x0A) - 2 байта.

4 + 2 = 6 байт, о которых мы говорили выше.

В коде батника должна быть предусмотрена команда распаковки архива из себя
и очистка сообщения о неверной команде (когда батник попытается исполнить хидер CAB-архива):

Код
@cls & @extrac32.exe /E /Y /L .\ "%~f0"
Комбинированный CBI-файл готов.
Нужно переименовать его расширение в CMD.

Правка упакованного батника напрямую

Также можно выделить резервную область путем правки определенных байт CAB-архива:

1. В структуре CFHEADER:

C++Выделить код
1
2
3
4
u4 cbCabinet // 0x08 - размер архива в байтах
u4 coffFiles // 0x10 - смещение первого вхождения блока CFFILE
u2 flags // 0x1E - флаги наличия или отсутствия зарезервированной областей
u2 cbCFHeader; // 0x24 - (опционально) размер зарезервированной под ЭЦП области архива
flags должен содержать константу:
C++Выделить код
1
#define cfhdrRESERVE_PRESENT 0x0004
cbCFHeader - для архива с флагом = 0 (нет резервных областей) имеет смещение 0x2C.

2. В каждой из структур CFFOLDER:

C++Выделить код
1
u4 coffCabStart; // смещение первого вхождения блока CFDATA для этой папки
Программная реализация

В дополнение к статье готовая программа для прикрепления к батнику ресурса из указанных файлов и/или каталогов.
http://www.cyberforum.ru/attachments/425486d1407676431
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#5 dyvniy » Пт, 3 ноября 2017, 17:26:27

Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#6 dyvniy » Вт, 7 ноября 2017, 16:05:35

Джойстик, подниму его на распберри пи 3.
https://yoannmoinet.github.io/nipplejs/
Вложения
Screenshot_4.png
Screenshot_4.png (16.97 КБ) 602 просмотра
yoannmoinet-nipplejs-v0.6.7-2-g0c982ce.zip
(54.66 КБ) 114 скачиваний
Изображение


Название раздела: Web на стороне клиента, Java Script
Описание: Наиболее перспективное направление развития компьютерных наук. Надо быть в теме!

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения
:) ;) :hihi: :P :hah: :haha: :angel: :( :st: :_( :cool: 8-| :beee: :ham: :rrr: :grr: :* :secret: :stupid: :music: Ещё смайлики…
   

Вернуться в «Web на стороне клиента, Java Script»

Кто сейчас на форуме (по активности за 15 минут)

Сейчас этот раздел просматривают: 4 гостя