Gamedev DarkPro1337
3 588

GameMaker: советы для новичков

Рекомендации, которые покажут, как надо или не надо делать.

В закладки

Попробуйте прочитать документацию

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

Документация GMS1

Документация GMS2

Не копируйте код, если вы его не понимаете

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

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

Различные значения для различных экземпляров

Предположим, вам нужно сделать пару врагов: первый с 4 HP и второй с 10 HP. Как новичок, вы подумаете, что нужно создать ещё один объект и изменять HP внутри него. Но этот вопрос можно решить проще.

Когда вы размещаете экземпляр внутри комнаты через редактор комнат, вы можете открыть окно «Код создания» (в GMS2 нужно кликнуть дважды) и писать код в нём. Таким образом вы можете задавать HP экземпляров внутри их кода создания.

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

Используйте place_meeting()

Функция place_meeting() может использоваться для проверки столкновений между объектами. Лучше использовать эту функцию в условии, чем использовать событие столкновения, так как вы сможете больше контролировать работу столкновений.

Первый и второй аргументы — это X и Y координаты, в которых будет проверятся столкновение. Третий аргумент — это объект, с которым будет проверятся столкновение.

Первый и второй аргументы функции обычно устанавливается X и Y соответственно. Предположим, что игрок находится в комнате, когда выполняется проверка на столкновение. Это полезно, потому что вы можете проверить, будет ли игрок сталкиваться с объектом, проверив его такими аргументами.

Лучший способ получения ввода (input)

Многие новички используют условия для установки переменных ввода. Например

Но есть более простой способ. Вот этот.

Вы знаете что keyboard_check() возвращает true если нажата определённая клавиша, или возвращает false если она не нажата. Но в GameMaker'е true становится — 1, а false — 0, это просто числа. Поэтому их можно использовать в таком уравнении.

Если нажата правая клавиша, то hsp будет равен 1.

Если нажата левая клавиша, то hsp будет равен -1.

И если ни одна клавиша не нажата, то hsp будет равен 0.

Тоже самое можно применить к вертикальному положению.

Событие Draw GUI для элементов HUD

Для отрисовки HUD некоторые люди используют объекты или отрисовывают их через событие Draw — добавляют их относительные позиции в координаты камеры/вьюпорта.

Внутри события Draw GUI вам не требуется добавлять позиции камеры для того, чтобы HUD следовал за ней. Это событие использует координаты окна игры, вместо координат комнаты. Поэтому, если вы рисуете что-то в (0, 0), то это будет рисоваться в верхнем левом углу игрового окна, а не комнаты. Так что, всё что вы рисуете там, остаётся там: на его позицию не влияет камера в игре. Это как ещё один слой над вашей игрой.

Как работают функции создания

В этом совете я обращусь к тому, что создает путаницу среди начинающих разработчиков.

Я говорю о функциях _create. Это функции, которые для создания чего-либо (поверхности, буфферов, структур данных и так далее) и сохраняет результат в переменную.

arg — аргумент

Давайте возьмём список структуры данных, как пример. Эта функция создаёт список и хранит его в переменной, верно?

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

На самом деле, это работает не так. Всякий раз, когда вы создаёте список, он создаёт его внутри памяти. Именно там он и существует. Функция просто возвращает указатель, на список внутри памяти. Таким образом, переменная, которую вы используете как «список», представляет собой просто указатель, который позволяет вам получить доступ к фактическому списку в памяти.

Даже если переменная является локальной — список не существует. Помните, что переменная — это просто указатель. Чтобы уничтожить список, вам надо использовать.

Эта функция удалит список из памяти

Кроме того, когда вы делаете так.

Вы не создаете другой список, называемый «list_2», который совпадает с « list_1». Вы просто копируете значение указателя в эту переменную, поэтому обе переменные указывают на тот же список в памяти.

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

Очистите поверхность, когда вы её создаёте

Когда вы создаете поверхность, она должна быть пустой, ведь так?

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

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

В раздел Gamedev попадают не только редакционные материалы, но и читательские тексты с пометкой «Блог». Вы можете нажать кнопку «Написать» и рассказать о своём опыте разработки. Подробнее о читательском контенте в разделе вы можете почитать тут.

#опыт

Материал дополнен редакцией

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "DarkPro1337", "author_type": "self", "tags": ["\u043e\u043f\u044b\u0442"], "comments": 72, "likes": 50, "favorites": 46, "is_advertisement": false, "subsite_label": "gamedev", "id": 10998, "is_wide": false, "is_ugc": true, "date": "Mon, 02 Oct 2017 00:46:00 +0300" }
{ "id": 10998, "author_id": 5455, "diff_limit": 1000, "urls": {"diff":"\/comments\/10998\/get","add":"\/comments\/10998\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/10998"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954 }

72 комментария 72 комм.

Популярные

По порядку

Написать комментарий...
8

#. Главная заноза GameMaker кроется в терминологии.
Потому что объектами в нем называется то, что в других языках зовется классами или типами, а сами объекты в игровом мире зовутся инстансами.

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

#. Вообще, язык GML - это такой особый велосипед, в котором далеко не все работает так, как от этого ожидаешь. И новички, я по крайней мере, привыкают обходить эти особенности, потому что просто так сидеть ждать нормальной реакции от языка - бессмысленно.
Есть other, но нет this. Нормально? Нормально.
Переменные можно объявлять в любом месте, но нет способа проверить, объявлена уже переменная, или нет. Нормально? Почему нет? This is GML!

#. Функции в GMS называются скриптами, и это тоже может создавать путаницу.
Я долгое время просто вызывал скрипты через script_execute(my_script), и даже не заморачивался с параметрами, настолько неуклюже выглядела эта конструкция.
Но потом оказалось, что их можно дергать просто как my_script(parameters);

Ответить
5

«А когда инстансов станет несколько - начнутся проблемы. Потому что GMS в такой ситуации под капотом перебирает все инстансы, и выполняет с ними указанную операцию.»
Если вы храните id инстансов в переменной, и обращаетесь по нему, нет никаких проблем.
«Есть other, но нет this. Нормально? Нормально»
Есть self, который this
«Переменные можно объявлять в любом месте, но нет способа проверить, объявлена уже переменная, или нет. Нормально? Почему нет? This is GML!»
Зависит от того, как давно вы обновлялись. Если вы с ГМ давно знакомы, то в версии 8, например, эта функция была. Если недавно, то в ГМС2.1 эта функция есть =)

Ответить
0

Звучит только как минусы. Или у GML есть свои плюсы? Вообще, велосипеды всегда не хорошо, как по мне...

Ответить
6

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

Например, поворот спрайта по курсору мыши в Unity:
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.rotation = Quaternion.LookRotation(Vector3.forward, mousePos - transform.position);

Поворот в GML:
image_angle = point_direction(x, y, mouse_x, mouse_y);

Ответить
4

Game Maker божественно простой для своих возможностей. Позволяет сделать абсолютно любую 2D игру.

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

Не так давно появился Game Maker 2, в котором эти проблемы вроде как полностью пофикшены, но мне тяжело на него переходить с первой версии.

Ответить
1

Эти проблемы пофикшены. Переходить надо.

Ответить
1

А можно узнать, почему тяжело переходить? Для меня главным минусом ГМС2 было то, что интерфейс тормозил, но сейчас перестал уже. И многие вещи из ГМС2 мне кажутся более комфортными теперь.

Ответить
0

Просто интерфейс мне показался не-интуитивным, вот и все. Я обязательно на него перейду после того, как закончу свой долгострой (или скорее ленивострой), а пока не хочу тратить силы на портирование проекта с предыдущей версии GM, оно проходит не очень гладко

Ответить
0

Андрей , а у игры есть паблик/твитер?

Ответить
0

А вы с какой целью интересуетесь?

Есть эта, довольно устаревшая страничка. http://gamesjam.org/148/

Еще я на GM делал пару игр под андроид
https://play.google.com/store/apps/details?id=com.A.Petkevich.KillRow&hl=ru
https://play.google.com/store/apps/details?id=com.APetkevich.SilverfangInc&hl=ru

Ответить
0

Ищем своих :)
Ниндзи-головастики, помним)

Ответить
0

Я не знаю, как сейчас, но когда я только начинал, главным плюсом была возможность писать код самому. А всякие там Construct и Clickteam Fusion считали, что я должен до последнего тягать иконки.

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

Ответить
1

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

Вот здесь можно почитать мнение профессионала о GM: http://moacube.com/blog/professional-developers-look-at-gamemaker/

Ответить
3

Мнение 2012 года. С того момента упомянутые проблемы в основном были исправлены.

Ответить
0

Важное уточнение.

Ответить
1

Кагбе, "объект->экземпляр" ещё дедушка Вирт использовал. Один из популяризаторов ООП.
А то понапривыкали "класс->объект" и всё. ИМХО, вкусовщина.
Вот с переменными, похоже, действительно засада.

Ответить
0

Да нет. Можно же кодить вокруг этих ограничений.

Я для таких случаев во все объекты кидаю ds_map под названием loose_vars, и вот там уже можно проверить наличие любого ключа с помощью ds_map_exists.
И там, где я не хочу засорять Create, я использую loose_vars.

Ответить
1

«засорять Create» — а чем, собственно, вы его «засорять» не хотите?

Ответить
0

Инициализацией переменных.
Я хочу, чтобы все нужные переменные сами появлялись в объекте, как только я засунул нужный мне скрипт в Step. Я не хочу таскаться в Create каждый раз, когда я что-то вынул/заменил/добавил.

Ответить
1

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

Ответить
3

Не копируйте код, если вы его не понимаете

хех...

Ответить
2

Действительно, как будто что-то плохое.

Ответить
0

...потому что это прерогатива разработчиков на C++.

Ответить
0

Ну, я с этого ещё на action script'e, хосспаде помилуй, начинал

Ответить
0

#9. Если вы выложите что-либо на Game Maker маркет, вам скорее всего нихрена не заплатят, потому что платежи ниже $100 YoYo оставляет себе.

Ответить
5

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

Ответить
1

На накопление у вас есть 3 месяца. Как только вы заработали 100+$, вам в срочном порядке перекидывают деньги на PayPal.
https://help.yoyogames.com/hc/en-us/articles/217380797-Publisher-When-will-I-get-my-money-

Ответить
0

То то я смотрю, у меня Final Payment в квитанциях не растет нифига.
Хорошо, платежи ниже $130 за период в три месяца YoYo оставляет себе.

Хрен редьки, как бы.

Ответить
5

Объясняю: он их не оставляет себе, деньги — ваши. Просто их переводят трашнами от $100+. Если вы в указанный период (в конце каждого месяца) не накопили $100+ (за три прошедших месяца), вам их переведут, когда накопите. Например, в следующий период.

Ответить
0

Вы меня почти убедили. Попробую.

Ответить
2

У меня нулевое знание программирования. Да и желания учить его особо нет. Поэтому для первого простого проекта я искал движок, в котором оно не нужно. Узнал, что в GameMaker2 есть система Drag'n'Drop. Скачал программу, ну, думаю, отлично. Но не тут то было) Туториалов по этой системе - раз, два и обчёлся. Даже на сайте разработчика ничего особо нет об этой системе. Покопался в движке, попробовал методом научного тыка - не заработало. Тогда я начал искать другой движок. И наткнулся на Construct 2 (https://www.scirra.com/). Оказалось, он интуитивно простой. Туториалов по нему навалом, плюс, форум довольно живой (т.е. можно задать там интересующие вас вопросы и вам ответят местные энтузиасты или сами разработчики). Потестил бесплатную версию, а потом приобрёл и полную лицензию (можно купить через стим http://store.steampowered.com/app/227240/Construct_2/). Вот уже с июля сижу, пилю платформер в C2. Если вы хотите сделать относительно простой 2D проект, но по какой-то причине не хотите учить языки программирования - советую попробовать Construct 2.

Ответить
1

В GM дохрена встроенных туториалов по всем темам.

Ответить
2

Когда я проверял, нормальных туториалов для системы drag'n'drop не было. Может, конечно, сейчас добавили. P.S. Я про GM2, если что.

Ответить
4

По-моему, в GMS код проще, чем Drag'n'Drop =)

Ответить
1

Дмитрий, поищите туториалы по DnD в GMS, GMS2 только интерфейсно отличается, а также наличием большего числа блоков DnD. Принципы и функции все те же.

Ответить
0

товарищ уже в C2 ) доктор, мы его потеряли

Ответить
0

Искал же) Просто так не стал бы писать. Почти все годные туториалы с использованием GML. Про DnD систему количество материала крайне скудное. По крайней мере так было в июне-июле этого года.

Ответить
1

Ну да, вы правы, туторы в основном не про drag&drop

Ответить
1

Ура, наконец-то на любимом игровом сайте статья про любимый игровой движок (конструктор?) юности :) Сейчас пойдут вопросы: что лучше, GM или Unity? Unity или Unreal? GM или Renpy?

Ответить
3

GM лучше юнити для прототипирования.
Unreal лучше юнити для готового результата.
Renpy лучше для визуальных новелл, хотя некоторые умудряются.

Ответить
2

Хотя, если в вашей новелле будут игровые секции, то лучше опять GM, потому что для RenPy в этой ситуации понадобится таки знание питона, а в GM можно накидать графически иконками. Если процесс несложный.

Ответить
0

TyranoBuilder для новелл довольно прост для начинающих. Там простенькие игры, для тренировки, делаются также без контактирования непосредственно с кодом.

Ответить
3

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

Ответить
0

Только если не захочешь на том же RenPy реализовать пошаговые бои ^^

Ответить
0

А Unity для чего лучше?

Ответить
0

Для прототипирования в 3D, кросплатформы, мобилок и небольших проектов, наверное.

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

Ответить
0

Помню когда-то видел завлекаловки в духе "Unity - создай игру без программирования", но сейчас по факту выходит, что нужно шарить в шарпе или js, плюс изучить Shaderlab и Cg для шейдеров (если недостаточно стандартных).

Еще слышал, что Unity ужасен в сетевом коде. Как пример - Albion Online, где лагает по-черному в PvP-замесах. В то же время, знающие программисты утверждают, что лаги Albion Online - заслуга разработчиков, и в Unity можно организовать адекватный сетевой код с шустрой сериализацией.

Ответить
0

Думаю что создатели Escape from Tarkov и Калибр с вами не согласятся

Ответить
0

Не я это утверждаю, поэтому не со мной нужно соглашаться/не соглашаться.)
У создателей этих игр были проблемы с сетью?

Ответить
0

У первых были и есть. Причем они вида - не плохо/хорошо что-то работает, а работает порой совсем не понятно как и подобных багов в других игра я не видел ни разу. Ну и они сами говорили уже что выбор Юнити был ошибкой.
А для вторых по слухам сами разрабы юнити будут писать сетевую часть под заказ. Что скорее всего, говорит о том что юнити из коробки такие задачи решить не может.
По мне так вообще, если у тебя шутер и к тому же сетевой, то выбора кроме unreal на сегодня попросту нет. Если только там юридические/финансовые моменты решают

Ответить
0

Было бы интересно почитать на эти темы статьи на DTF. У меня были мысли сделать простенький сетевой шутер на Unity. Хотелось бы узнать конкретные проблемы, которые могут возникнуть.

Ответить
0

На ютюбе полно видео где делают на блупринтах сетевой шутер, от и до )

Ответить
0

Мне больше нравится писать код.)

Ответить
0

Почему Unreal плох для прототипирования? Если там есть блупринты и для прототипа программисты впринципе не нужны даже. Некоторым и для готовый игры хватило блупринтов

Ответить
0

Эээ. Не знаю.

У Unreal репутация движка для которого нужна серьезная экспертиза, я по ней и сужу.

А так то и для Unity есть специальная примочка, которая превращает ее в почти что гейм мейкер. Дорогая только, зараза.

Ответить
0

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

Ответить
0

Скорее всего из-за того, что Unreal использует плюсы. Язык, книгой по которому можно без особых усилий проломить кому-нибудь голову.

Ответить
0

Некоторые проекты, включая мобильные, люди делали вообще без плюсов. Если нет сетевой части и сложных операций, то почти все или даже все можно сделать нодами blueprint.

Ответить
0

Цены на движок просто конские. Когда-то рассматривал GM для создание игры, но остановился на Cocos2D-x.

Ответить
1

YoYo Games часто устраивает распродажи. Например, GMS с тремя экспортными модулями (Web, Mobile, PC) и кучей сорцом я брал на хамбле за $15. ГМС2 покупал на Стиме с 40% скидкой за 3 тыс рублей. Смотрите цены на Стиме, там часто распродажи.

Ответить
0

Я ищу альтернативу GM сейчас, и пока что посматриваю в сторону Godot.

Ответить
0

Для 2d игр подходит очень хорошо, но пока что надо уметь писать скрипты

Ответить
0

Что насчет сериализации? Возможна ли реализация Protocol Buffers?

Ответить
1

Возможно, конечно. Но я не думаю, что он встроен в GMS.

Ответить
0

Если вы используете первую версию Game Maker Studio, то быстро заметите, что цветовая схема в ней весьма вырвиглазная. А белый фон нравится не всем.

В этом случае можно попробовать вот такой скин:
https://jaylanart.deviantart.com/art/JayLan-GMSkin-psDark-364524240

Ответить
0

Я всегда юзаю HTML 5

Ответить
0

Ух, не мое. Либо psDark, либо, если нету, GM8.

Ответить
0

Я купил себе Game Maker, но никогда его не юзал: RPG Maker MV победил :) Причем в основном благодаря шикарным ассетам, а также HTML 5 (хоть я его и знаю плохо).

Ответить
0

Помню, работал с RPG Maker VX Ace. Намучался там с параллельными событиями для создания сложных кат-сцен, это сводило с ума :D

Ответить
0

Там не было HTML, только Ruby вроде. Меня и самого эти события достают :)

Ответить
0

Да, там был Ruby, но с ним особо проблем не возникло.

Ответить
0

А если рассматривать GM и Unity для создания простой 2D игры (или в изометрии) с элементами RPG (прокачка, задания с разными ветками прохождения и влияния выбора на дальнейший сюжет), то что приоритетнее?

Лет 5-6 назад собирал простейшие аркады на GM, Unity привлекает своим коммьюнити сейчас.

С программированием туговато, писал только квесты на RenPy (т.е. изучал базу Питона для сложных логик). JS не пошёл (точнее не уделял ему время).

Чтобы не упираться в потолок готовых ассетов из Unity нужно начинать изучать C#. На GM язык, по моему, чуть проще, но не скажется ли это в будущем на масштабировании игры?

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Узнавайте новости о мостах
Санкт-Петербурга первыми
Подписаться на push-уведомления