Допустим, у вас есть уровень с несколькими дверями, и для каждой из них есть ключ. Как можно легко пометить ключ для определенной двери? Обычно вы просто присваиваете идентификатор ключу и двери. А что если вы хотите, чтобы ключ открывал 2 или 3 двери? Легко. Вы используете MASK. Дверь будет иметь один бит, назначенный следующим образом:
+
Допустим, у вас есть уровень с несколькими дверями, и для каждой из них есть ключ. Как можно легко пометить ключ для определенной двери? Обычно вы просто присваиваете идентификатор ключу и двери. А что если вы хотите, чтобы ключ открывал 2 или 3 двери? Легко. Вы используете MASK. Дверь будет иметь один бит, назначенный следующим образом:
Вы создали комментарий к сценарию, используя
- /* [comment] */
+
Вы создали комментарий к сценарию, используя
+ /* [comment] */
но не поставили закрывающий тег комментария
@@ -97,7 +97,7 @@
Ошибки компиляции
Невозможно отрицать строку
-
Вы пытались отрицать строку, например
+
Вы пытались отрицать строку, например string = -string
@@ -156,7 +156,7 @@
Ошибки компиляции
Невозможно использовать имя функции/скрипта для переменной, используя [functions/script]
-
Вы пытались использовать в качестве переменной, например, имя функции или имя скрипта:
+
Вы пытались использовать в качестве переменной, например, имя функции или имя скрипта: string = "Hello World"
@@ -173,7 +173,7 @@
Ошибки компиляции
Вы указали неверное количество аргументов при использовании аксессора
-
Неправильный тип аргументов для (одного из нижеперечисленных):
+
Неправильный тип аргументов для (одного из нижеперечисленных):
/, div, mod, +, -, &&, ||, &, |, ^, <<, >>
Вы указали неверный тип аргумента для вычисляемого выражения
@@ -247,7 +247,7 @@
Ошибки компиляции
Некорректный условный оператор
-
Вы использовали ошибочный условный (троичный) оператор или оператор if, а не формат:
+
Вы использовали ошибочный условный (троичный) оператор или оператор if, а не формат: [condition] ? [expression1] : [expression2];
@@ -260,8 +260,8 @@
Ошибки компиляции
В коде вы неправильно используете оператор присваивания
-
Неправильно сформированный
- if / repeat / while / do / for / with / switch / break / continue / exit
+
Неправильно сформированный
+ if / repeat / while / do / for / with / switch / break / continue / exit
оператор
Структура приведенного утверждения неверна.
@@ -408,16 +408,16 @@
Ошибки компиляции
-
Символ (ожидаемый
- Символ ) ожидаемый
- Символ , или ) ожидаемый
- Символ { ожидаемый
- Символ } ожидаемый
- Символ , или } ожидается
- Символ : ожидается
- Символ ; ожидается
- Символ [ ожидаемый
- символ ] ожидаемый
+
Символ (ожидаемый
+ Символ ) ожидаемый
+ Символ , или ) ожидаемый
+ Символ { ожидаемый
+ Символ } ожидаемый
+ Символ , или } ожидается
+ Символ : ожидается
+ Символ ; ожидается
+ Символ [ ожидаемый
+ символ ] ожидаемый
Символ , или ] ожидаемый
Вы не использовали требуемый символ при написании кода
Ошибки Runner обычно более серьезны, чем ошибки компиляции, поскольку они означают, что в вашем коде что-то серьезно не так, чего не смогли обнаружить ни редактор кода, ни компилятор, и поэтому вы должны обращать внимание на все такие ошибки. При возникновении такой ошибки вы можете воспользоваться кнопкой Copy на всплывающем окне, чтобы скопировать ошибку в буфер обмена, который затем можно вставить в текстовый файл (или куда-либо еще) для дальнейшего использования.
Структура этой ошибки выглядит следующим образом:
-
+
Здесь отображается событие, в котором произошла ошибка, а также объект (если применимо).
-
+
Это показывает фактическую ошибку. Таким образом, она показывает область действия ошибки и ее тип. Первое значение в скобках будет идентификатором экземпляра, на котором выполнялся код, или это может быть одно из специальных значений, перечисленных в таблице ниже, а второе - это внутреннее значение, которое GameMaker использует для идентификации ошибок, и его можно игнорировать. В случае с изображением выше это означает, что переменная _image не была установлена (т.е. не существует до обращения к ней) на объекте obj_EA_DEMO_Control.
-
+
Здесь показан номер строки, на которой возникла ошибка, а также фрагмент кода с указанием позиции. Обратите внимание, что это не всегда на 100% точно из-за способа компиляции игры, но этого должно быть достаточно, чтобы помочь вам найти точное место проблемы.
Как упоминалось выше, некоторые сообщения об ошибках будут идентифицироваться не по значению ID экземпляра, а по отрицательному значению. Эти значения могут быть использованы для точного определения природы ошибки и того, к чему она относится, при этом возможны следующие значения:
@@ -264,7 +264,7 @@
Ошибки бегунов
With
Невозможно использовать global в операторе with
С
-
Вы пытались использовать "global" в качестве переменной в операторе "with", т.е:
+
Вы пытались использовать "global" в качестве переменной в операторе "with", т.е: with (global)
{
//do something;
@@ -275,7 +275,7 @@
Ошибки бегунов
With
Невозможно использовать local в операторе with
С
-
Вы пытались использовать "local" в качестве переменной в операторе "with", т.е:
+
Вы пытались использовать "local" в качестве переменной в операторе "with", т.е: with (local)
{
//do something;
diff --git a/Manual/contents/Additional_Information/Errors/Syntax_Errors.htm b/Manual/contents/Additional_Information/Errors/Syntax_Errors.htm
index d1513eb3a..cb0c22308 100644
--- a/Manual/contents/Additional_Information/Errors/Syntax_Errors.htm
+++ b/Manual/contents/Additional_Information/Errors/Syntax_Errors.htm
@@ -69,7 +69,7 @@
Список синтаксических ошибок
Ненужное выражение [val] используется в качестве утверждения
-
Эта ошибка возникает, когда программа проверки синтаксиса обнаруживает выражение (показанное в [val]) там, где она ожидала оператора. Например, следующий код приведет к ошибке, так как он ожидает троичный оператор ?, но встречает 32:
+
Эта ошибка возникает, когда программа проверки синтаксиса обнаруживает выражение (показанное в [val]) там, где она ожидала оператора. Например, следующий код приведет к ошибке, так как он ожидает троичный оператор ?, но встречает 32: temp_x = x < (room_width / 2) 32: room_width - 32;
@@ -101,7 +101,7 @@
Список синтаксических ошибок
Получено "[val1]", ожидалось "[val2]".
-
Это происходит, когда программа проверки синтаксиса ожидает какое-то значение или символ, но получает другое, где [val1] - текущий символ или значение, а [val2] - ожидаемый символ или значение. Например:
+
Это происходит, когда программа проверки синтаксиса ожидает какое-то значение или символ, но получает другое, где [val1] - текущий символ или значение, а [val2] - ожидаемый символ или значение. Например: Got "{", expected "("
@@ -118,14 +118,14 @@
Список синтаксических ошибок
Пустое утверждение [val]
-
Это происходит, когда вы завершаете оператор и оставляете его пустым. Например, следующий код выдаст ошибку (обратите внимание на завершающую точку с запятой):
+
Это происходит, когда вы завершаете оператор и оставляете его пустым. Например, следующий код выдаст ошибку (обратите внимание на завершающую точку с запятой): if (x < 0);
Вызовы вложенных функций не допускаются
-
Это может произойти, когда вы пытаетесь вложить вызовы функций внутри оператора, например:
+
Это может произойти, когда вы пытаетесь вложить вызовы функций внутри оператора, например: ds_list_find_value(list, 0)).sprite_index
Буфер фиксированного размера в байтах. Размер устанавливается при создании буфера и больше не может быть изменен.
buffer_grow
-
+
Буфер, который будет динамически увеличиваться по мере добавления данных. Вы создаете его с начальным размером (который должен быть приблизительно равен размеру данных, которые предполагается хранить), а затем он будет расширяться, принимая данные, превышающие этот начальный размер.
buffer_wrap
-
+
Буфер, в который будут заворачиваться данные. Когда добавляемые данные достигнут предела размера буфера, перезапись будет помещена обратно в начало буфера, и дальнейшая запись продолжится с этого момента.
buffer_fast
-
+
Это специальный "урезанный" буфер, который очень быстро читается и записывается. Однако он может использоваться только с типами данных buffer_u8 и должен быть выровнен по 1 байту. (Информацию о типах данных и выравнивании байтов можно найти далее на этой странице).
@@ -53,7 +53,7 @@
Руководство по использованию буферов
При создании буфера вы всегда должны стараться создать его такого размера, который соответствует типу, при этом общее правило заключается в том, что он должен быть создан для максимального размера данных, которые он должен хранить, а если есть сомнения, используйте растущий буфер для предотвращения ошибок перезаписи.
Фактический код для создания буфера будет выглядеть примерно так:
Это создаст фиксированный буфер размером 16384 байта с выравниванием по байтам до 2, при этом функция возвращает уникальное значение ID, которое хранится в переменной для последующего обращения к этому буферу.
При чтении и записи данных в буфер, вы делаете это "кусками" данных, определяемыми их "типом данных". Тип данных" задает количество байт, выделяемых в буфере для записываемого значения, и очень важно, чтобы это было правильно, иначе вы получите очень странные результаты (или даже ошибки) для вашего кода.
Запись в буфер (и чтение из него) происходит последовательно, то есть одна часть данных записывается за другой, причем каждая часть данных имеет определенный тип. Это означает, что в идеале вы должны постоянно знать, какие данные вы записываете в буфер. Эти типы данных определяются в GML следующими константами:
@@ -68,73 +68,73 @@
Руководство по использованию буферов
buffer_u8
1
-
+
Беззнаковое 8-разрядное целое число. Это положительное значение от 0 до 255.
buffer_s8
1
-
+
Знаковое 8-разрядное целое число. Это может быть положительное или отрицательное значение от -128 до 127 (0 считается положительным).
buffer_u16
2
-
+
Беззнаковое 16-разрядное целое число. Это положительное значение от 0 до 65 535.
buffer_s16
2
-
+
Подписанное 16-разрядное целое число. Это может быть положительное или отрицательное значение от -32,768 до 32,767 (0 считается положительным).
buffer_f16
2
-
+
16-разрядное число с плавающей запятой. Это может быть положительное или отрицательное значение в диапазоне +/- 65504. (В настоящее время не поддерживается!)
buffer_u32
4
-
+
Беззнаковое 32-разрядное целое число. Это положительное значение от 0 до 4 294 967 295.
buffer_s32
4
-
+
Подписанное 32-разрядное целое число. Это может быть положительное или отрицательное значение от -2,147,483,648 до 2,147,483,647 (0 считается положительным).
buffer_f32
4
-
+
32-разрядное число с плавающей запятой. Это может быть положительное или отрицательное значение в диапазоне +/-16777216.
buffer_u64
8
-
+
64-битное беззнаковое целочисленное значение.(В настоящее время поддерживается не всеми функциями буфера!)
buffer_f64
8
-
+
64-разрядное число с плавающей запятой.
buffer_bool
1
-
+
Булево значение. Может быть только 1 или 0 (true или false).
buffer_string
Н/Д
-
+
Это строка UTF-8 с нулевым окончанием (0x00). По сути, в буфер сбрасывается строка GameMaker, а в конце ставится 0.
-
+
А кривые распределения (линейная, гауссова и обратная гауссова) показаны здесь:
Ниже приведен пример кода/действий, необходимых для определения двух эмиттеров, которые обычно идут в событии Create объекта контроллера, сразу после определения системы частиц. Один из них будет статичным и будет распылять частицы по площади всей комнаты, а другой будет динамичным и будет следовать за мышью и вырываться каждые 30 шагов из небольшого эллипса:
GML Visual - это метод визуального создания сценариев для программирования на языке GameMaker Language (GML). Он заключается в использовании блоков действий для построения игровой логики визуальным и интуитивно понятным способом, и является идеальным инструментом для людей, которые изучают программирование, или для людей с более визуальными наклонностями.
-
Раздел руководства " Визуальный GML " состоит из следующих разделов:
+
Раздел руководства " GML Visual " состоит из следующих разделов:
GML Visual - это инструмент визуального создания сценариев, который можно использовать для создания игр, не набирая никакого кода. Это не означает, что вы не программируете код при использовании GML Visual, это так, просто ваш код создается и представляется в визуальном виде с использованием "блоков" действий , а не текста. Действия - это простые выраженияилиутверждения, которые можно "связать" вместе, чтобы заставить экземпляр объекта сделать что-то, когда он помещен в комнату. Например, можно выполнить действие в событии Create для перемещения экземпляра в случайном направлении, а другое действие в событии Collision, чтобы заставить его отскакивать от предметов, с которыми он сталкивается (более подробную информацию о различных доступных событиях и их взаимодействии см. в разделе " События объектов").
-
На рисунке выше показан типичный объект, открытый на рабочем пространстве для редактирования. Он имеет окно "Событие" и окно "Код", прикрепленные к нему, и в окне кода вы можете видеть, где мы построили наш GML Visual. Давайте рассмотрим это окно немного подробнее и посмотрим, какие опции нам доступны:
-
Ниже вы найдете более подробную информацию о каждом из представленных разделов:
+
обзор {GML_Visual}
+
GML Visual - это инструмент визуального создания сценариев, который можно использовать для создания игр, не набирая никакого кода. Это не означает, что вы не программируете код при использовании GML Visual, это так, просто ваш код создается и представляется в визуальном виде с использованием "блоков" действий , а не текста. Действия - это простые выраженияилиутверждения, которые можно "связать" вместе, чтобы заставить экземпляр объекта сделать что-то, когда он помещен в комнату. Например, можно выполнить действие в событии Create для перемещения экземпляра в случайном направлении, а другое действие в событии Collision, чтобы заставить его отскакивать от предметов, с которыми он сталкивается (более подробную информацию о различных доступных событиях и их взаимодействии см. в разделе " События объектов").
+
На рисунке выше показан типичный объект, открытый на рабочем пространстве для редактирования. Он имеет окно "Событие" и окно "Код", прикрепленные к нему, и в окне кода вы можете видеть, где мы построили наш GML Visual. Давайте рассмотрим это окно немного подробнее и посмотрим, какие опции нам доступны:
+
Ниже вы найдете более подробную информацию о каждом из представленных разделов:
Когда вы добавляете событие к своему объекту, в окне кода открывается новая вкладка для отображения содержимого этого события. Вы можете добавить несколько событий и иметь одновременно открытыми несколько вкладок, переключаясь между ними и редактируя их по своему усмотрению. Вкладки можно закрыть в любое время, чтобы уменьшить беспорядок (при повторном выборе события в объекте они снова откроются), а также можно щелкнуть и перетащить вкладку из окна в собственное окно кода, при этом закрытие объекта или окна кода не приведет к закрытию нового окна. Вкладки можно перетаскивать влево или вправо, чтобы изменить их порядок.
-
+
Когда вы добавляете событие к своему объекту, в окне кода открывается новая вкладка для отображения содержимого этого события. Вы можете добавить несколько событий и иметь одновременно открытыми несколько вкладок, переключаясь между ними и редактируя их по своему усмотрению. Вкладки можно закрыть в любое время, чтобы уменьшить беспорядок (при повторном выборе события в объекте они снова откроются), а также можно щелкнуть и перетащить вкладку из окна в собственное окно кода, при этом закрытие объекта или окна кода не приведет к закрытию нового окна. Вкладки можно перетаскивать влево или вправо, чтобы изменить их порядок.
По мере добавления блоков действий в событие они будут появляться в "сокращенном" виде в виде простого обзора происходящего. Порядок обзора - это порядок, в котором каждый из блоков действий будет выполняться для данного события, и вы можете нажать на любой элемент в списке, чтобы изменить масштаб представления блока действий для редактирования.
В эту область рабочего пространства вы перетаскиваете действия из панели инструментов для создания визуального кода GML. Нажмите на действие и перетащите его в эту область, чтобы добавить его в список действий и отредактировать. Большинство действий имеют различные аргументы(параметры), которые вы можете задать, и большинство из них также принимают ключевые слова, переменные экземпляра или даже функции GML - например, вы можете вызвать действие Set Direction и использовать функцию GML. random(val) для задания произвольного направления.
+
В эту область рабочего пространства вы перетаскиваете действия из панели инструментов для создания визуального кода GML. Нажмите на действие и перетащите его в эту область, чтобы добавить его в список действий и отредактировать. Большинство действий имеют различные аргументы(параметры), которые вы можете задать, и большинство из них также принимают ключевые слова, переменные экземпляра или даже функции GML - например, вы можете вызвать действие Set Direction и использовать функцию GML. random(val) для задания произвольного направления.
По мере добавления блоков действий в код они визуально "связываются в цепочку", чтобы указать порядок выполнения различных действий, хотя то, как создается эта цепочка, зависит от исходного блока, который был использован. Например, блок If Variable будет иметь две цепочки - одну к блокам, которые будут вызваны, если проверяемое условие true, а затем к следующему за ним блоку. Для получения дополнительной информации о построении блоков действий в коде см. разделы, ссылки на которые приведены ниже.
-
Находясь в рабочей области блока действий, вы можете нажать и удерживать среднюю кнопку мыши для панорамирования, а колесико мыши - для прокрутки списка действий вверх или вниз. Если вы удерживаете кнопку при перемещении колесика мыши, то вид будет прокручиваться влево/вправо, а если вы удерживаете кнопки / и перемещаете колесико мыши, то вид будет увеличиваться или уменьшаться, позволяя вам видеть больше рабочей области с действиями. Вы можете щелкнуть на любом действии из списка действий слева, чтобы сфокусироваться на этом действии, сбросив масштаб и положение. Также обратите внимание, что вы можете изменить размер блоков действий, перемещая мышь к краям блока, а затем - когда курсор изменится - перетаскивая в нужном направлении.
-
Вы также можете щелкнуть правой кнопкой мыши в любом месте рабочего пространства GML Visual, чтобы вызвать меню RMB, которое подробно описано здесь.
-
+
Находясь в рабочей области блока действий, вы можете нажать и удерживать среднюю кнопку мыши для панорамирования, а колесико мыши - для прокрутки списка действий вверх или вниз. Если вы удерживаете кнопку при перемещении колесика мыши, то вид будет прокручиваться влево/вправо, а если вы удерживаете кнопки / и перемещаете колесико мыши, то вид будет увеличиваться или уменьшаться, позволяя вам видеть больше рабочей области с действиями. Вы можете щелкнуть на любом действии из списка действий слева, чтобы сфокусироваться на этом действии, сбросив масштаб и положение. Также обратите внимание, что вы можете изменить размер блоков действий, перемещая мышь к краям блока, а затем - когда курсор изменится - перетаскивая в нужном направлении.
+
Вы также можете щелкнуть правой кнопкой мыши в любом месте рабочего пространства GML Visual, чтобы вызвать меню RMB, которое подробно описано здесь.
На панели инструментов хранятся все действия GML Visual, причем в разных разделах находятся коллекции (библиотеки) действий, которые похожи или связаны между собой. Каждая коллекция действий связана с определенной темой или общей целью, и вы просто нажимаете и перетаскиваете нужное действие из панели инструментов в рабочую область блока действий, чтобы добавить его к текущему событию. Для упрощения работы - поскольку действий очень много - вы можете использовать панель "Поиск" в верхней части для поиска определенного действия или фильтрации видимых действий (например, введите "draw", чтобы получить все действия рисования), а также вы можете нажать и перетащить значки из любой библиотеки в папку "Избранное", чтобы сохранить часто используемые действия вместе. Это особенно полезно, если есть определенные действия, которые вы будете выполнять снова и снова. Папку "Избранное" можно очистить, нажав на маленький значок "Корзина".
-
Полный список доступных действий, а также аргументы, которые они принимают и как они могут быть соединены в цепочку, смотрите в разделе " Визуальный справочник GML ".
-
Вы можете использовать правую кнопку мыши на любом действии в панели инструментов, чтобы открыть следующее меню:
+
На панели инструментов хранятся все действия GML Visual, причем в разных разделах находятся коллекции (библиотеки) действий, которые похожи или связаны между собой. Каждая коллекция действий связана с определенной темой или общей целью, и вы просто нажимаете и перетаскиваете нужное действие из панели инструментов в рабочую область блока действий, чтобы добавить его к текущему событию. Для упрощения работы - поскольку действий очень много - вы можете использовать панель "Поиск" в верхней части для поиска определенного действия или фильтрации видимых действий (например, введите "draw", чтобы получить все действия рисования), а также вы можете нажать и перетащить значки из любой библиотеки в папку "Избранное", чтобы сохранить часто используемые действия вместе. Это особенно полезно, если есть определенные действия, которые вы будете выполнять снова и снова. Папку "Избранное" можно очистить, нажав на маленький значок "Корзина".
+
Полный список доступных действий, а также аргументы, которые они принимают и как они могут быть соединены в цепочку, смотрите в разделе " справочник GML Visual ".
+
Вы можете использовать правую кнопку мыши на любом действии в панели инструментов, чтобы открыть следующее меню:
Здесь у вас есть следующие опции:
Использовать<действие>: Это добавит действие, которое было под мышью, когда была нажата правая кнопка мыши, в рабочую область текущего события.
-
Сделать / Удалить избранное: Это добавит или удалит действие в библиотеку "Избранное" в верхней части панели инструментов. В этой библиотеке вы можете создать пользовательскую группу действий, которые вы используете регулярно, сокращая время на их поиск в библиотеках.
-
Очистить избранное: При выборе этого пункта все действия будут удалены из библиотеки "Избранное".
-
Очистить недавно использованные: При выборе этого пункта все действия будут удалены из библиотеки "Недавно использованные".
-
Свернуть все: Эта опция свернет все библиотеки GML Visual так, что будут видны только заголовки библиотек, но не узлы действий. Каждую библиотеку можно снова развернуть, щелкнув по ней.
+
Сделать / Удалить избранное: Это добавит или удалит действие в библиотеку "Избранное" в верхней части панели инструментов. В этой библиотеке вы можете создать пользовательскую группу действий, которые вы используете регулярно, сокращая время на их поиск в библиотеках.
+
Очистить избранное: При выборе этого пункта все действия будут удалены из библиотеки "Избранное".
+
Очистить недавно использованные: При выборе этого пункта все действия будут удалены из библиотеки "Недавно использованные".
+
Свернуть все: Эта опция свернет все библиотеки GML Visual так, что будут видны только заголовки библиотек, но не узлы действий. Каждую библиотеку можно снова развернуть, щелкнув по ней.
-
+
-
+
На следующих страницах мы более подробно рассмотрим, как построить код блока действий, а также как установить область действия, чтобы влиять на различные вещи в вашем проекте, и другие важные детали:
В этом разделе руководства перечислены все различные действия, доступные вам при использовании GML Visual для программирования вашей игры. Ниже вы можете найти каждую из различных библиотек действий, доступных вам из инструментария объекта GML Visual, а в разделе каждой библиотеки объясняются отдельные действия и приводятся примеры их использования.
Помимо вышеперечисленных библиотек действий, у вас также есть библиотека "Избранное" - это специальный раздел панели инструментов, куда вы можете перетащить действия и держать под рукой те, которые вы используете чаще всего, а также библиотека " Недавно использованные ", в которой хранятся последние 5 действий, которые вы использовали:
+
+
Помимо вышеперечисленных библиотек действий, у вас также есть библиотека "Избранное" - это специальный раздел панели инструментов, куда вы можете перетащить действия и держать под рукой те, которые вы используете чаще всего, а также библиотека " Недавно использованные ", в которой хранятся последние 5 действий, которые вы использовали:
-
-
-
+
+
+
Откат многопользовательских действий
Действия отката используются для создания многопользовательских игр с помощью системы отката GameMaker.
Вы можете использовать GameMaker Language для программирования игр двумя различными способами: размещая блоки для визуального "написания" кода или написания кода вручную.
Первый вариант, GML Visual, лучше всего подходит для новичков и любителей, которые хотят быстро приступить к созданию собственных игр.
Второй вариант, GML Code, позволяет вам использовать всю мощь GameMaker Language, написав код вручную.
-
Хотя с GML Visual легче начинать, GML Code по-прежнему является простым в использовании языком программирования с мощными возможностями(функции, методы, структуры и конструкторы и т.д.).
+
Хотя с GML Visual легче начинать, GML Code по-прежнему является простым в использовании языком программирования с мощными возможностями(функции, методы, Структуры и конструкторы и т.д.).
Создание сценариев Visual/Code
Вам предлагается выбрать между GML Code и GML Visual при создании нового события Object, нового актива Script или чего-либо другого, что приводит к созданию сценария:
-
Помимо выбора между GML Code и GML Visual, это окно содержит два флажка:
+
Помимо выбора между GML Code и GML Visual, это окно содержит два флажка:
Не спрашивать снова для этого проекта: Когда эта опция включена, она устанавливает параметр Game Option "Default scripting language" на ваш новый выбор, поэтому вас не попросят выбрать его снова для текущего проекта.
Не спрашивать больше никогда: Когда эта опция включена, она устанавливает предпочтение "Язык сценариев по умолчанию" на ваш новый выбор, так что вас никогда не попросят выбрать его снова, ни для каких проектов.
@@ -27,29 +27,29 @@
Создание сценариев Visual/Code
GML Visual
Это метод визуального сценария GameMaker, который использует блоки действий , соединенных в цепочку, для создания логики вашей игры. В следующих разделах объясняется, как использовать эти действия:
Пишите код GML, используя функции, переменные и другие конструкции кодирования, и создавайте логику вашей игры. В следующих разделах объясняется, как писать код с помощью GML:
\ No newline at end of file
diff --git a/Manual/contents/GameMaker_Language/GML_Overview/Arrays.htm b/Manual/contents/GameMaker_Language/GML_Overview/Arrays.htm
index 39ee95dbe..af30d21bb 100644
--- a/Manual/contents/GameMaker_Language/GML_Overview/Arrays.htm
+++ b/Manual/contents/GameMaker_Language/GML_Overview/Arrays.htm
@@ -49,7 +49,7 @@
Создание массивов
ПРИМЕЧАНИЕ: Экспорт HTML5 является исключением из вышеуказанного правила, и при нацеливании на него следует инициализировать массивы в последовательном порядке от 0 вверх.
Вы также можете использовать функцию GMLarray_create() для инициализации массива с фиксированным размером, и вы даже можете создавать "пустые" массивы без значений, например:
my_array = [];
-
Это сообщает GameMaker, что переменная "my_array" является массивом, и вы можете добавлять в нее значения в любое время в будущем. Однако если вы попытаетесь получить доступ к значению в пустом массиве, то получите ошибку.
+
Это сообщает GameMaker, что переменная "my_array" является массивом, и вы можете добавлять в нее значения в любое время в будущем. Однако если вы попытаетесь получить доступ к значению в пустом массиве, то получите ошибку.
Если вы уже знаете, какие элементы вы хотите поместить в массив, вы можете добавить значения, разделенные запятыми, между скобками при объявлении массива:
my_array = ["Steve", 36, "ST-3V3 - Steve Street"];
Этот раздел руководства содержит всю информацию, необходимую для понимания и использования Код GML. Функции выполнения на этом языке могут быть использованы для создания ваших игр и добавляются в объекты из программы Редактор объектовхотя он также может быть использован вместе с GML Visual. Ниже показано типичное изображение объекта с открытым редактором кода на событии:
-
Каждое событие имеет свою собственную вкладку в редакторе, и вы можете добавлять, редактировать или удалять код из них в любое время (для получения дополнительной информации о событиях см. События объекта). Сам код должен иметь базовую структуру и может содержать индексы ресурсов, переменные, функции, выражения, ключевые слова и т.д., о которых рассказывается в следующих разделах. Если вы новичок в программировании или переходите с GML Visual, рекомендуется начать со страницыБазовая структура кода а затем прочитать все остальные страницы этого раздела, проверяя код каждой из них в рамках GameMaker в самом GameMaker.
+
Обзор GML Code
+
Этот раздел руководства содержит всю информацию, необходимую для понимания и использования GML Code. Функции выполнения на этом языке могут быть использованы для создания ваших игр и добавляются в объекты из программы Редактор объектовхотя он также может быть использован вместе с Визуальный GML. Ниже показано типичное изображение объекта с открытым редактором кода на событии:
+
Каждое событие имеет свою собственную вкладку в редакторе, и вы можете добавлять, редактировать или удалять код из них в любое время (для получения дополнительной информации о событиях см. События объекта). Сам код должен иметь базовую структуру и может содержать индексы ресурсов, переменные, функции, выражения, ключевые слова и т.д., о которых рассказывается в следующих разделах. Если вы новичок в программировании или переходите с Визуальный GML, рекомендуется начать со страницыБазовая структура кода а затем прочитать все остальные страницы этого раздела, проверяя код каждой из них в рамках GameMaker в самом GameMaker.
Вы можете использовать Feather для интеллектуального завершения кода и сообщения об ошибках в ваших сценариях GML Code.
Эта переменная содержит массив, который используется вместе с переменной только для чтения argument_count в функциях или методахсценария. Каждая позиция массива содержит входное значение для функции и специально предназначена для использования в функциях с переменным аргументом.
Обратите внимание, что существует также ряд независимых переменных глобальной области видимости, которые также могут быть использованы в пользовательских функциях для ссылки на различные входные аргументы: argument0, argument1, argument2, и т.д... вплоть до argument15.
ПРИМЕЧАНИЕ: Это больше не является строго обязательным и предоставляется больше для поддержки наследия, чем для чего-либо еще. Все определяемые пользователем функции будут принимать переменные аргументы, и любой аргумент, передаваемый в функцию, который не является частью именованных входов, по умолчанию инициализируется как undefined, что можно проверить с помощью функции is_undefined().
Эта переменная, доступная только для чтения, возвращает количество "аргументов", передаваемых функции сценария или функции method. Обычно используется в сочетании с массивом аргументов (argument[0...15]), чтобы позволить варьировать входные аргументы для данной функции.
ПРИМЕЧАНИЕ: Это больше не является строго обязательным и предоставляется больше для поддержки наследия, чем для чего-либо еще. Все определяемые пользователем функции будут принимать переменные аргументы, и любой аргумент, передаваемый в функцию, который не является частью именованных входов, по умолчанию инициализируется как undefined, что можно проверить с помощью функции is_undefined().
Эта переменная является глобальной и используется для хранения карты DS при использовании в асинхронных событиях, и -1 во всех остальных случаях. Фактическое содержимое карты DS будет зависеть от типа обратного вызова асинхронного события, а также от функции, которая была использована для запуска события, поэтому обратитесь к отдельным страницам этих событий для получения полной информации о возможном содержимом карты DS.
Эта переменная является глобальной и используется для хранения числового значения, которое обычно используется для здоровья игрока. Эта переменная предназначена только для поддержки старых проектов предыдущих версий GameMaker, и ее следует не использовать в новых проектах поскольку в будущем она может быть устаревшей.
Эта переменная является глобальной и используется для хранения числового значения, которое обычно используется для жизней игроков. Эта переменная предназначена только для поддержки старых проектов предыдущих версий GameMaker, и ее следует не использовать в новых проектах поскольку в будущем она может быть устаревшей.
Эта переменная является глобальной и используется для хранения числового значения, которое обычно используется для оценки игрока. Эта переменная предназначена только для поддержки старых проектов предыдущих версий GameMaker, и ее следует не использовать в новых проектах поскольку в будущем она может быть устаревшей.
Например, определите следующий макрос "total_weapons":
#macro total_weapons 10
Синтаксис макроса...
-
Для определения макросов необходимо правильно использовать приведенный выше синтаксис. Вы не можете использовать знак равенства (как в переменных) или ставить точку с запятой в конце (как в обычном операторе). Это приведет к тому, что определение макроса станет недействительным.
-
- Например, это неправильный способ определения макроса:
-
- #macro total_weapons = 10;
-
+
Для определения макросов необходимо правильно использовать приведенный выше синтаксис. Вы не можете использовать знак равенства (как в переменных) или ставить точку с запятой в конце (как в обычном операторе). Это приведет к тому, что определение макроса станет недействительным.
+
+ Например, это неправильный способ определения макроса:
+
+ #macro total_weapons = 10;
+
Если убрать знак равенства и двоеточие, это будет правильное определение макроса.
Затем вы можете использовать это в своем коде следующим образом:
@@ -115,7 +115,7 @@
Встроенные константы
pointer_null
-
Эта константа указывает на то, что указатель не указывает ни на что значимое (то же самое, чтоNULL в C++ или null в C#).
+
Эта константа указывает на то, что указатель не указывает ни на что значимое (то же самое, чтоNULL в C++ или null в C#).
Это значение является ложным.
@@ -124,7 +124,7 @@
Встроенные константы
undefined
-
Эта константа возвращается, когда функция должна что-то вернуть, но не имеет подходящего или "правильного" значения для возврата.
+
Эта константа возвращается, когда функция должна что-то вернуть, но не имеет подходящего или "правильного" значения для возврата.
Это значение является ложным.
Эта функция может быть использована для получения значения в определенный момент времени из структуры канала. Вы передаете указатель struct для канала (как возвращается функцией animcurve_get_channel()или как возвращено в структуре анимационной кривой из функции animcurve_get()) и позицию "x" (время) вдоль канала кривой для оценки. Эта позиция должна быть между 0 и 1, и функция вернет значение кривой в этой позиции, или вернет 0, если предоставленная структура канала недействительна.
Эта функция может быть использована для создания новой структуры канала анимационной кривой. Структура канала имеет следующие переменные:
@@ -82,11 +82,11 @@
animcurve_channel_new
-
+
По умолчанию при создании новой структуры канала переменная "name" будет пустой строкой, "type" - animcurvetype_linear, а "iterations" - 16. Все эти переменные могут быть установлены в нужные вам значения (обратите внимание, что значение "итерации" не влияет на линейные типы кривых). После создания кривой необходимо добавить точки к ней, что делается путем добавления различных структур точек в массив"points". Эти структуры точек могут быть созданы с помощью функции animcurve_point_new().
Эта функция создает пустую структуру кривой анимации, готовую к заполнению данными каналов. Функция возвращает указатель на struct, который затем используется для добавления каналов и других данных в кривую анимации. Вы также можете передать его таким функциям, как animcurve_get() для последующего получения данных из кривой.
Когда вы используете эту функцию, созданная структура не будет содержать данных, и для ее использования необходимо добавить хотя бы один канал, а в канал должны быть добавлены точки. Чтобы добавить канал, см. функцию animcurve_channel_new(), а чтобы добавить точки в канал, см. функцию animcurve_point_new(). Кроме того, вы можете дать структуре анимационной кривой имя, задав переменную "name" (как показано в примере кода ниже). Каналы, добавленные в новую кривую анимации, должны быть добавлены в виде массива, где каждый элемент массива ссылается на структуру канала, а точки в канале также должны быть добавлены в виде массива, где каждый элемент массива ссылается на структуру точки.
Обратите внимание, что созданные таким образом кривые анимации должны быть удалены, если они больше не нужны, так как в противном случае они будут занимать место в памяти, что может привести к утечке памяти, замедлению и, в конечном счете, краху вашей игры. Вы можете удалить кривую анимации, если она больше не нужна, с помощью функции animcurve_destroy(). Вам не нужно очищать данные канала или точки внутри кривой, так как это будет сделано сборщиком мусора автоматически при уничтожении самой кривой.
Эта функция может быть использована для уничтожения любых анимационных кривых, которые были ранее созданы с помощью функции animcurve_create(). Вызов этой функции удалит анимационную кривую из памяти и очистит все каналы или точки, которые она содержит (их никогда не нужно очищать вручную). Обратите внимание, что нельзя уничтожить анимационные кривые, созданные в браузере активов, только те, которые были созданы во время выполнения.
Эта функция возвращает структуру, содержащую все данные для заданной кривой анимации. Вы передаете идентификатор актива кривой анимации (как определено в браузере активов), и функция возвращает структуру со следующими переменными:
Как и в случае с каналами, точки одного канала хранятся как структуры в массиве, где каждый элемент в массиве является структурой одной точки. Структура точки объясняется на этой странице.
Обратите внимание, что если функция не сработает (например, заданный актив Animation Curve не существует), то функция вернет -1.
Эта функция возвращает структуру, содержащую данные канала для канала, указанного в активе кривой анимации. Вы передаете идентификатор или структуру анимационной кривой, а также имя или индекс канала, и функция возвращает структуру со следующим форматом:
@@ -51,7 +51,7 @@
animcurve_get_channel
-
+
ID кривой анимации - это имя кривой анимации, определенное в браузере активов, или указатель struct, возвращаемый функцией animcurve_create(). Имя канала - это строка, которая ссылается на канал, как он был определен в активе кривой анимации, или вы можете передать значение индекса, которое составляет от 0 до n, где n - последний канал в активе кривой (например: если кривая анимации имеет 4 канала, они будут проиндексированы от 0 до 3). Обратите внимание, что передача значения индекса требует меньше обработки, чем передача имени канала. Если функция не сработает (т.е. не существует канала с заданным именем или индексом), то вы получите ошибку.
Точки одного канала хранятся в виде структур в массиве, где каждый элемент массива является структурой одной точки. Структура точки имеет следующие переменные:
Эта функция возвращает значение индекса для любого заданного канала кривой анимации. Вы передаете ID кривой анимации или struct, где ID кривой - это имя кривой анимации, как она была определена в Asset Browser, или указатель struct, возвращенный функцией animcurve_create(). Затем введите имя канала в виде строки, и функция вернет значение индекса, связанное с этим каналом. Обратите внимание, что если кривая или канал не существуют, то вы получите ошибку.
Эта функция может быть использована для создания новой структуры точек, которая будет добавлена в канал кривой анимации. При создании структура точек пуста, и вам необходимо установить следующие переменные для создания данных точек:
@@ -47,7 +47,7 @@
animcurve_point_new
Каждый созданный вами point struct должен быть добавлен в массив, и именно этот массив добавляется в переменную "channels" структуры канала кривой анимации (как показано в примере ниже).
С помощью этой функции вы можете добавить одну или несколько строк тегов к любому активу из браузера активов. Вы передаете либо имя актива (в виде строки), либо его индекс, а также либо одну строку тегов, либо массив, каждый элемент которого является одной строкой тегов. Если вы указываете значение индекса актива, то вам необходимо указать дополнительный аргумент тип актива (константа), так как активы разных типов могут иметь одинаковый индекс, хотя они не могут иметь одинаковое имя. Доступные типы активов перечислены в таблице ниже:
@@ -75,7 +75,7 @@
asset_add_tags
Если функция успешно добавляет метку(и), она возвращает true, в противном случае возвращает false.
С помощью этой функции вы можете очистить все теги, присутствующие на любом активе, из браузера активов. Вы указываете либо имя актива (в виде строки), либо его индекс, а если вы указываете значение индекса актива, то вам необходимо указать дополнительный аргумент типа актива (константа), так как активы разных типов могут иметь одинаковый индекс, хотя они не могут иметь одинаковое имя. Доступные типы активов перечислены в таблице ниже:
Вы можете использовать эту функцию для получения уникального идентификационного индекса игрового актива из его названия. Если актив не найден, функция вернет значение -1, в противном случае она вернет уникальный индекс id для проверяемого актива. Этот идентификатор можно использовать в других функциях, как и любое другое значение индекса, например, функцию sprite_index или path_indexнапример. Обратите внимание, что хотя эта функция может использоваться для ссылки на активы из строк (см. пример ниже), вы всегда должны убедиться, что актив существует, прежде чем использовать его, иначе вы можете получить ошибки, которые приведут к краху вашей игры.
С помощью этой функции вы можете получить все теги, присвоенные активу, из браузера активов. Вы указываете либо имя актива (в виде строки), либо его индекс, и функция возвращает массив тегов для этого актива. Если теги не найдены или произошла ошибка (т.е. указанная строка имени не существует), то возвращаемый массив будет пуст. Если вы указываете значение индекса актива, то вам необходимо указать дополнительный аргумент тип актива (константа), так как активы разных типов могут иметь одинаковый индекс, хотя они не могут иметь одинаковое имя. Доступные типы активов перечислены в таблице ниже:
С помощью этой функции вы можете получить тип актива, на который ссылаются, из его имени (строки). При этом будет возвращена одна из перечисленных ниже констант.
С помощью этой функции вы можете проверить, присвоена ли одна или несколько строк тегов любому активу из браузера активов. Вы передаете либо имя актива (в виде строки), либо его индекс актива, а также либо одну строку тега, либо массив, каждый элемент которого является одной строкой тега. Если вы указываете значение индекса актива, то вам необходимо указать дополнительный аргумент тип актива (константа), так как активы разных типов могут иметь одинаковый индекс, хотя они не могут иметь одинаковое имя. Доступные типы активов перечислены в таблице ниже:
С помощью этой функции вы можете проверить, присвоена ли одна или несколько строк тегов любому активу из браузера активов. Вы передаете либо имя актива (в виде строки), либо его индекс актива, а также либо одну строку тега, либо массив, каждый элемент которого является одной строкой тега. Если вы указываете значение индекса актива, то вам необходимо указать дополнительный аргумент тип актива (константа), так как активы разных типов могут иметь одинаковый индекс, хотя они не могут иметь одинаковое имя. Доступные типы активов перечислены в таблице ниже:
С помощью этой функции вы можете удалить одну или несколько строк тегов для любого актива из браузера активов. Вы передаете либо имя актива (в виде строки), либо его индекс, а также либо одну строку тегов, либо массив, каждый элемент которого является одной строкой тегов. Если вы указываете значение индекса актива, то вам необходимо указать дополнительный аргумент тип актива (константа), так как активы разных типов могут иметь одинаковый индекс, хотя они не могут иметь одинаковое имя. Доступные типы активов перечислены в таблице ниже:
С помощью этой функции вы можете получить все активы заданного типа, которым присвоены заданные теги. Вы предоставляете либо один тег (в виде строки), либо массив, где каждый элемент массива является тегом (в виде строки), а также тип актива для проверки. тип актива должен быть одной из следующих констант:
@@ -77,7 +77,7 @@
tag_get_asset_ids
Функция вернет массив, где каждый элемент массива будет одним значением индекса актива. Если не существует активов данного типа, имеющих заданный тег(ы), будет возвращен пустой массив.
С помощью этой функции можно получить имена всех активов, которым был присвоен заданный тег или теги. Вы передаете либо одну строку тега, либо массив, где каждый элемент массива - это строка тега. Функция вернет массив, каждый элемент которого является именем (в виде строки) актива с заданным тегом. Если вам нужен уникальный индекс актива, то вы можете использовать функцию asset_get_index() вместе с возвращаемым именем. Если активов с заданным тегом (тегами) нет, или если произошла ошибка (например, заданные теги не существуют), то будет возвращен пустой массив.
После создания очереди вы можете использовать возвращенный индекс очереди так же, как и индекс звука для любого обычного звука, чтобы воспроизвести его, поставить на паузу, перезапустить, изменить усиление и высоту тона. Единственное, что вы не можете сделать, это получить длину дорожки или установить ее положение, но в остальном звуковую очередь можно использовать так же, как и любой другой звук. Следует также отметить, что некоторые функции аудиоочереди также вызывают асинхронное событие Audio Playback Asynchronous Event.
-
Аудиобуферы также позволяют записывать звук из любого доступного источника (например, микрофона или ОС), который затем может быть поставлен в очередь и передан с помощью вышеупомянутых функций (например). Запись звука вызовет асинхронное событие Audio Recording Asynchronous Event, которое будет содержать конкретную информацию о том, что записывается.
-
+
Аудиобуферы также позволяют записывать звук из любого доступного источника (например, микрофона или ОС), который затем может быть поставлен в очередь и передан с помощью вышеупомянутых функций (например). Запись звука вызовет асинхронное событие Audio Recording Asynchronous Event, которое будет содержать конкретную информацию о том, что записывается.
+
Для записи аудио доступны следующие функции:
С помощью этой функции вы можете создать новый звук из содержимого буфера. Буфер будет создан ранее (см. функции буфера для получения подробной информации о том, как это сделать), и в него будут добавлены или загружены данные. Затем вы передаете этой функции формат данных (в настоящее время поддерживаются только buffer_u8 или buffer_s16 ), частоту дискретизации (которая может быть от 1000 Гц до 48000 Гц) и смещение в буфере для получения данных. Также необходимо указать количество сэмплов в буфере и каналы, которые требуются звуку. Эти каналы определяются одной из следующих констант:
@@ -47,7 +47,7 @@
audio_create_buffer_sound
Обратите внимание, что после создания звука необходимо освободить связанный с ним индекс указателя, когда он больше не нужен, используя функцию audio_free_buffer_sound(). Если этого не сделать, а затем переназначить переменную или изменить комнату и т.д., идентификатор звука будет потерян и произойдет утечка памяти. Также обратите внимание, что вы не можете удалить буфер, если из него был создан какой-либо звук, и звук не был сначала освобожден. Поэтому сначала нужно освободить звук (или звуки), а затем удалить буфер. Также стоит отметить, что добавление чего-либо в буфер или изменение размера буфера после того, как из него был создан звук, приведет к неожиданным результатам, и это не рекомендуется - как только вы начали создавать звуки из любого буфера, вы не должны манипулировать им каким-либо другим образом.
Эта функция подготавливает буферную очередь для аудио. Вы передаете формат данных (в настоящее время поддерживаются только buffer_u8 или buffer_s16 ), частоту дискретизации (которая может быть от 1000гц до 48000гц), и каналы, которые требует аудио из одной из перечисленных ниже констант:
@@ -37,7 +37,7 @@
audio_create_play_queue
-
+
Обратите внимание, что вы должны освободить все очереди аудио, созданные с помощью этой функции, когда они больше не нужны, чтобы предотвратить утечку памяти при использовании функции audio_free_play_queue().
С помощью этой функции можно освободить значение индекса указателя, связанное с идентификатором звука. Освобожденные звуки будут недоступны для воспроизведения, а если воспроизводится несколько экземпляров звука, то все они будут остановлены. Обратите внимание, что перед удалением
сам буфер, необходимо сначала освободить все связанные с ним идентификаторы звуков.
Эта функция используется для освобождения памяти, связанной с заданной аудиоочередью. Индекс очереди - это значение, возвращенное при создании очереди с помощью функции audio_create_play_queue()и эта функция должна вызываться, когда очередь больше не нужна, чтобы предотвратить утечку памяти. Освобождение очереди остановит любой воспроизводимый звук, и вы не сможете удалить буфер, из которого передается звук, пока не будет освобождена очередь, которой он назначен. Эта функция вызовет асинхронное событие воспроизведения звука, и в этом событии в переменной будет создана специальная DS картаasync_load со следующими парами ключ/значение:
"queue_id" - очередь, которая закончила воспроизведение данных
Эта функция возвращает количество источников записи звука (таких как микрофоны и т.д.), доступных в настоящее время для вашей игры. Так, если возвращаемое значение равно, например, четырем, то у вас будет аудио вход на источниках 0, 1, 2 и 3, причем одно из этих значений будет тем, с которого вы начнете запись с помощью функции audio_start_recording(). Это значение может меняться в любое время по мере того, как люди подключают/отключают микрофоны или другие источники входного сигнала к устройству. Обратите внимание, что вы можете использовать функцию audio_get_recorder_info() для получения информации о каждом подключенном устройстве.
ВАЖНО Эта функция всегда будет возвращать 1 на цели Opera GX.
Эта функция возвращает DS Map с информацией о заданном индексе источника диктофона. Вы можете узнать, сколько источников диктофонов доступно, используя функцию audio_get_recorder_count(), а возвращаемая карта будет содержать следующие пары ключ/значение:
"имя" - имя для описания устройства
@@ -28,7 +28,7 @@
audio_get_recorder_info
ПРИМЕЧАНИЕБольшинство платформ поддерживают запись звука в той или иной форме, но это не означает, что все устройства позволят это сделать, даже если платформа это делает, поэтому всегда следует проверять, что функция audio_get_recorder_count() возвращает значение больше 0, чтобы убедиться, что устройства записи доступны, прежде чем использовать остальные функции записи.
Эта функция добавит данные из буфера в очередь аудио, которую вы ранее создали с помощью функции audio_create_play_queue(). Вы указываете индекс очереди для добавления, ID буфера для получения данных, а также позицию (смещение) в буфере и количество байт для добавления. После добавления звука из буфера в очередь, буфер не может быть удален до тех пор, пока вы не освободите очередь с помощью функции audio_free_play_queue(), а свойства буфера должны соответствовать свойствам очереди, в которую вы добавляете звук.
Эта функция начнет запись звука с проиндексированного источника рекордера. Количество источников рекордера можно получить с помощью функции audio_get_recorder_count(), и как только вы начнете запись, аудио будет сохранено во временном буфере и начнет вызывать асинхронное событие Audio Recording Asynchronous Event. Это событие будет срабатывать на каждом шаге, когда происходит запись, и создаст специальную карту DS в переменной async_load со следующими парами ключ/значение:
"buffer_id" - идентификатор временного буфера, который можно использовать для получения аудиоданных
@@ -26,7 +26,7 @@
audio_start_recording
ПРИМЕЧАНИЕБольшинство платформ поддерживают запись звука в той или иной форме, но это не означает, что все устройства позволят это сделать, даже если платформа это делает, поэтому всегда следует проверять, что функция audio_get_recorder_count() возвращает значение больше 0, чтобы убедиться, что записывающие устройства доступны, прежде чем использовать остальные функции записи.
Эта функция остановит запись на заданном канале рекордера (индекс канала возвращается при вызове функции audio_start_recording()). Когда вы остановите запись, для данного канала рекордера не будет инициировано никаких дальнейших асинхронных событий аудиозаписи, поэтому обычно вы используете эту функцию в реальном асинхронном событии, чтобы убедиться, что вы захватили все данные.
ПРИМЕЧАНИЕБольшинство платформ поддерживают запись звука в той или иной форме, но это не означает, что все устройства позволят это сделать, даже если платформа это делает, поэтому всегда следует проверять, что функция audio_get_recorder_count() возвращает значение больше 0, чтобы убедиться, что записывающие устройства доступны, прежде чем использовать остальные функции записи.
Эта функция возвращает, существует ли аудиоизлучатель (true) или нет (false). Обратите внимание, что если искомый индекс не был инициализирован ранее, эта функция выдаст ошибку, так как она ищет несуществующие индексы.
С помощью этой функции вы можете установить расстояние спада для излучателя. Это расстояние, на котором излучатель должен находиться от слушателя, чтобы звук "упал" до громкости 0. По умолчанию это значение равно 100, но остерегайтесь устанавливать значение меньше 1, так как в этом случае любой звук, воспроизводимый через этот излучатель, будет неслышен слушателю, однако любое другое значение приведет к затуханию звука, чем дальше излучатель находится от слушателя.
То, как будет слышен сам звук, зависит от опорного значения спада (это расстояние, на котором громкость источника обычно уменьшается вдвое) и коэффициента спада (который влияет на звук только после опорного расстояния спада). Коэффициент по умолчанию обычно равен 1, а влияние различных значений коэффициента спада зависит от выбранной модели.
Для получения полного руководства по различным моделям падения и использованию этих значений, пожалуйста, обратитесь к функции audio_falloff_set_model().
С помощью этой функции вы можете удалить заданный эмиттер из памяти. Это всегда следует делать, когда эмиттер не будет использоваться далее в комнате или игре, т.е. в событии Destroy Event экземпляра или в событии Room End Event, иначе вы можете получить утечку памяти, которая замедлит и в конечном итоге приведет к краху вашей игры.
Эта функция устанавливает максимальное усиление (громкость) для звука. Воспринимаемая громкость звука может меняться в зависимости от величины спада и его положения относительно слушателя, но при установке усиления с помощью этой функции полная громкость никогда не превысит указанного значения усиления. На изображении ниже показано, как усиление влияет на громкость излучателя, когда значение fall-off больше 0:
Эта функция изменит громкость звука во время его воспроизведения, а также всех последующих звуков, воспроизводимых через данный излучатель. Обратите внимание, что на некоторых платформах коэффициент усиления может быть больше 1, хотя значение 1 считается "полной громкостью", а большее значение может привести к клиппированию или искажению звука.
ПРИМЕЧАНИЕна конечную громкость также влияет глобальное усиление звука, которое было установлено функцией audio_master_gain().
Эта функция возвращает текущее значение усиления (громкости), установленное для данного аудиоизлучателя, обычно в диапазоне от 0 до 1, где 0 - тишина, а 1 - полная громкость. Обратите внимание, что на некоторых платформах коэффициент усиления может быть больше 1, хотя значение 1 считается "полной громкостью", а большее значение может привести к обрыву звука.
Эта функция возвращает данные битовой маски, определяющие, с каких аудиослушателей эмиттер должен воспроизводить звуки. Для получения дополнительной информации см. раздел " Аудиопрослушиватели".
С помощью этой функции вы можете изменить положение аудиоизлучателя в трехмерном аудиопространстве. Положение будет по-разному влиять на звук в зависимости от того, где находится слушатель в аудиопространстве (положение по умолчанию - (0, 0, 0). См. audio_listener_position() например, если позиция эмиттера установлена на (100, 0, 0), а текущий слушатель находится на (200, 0, 0), то звук, передаваемый от эмиттера, окажется слева от звукового поля. На рисунке ниже показано визуальное представление эмиттеров и их относительных позиций по отношению к слушателю:
Эта функция может быть использована для установки битовой маски для эмиттера, чтобы все звуки, воспроизводимые через эмиттер, воспроизводились только от указанных слушателей. Вы можете создать битовую маску с помощью функции audio_get_listener_info() а затем с помощью побитового or ("|") создать пользовательскую маску с теми слушателями, от которых требуется воспроизведение звука, а затем применить эту маску к эмиттеру. Эта маска отменяет маску по умолчанию или ту, которую вы задали с помощью функции audio_set_listener_mask().
Эта функция может быть использована для придания излучателю эффекта Доплера и имитации движения звука на основе вектора, который определяется из заданных относительных положений x, y и z. Если эмиттер сам по себе никогда не будет двигаться, вам обычно не нужно задавать эти значения, но, например, если вы создаете скроллинговую игру-стрелялку, где враги появляются справа и прокручиваются влево, вы должны установить скорость (hspeed, 0, 0) в событии создания врагов (и обновить эмиттер каждого экземпляра в событии шага с помощью параметра audio_emitter_position()), чтобы придать любым звукам, издаваемым вражескими экземплярами, правильный доплер, когда они проходят мимо экземпляра игрока (который, в свою очередь, будет использовать функцию audio_listener_position() для установки слушателя в правильное положение).
С помощью этой функции вы можете воспроизводить любой звуковой ресурс через эмиттер, при этом любые изменения усиления, положения, высоты тона или скорости эмиттера влияют на то, как пользователь слышит конечный воспроизводимый звук. Вы указываете индекс эмиттера для использования, индекс звука, который будет воспроизводиться, а затем указываете, должен ли звук зацикливаться или нет. Далее вы можете назначить приоритет, который затем используется для определения того, как звуки будут обработаны, когда количество воспроизводимых звуков превысит предел, установленный функцией audio_channel_num(). Звуки с более низким приоритетом будут остановлены в пользу звуков с более высоким приоритетом, а значение приоритета может быть любым реальным числом (фактическое значение произвольно и может быть от 0 до 1 или от 0 до 100, поскольку GameMaker будет определять их приоритет одинаково). Обратите внимание, что при работе с приоритетами чем больше число, тем выше приоритет, так что звуку с приоритетом 100 будет отдано предпочтение перед звуком с приоритетом 1.
Эта функция также возвращает уникальный индексный номер воспроизводимого звука, который можно сохранить в переменной, чтобы затем поставить его на паузу или остановить с помощью соответствующих функций. Это означает, что если у вас есть несколько экземпляров одного и того же звука, воспроизводимого в любой момент времени, вы можете выбрать только один экземпляр этого звука для работы с ним с помощью аудиофункций.
Эта функция загружает в память все звуки, отмеченные как принадлежащие заданной аудиогруппе. Функция вернет true, если загрузка начата, и false, если идентификатор группы недействителен или она уже была помечена для загрузки. Функция является асинхронной, поэтому ваша игра будет продолжать работать, пока аудио загружается в фоновом режиме. Это означает, что она также вызовет событие Asynchronous Load/Save Event, чтобы сообщить вам, что вся группа была загружена в память и звуки теперь можно использовать.
Эта функция возвращает строку, содержащую имя заданной аудиогруппы для отображения или проверки. Когда вы определяете аудиогруппу в Опциях игры, вы даете ей уникальное "имя", которое на самом деле является константой, используемой в качестве значенияID для группы. Все, что делает эта функция, это принимает ID и возвращает строку с именем ID, которое вы дали.
С помощью этой функции можно приглушить или затушить группу звуков на определенный промежуток времени, а также мгновенно установить усиление группы.
Время измеряется в миллисекундах, и функция требует, чтобы вы ввели конечный уровень усиления, которого группа должна достичь к концу этого времени. Этот уровень усиления может быть от 0 (тишина) до 1 (полная громкость), а шкала линейна, так что значение 0,5 будет равняться половине громкости. Чтобы мгновенно изменить усиление, просто установите аргумент time в 0. Обратите внимание, что на некоторых платформах усиление может быть больше 1, хотя значение 1 считается "полной громкостью", а большее значение может привести к обрыву звука.
Эта функция выгружает в память все звуки, отмеченные как принадлежащие данной аудиогруппе. Функция вернет true, если выгрузка инициирована, и false, если идентификатор группы недействителен, или она уже была помечена для выгрузки. Обратите внимание, что все звуки, воспроизводимые в данный момент при вызове этой функции, будут остановлены.
При работе со сложными звуковыми ситуациями бывает полезно определить, где в аудиосреде должен находиться слушатель. При работе с простыми аудиофункциями обычно нет необходимости изменять положение слушателя, однако при использовании эмиттеров для создания реалистичного звука в трехмерном аудиопространстве важно правильно изменить и переместить слушателя, иначе звук будет находиться в неправильном положении для человека, играющего в вашу игру.
-
По умолчанию в игре автоматически создается один слушатель, который использует идентификатор 0 (для ссылки в функциях слушателя).
-
+
По умолчанию в игре автоматически создается один слушатель, который использует идентификатор 0 (для ссылки в функциях слушателя).
+ GameMaker предоставляет следующие функции слушателей:
Некоторые целевые платформы позволяют использовать более одного слушателя, поэтому важно знать, сколько их у цели, прежде чем менять или использовать различные слушатели. Эта функция возвращает количество доступных слушателей.
Эта функция создаст карту DS и заполнит ее информацией для заданного слушателя.
ПРИМЕЧАНИЕВы несете ответственность за уничтожение возвращенного DS Map с помощью соответствующей функции.
Карта DS будет содержать следующие ключи:
@@ -27,7 +27,7 @@
audio_get_listener_info
Значение маски можно использовать для настройки звука или излучателя на воспроизведение от нескольких слушателей одновременно, просто используя побитовое or "|" для создания маски для звука (см. пример кода ниже), в то время как индекс используется для установки свойств, таких как позиция или скорость для данного слушателя, используя функции типа audio_listener_set_position().
Эта функция создаст карту DS и заполнит ее значениями положения, скорости и ориентации для заданного слушателя. Индекс слушателя по умолчанию равен 0, но вы можете использовать функцию audio_get_listener_info() для получения различных индексов, доступных для целевой платформы. Если вы укажете неправильный индекс слушателя, функция вернет -1.
ПРИМЕЧАНИЕВы несете ответственность за уничтожение возвращенной карты DS с помощью соответствующей функции.
С помощью этой функции можно изменить ориентацию слушателя в трехмерном аудиопространстве. Направление взгляда и направление вверх основаны на векторах, которые определяются из заданных относительных положений x, y и z, и по умолчанию имеют значения (0, 0, 1) для направления взгляда и (0, 1, 0) для направления вверх, как показано на рисунке ниже:
Изменение ориентации слушателя с помощью этой функции изменит восприятие звуков, создаваемых аудиоизлучателями в игровой комнате, игроком вашей игры. В приведенном ниже примере звуки, создаваемые излучателем, когда слушатель находится в положении по умолчанию, будут казаться исходящими снизу и справа от слушателя, но при новом положении и ориентации слушателя они будут восприниматься как исходящие сверху и справа.
С помощью этой функции можно изменить положение слушателя в трехмерном аудиопространстве. На рисунке ниже показано положение слушателя в аудиопространстве по умолчанию:
Как вы можете видеть, положение по умолчанию - (0, 0, 0), но обычно вы используете эту функцию для перемещения слушателя вместе с объектом игрока в вашей игре и, таким образом, для изменения того, как звук, созданный эмиттерами, слышен игроку. Например, на изображении игры сверху вниз, экземпляр игрока устанавливает слушатель, который заставит звук от различных эмиттеров "меняться", когда игрок перемещается по уровню:
С помощью этой функции вы можете изменить ориентацию данного слушателя в трехмерном аудиопространстве. По умолчанию индекс слушателя равен 0, но вы можете использовать функцию audio_get_listener_info() для получения различных индексов, доступных для целевой платформы.
Вектор взгляда и вектор вверх основаны на значениях, которые определяются из заданных относительных положений x, y и z, и по умолчанию имеют значения (0, 0, 1) для вектора взгляда и (0, 1, 0) для вектора вверх, как показано на рисунке ниже:
С помощью этой функции вы можете изменить положение данного слушателя в трехмерном аудиопространстве. По умолчанию индекс слушателя равен 0, но вы можете использовать функцию audio_get_listener_info() для получения различных индексов, доступных для целевой платформы. Пример изображения ниже показывает положение слушателя по умолчанию в аудиопространстве:
Как вы можете видеть, положение по умолчанию - (0, 0, 0), но обычно вы используете эту функцию для перемещения слушателя вместе с объектом игрока в вашей игре и, таким образом, для изменения того, как звук, созданный эмиттерами, слышен игроку. Например, на изображении игры сверху вниз, экземпляр игрока устанавливает слушатель, который заставит звук от различных эмиттеров "меняться", когда игрок перемещается по уровню:
Эта функция может быть использована для придания заданному слушателю эффекта Доплера и имитации движения звука на основе вектора, который определяется из заданных относительных положений x, y и z. Индекс слушателя по умолчанию равен 0, но вы можете использовать функцию audio_get_listener_info() для получения различных индексов, доступных для целевой платформы.
Если данный слушатель никогда не будет двигаться, или движение не является постоянным, вам обычно не нужно устанавливать эти значения, но, например, если вы делаете скроллинговую игру, где игрок имеет постоянное движение снизу вверх, а враги - сверху вниз, вы должны установить скорости слушателя и эмиттера (для эмиттеров вы должны использовать audio_emitter_velocity()) соответствующим векторам, чтобы смоделировать правильный эффект Доплера при движении мимо экземпляра игрока.
На рисунке ниже показано, как это можно настроить для приведенного выше примера игры:
Эта функция может быть использована для придания слушателю эффекта Доплера и имитации движения звука на основе вектора, который определяется из заданных относительных положений x, y и z. Если сам слушатель никогда не будет двигаться, или движение не будет постоянным, вам обычно не нужно задавать эти значения, но, например, если вы делаете скроллинговую игру, где игрок имеет постоянное движение снизу вверх, а враги - сверху вниз, вы должны установить скорости слушателя и эмиттера (для эмиттеров вы будете использовать audio_emitter_velocity()) на соответствующие векторы, чтобы смоделировать правильный эффект Доплера при движении мимо экземпляра игрока.
При использовании нескольких слушателей в системе можно установить битовую маску для звука, чтобы он был слышен только отмеченным слушателям. Однако с помощью этой функции можно также установить глобальную маску, и все звуки, воспроизводимые в обычном режиме, будут слышны слушателям, отмеченным этой маской, без необходимости устанавливать маску для каждого звука отдельно.
Создает группу синхронизации и возвращает для нее уникальное значение ID, которое затем должно использоваться во всех дальнейших вызовах аудиофункций для этой группы. Если вы хотите, чтобы группа зацикливалась, передайте true, в противном случае передайте false, но учтите, что если вы хотите, чтобы они зацикливались, все дорожки, добавленные позже, должны быть одинаковой длины. Обратите внимание, что при создании группы синхронизации необходимо освободить память и звуки, связанные с ней, если они не используются, с помощью функции audio_destroy_sync_group() например, в событиях Room End или Destroy.
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
Группы синхронизации звука должны быть уничтожены, если они не используются, чтобы освободить память и звуковые ресурсы, связанные с ними, с помощью этой функции. Для этого берется индекс группы, полученный при ее создании с помощью функции audio_create_sync_group()и освобождает все ресурсы, используемые группой.
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
его функция приостановит заданную группу синхронизации, если она играет, при этом индекс группы будет значением, возвращенным при создании группы с помощью функции audio_create_sync_group(). Это не останавливает звук, и вызов audio_resume_sync_group(). начнет его воспроизведение с той же позиции, на которой он был приостановлен.
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
С помощью этой функции можно назначить звук на ранее созданную группу синхронизации. Индекс группы - это значение, возвращенное при создании группы с помощью функции audio_create_sync_group(), а индекс звука - это индекс любого сжатого звука (*.ogg или *.mp3) из браузера активов. Эта функция только добавляет звук в группу, но не воспроизводит его. Возвращаемое значение будет >= 0 в случае успеха и -1 в случае неудачи, где успешное значение указывает порядок звука в группе синхронизации (таким образом, 0 будет первым добавленным звуком, 1 - вторым и т.д.).
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
Эта функция возобновит данную группу синхронизации, если она воспроизводится и ранее была приостановлена (с помощью функции audio_pause_sync_group). Индекс группы - это значение, возвращенное при создании группы с помощью функции audio_create_sync_group().
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
С помощью этой функции вы можете начать воспроизведение ранее созданной группы синхронизации. Вам необходимо предоставить индекс группы, который является значением, возвращенным при создании группы с помощью функции audio_create_sync_group().
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
Эта функция остановит заданную группу синхронизации, если она играет, при этом индекс группы будет значением, возвращенным при создании группы с помощью функции audio_create_sync_group().
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
его функцию можно использовать для отображения отладочной информации о любой заданной группе синхронизации (индекс группы - это значение, возвращаемое при создании группы с помощью функции audio_create_sync_group()). Вы можете вызвать функцию со значением -1, чтобы отключить наложение.
При отладке групп синхронизации звука будет отображаться накладка:
@@ -42,7 +42,7 @@
audio_sync_group_debug
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
Эта функция возвращает текущую позицию воспроизведения заданной группы синхронизации. Индекс группы - это значение, возвращенное при создании группы с помощью функции audio_create_sync_group(), а возвращаемое значение - время в секундах, в течение которого воспроизводятся дорожки.
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
С помощью этой функции вы можете установить, сколько аудиоканалов доступно для воспроизведения звука в GameMaker. В основном это означает, что вы задаете количество одновременных звуков, которые могут воспроизводиться в любой момент времени, и если это количество превышает указанное, то звуки с более низким приоритетом останавливаются, чтобы освободить канал для звуков с более высоким приоритетом. Вы можете использовать эту функцию для оптимизации игры для устройств, так как чем меньше каналов для звука, тем лучше производительность, но имейте в виду, что это может привести к заметному обрезанию некоторых звуков, если многие из них воспроизводятся одновременно.
С помощью этой функции вы можете создать новый звуковой индекс, который затем можно использовать в обычных аудиофункциях для потоковой передачи звука непосредственно из внешнего источника файла OGG. Функция требует имя файла (которое может быть, например, включенным файлом) и возвращает новый звуковой индекс для использования. Обратите внимание, что после того, как звук больше не нужен, необходимо вызвать функцию audio_destroy_stream() с индексом звука, чтобы удалить его из памяти, иначе вы можете получить утечку памяти, что приведет к замедлению и, в конечном счете, к краху вашей игры.
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
Эта функция может использоваться для отображения отладочной информации об аудиосистеме, при этом true включает ее, а false - выключает. При отладке аудио таким образом на оверлее будет отображаться следующая информация:
@@ -30,7 +30,7 @@
аудио_отладка
ПРИМЕЧАНИЕЭта функция не работает на целевой платформе HTML5.
Если вы ранее создали звуковой поток из файла с помощью функции audio_create_stream() и этот звук больше не нужен, вы можете вызвать эту функцию, чтобы удалить его из памяти. Любые дальнейшие обращения к индексу звука после его уничтожения приведут к ошибке. Следует отметить, что это освободит поток, но на целевой платформе это может не отобразиться в менеджере памяти. Это происходит потому, что GameMaker объединяет ресурсы памяти для предотвращения накладных расходов на выделение памяти, и поэтому память будет оставаться выделенной до тех пор, пока не понадобится для чего-то другого или не будет повторно использована для нового потока.
ПРИМЕЧАНИЕ: Эта функциональность недоступна для целевой платформы HTML5.
Эта функция возвращает, существует ли звук (true) или нет (false). Обратите внимание, что если искомый индекс не был инициализирован ранее, эта функция выдаст ошибку, так как она ищет несуществующие индексы активов. Проверяемый звук может быть либо единичным экземпляром звука (индекс для отдельных воспроизводимых звуков может быть сохранен в переменной при использовании функции audio_play_sound() или audio_play_sound_at() ) или звуковой актив.
С помощью этой функции вы можете получить абсолютное значение глобальной громкости всех звуков и музыки для определенного слушателя. Индекс слушателя по умолчанию равен 0, но вы можете использовать функцию audio_get_listener_info() для получения различных индексов, доступных для целевой платформы. Возвращаемое значение усиления основано на линейной шкале от 0 (тишина) до 1 (полная громкость). Обратите внимание, что на некоторых платформах коэффициент усиления может быть больше 1, хотя значение 1 считается "полной громкостью", а большее значение может привести к обрыву звука.
Эта функция возвращает имя заданного аудиоресурса в виде строки. Значение "index" может быть значением самого ресурса (как видно в Asset Browser) или уникальным значением ID, которое выдается, например, при воспроизведении звука,
audio_play_sound(). Обратите внимание, что возвращаемая строка не совпадает с идентификатором ресурса и не может быть использована для доступа к самому ресурсу, поэтому должна использоваться только для отображения или проверки ошибок.
При добавлении звука в GameMaker он может быть либо потоковым, либо находиться в памяти. Если вам нужно узнать, является ли данный индекс звука потоковым или нет, вы можете использовать эту функцию, которая вернет 1 для потокового звука или 0 для звука в памяти.
использовать эту функцию, которая вернет 1 для потокового звука, 0 для звука в памяти и -1, если произошла ошибка или индекс не указывает на правильный звуковой ресурс.
Эта функция проверяет заданный звук на предмет того, не приостановлен ли он в данный момент. Звук может быть либо одним экземпляром звука (индекс для отдельных воспроизводимых звуков может быть сохранен в переменной при использовании функции audio_play_sound() или audio_play_sound_at() или звуковой актив, в этом случае будут проверены все экземпляры данного звука, и если какой-либо из них находится в состоянии паузы, функция вернет true, в противном случае она вернет false.
Эта функция проверяет заданный звук на предмет того, воспроизводится ли он в данный момент. Звук может быть либо одним экземпляром звука (индекс для отдельных воспроизводимых звуков может быть сохранен в переменной при использовании функции audio_play_sound() или audio_play_sound_at() или звуковой актив, в этом случае будут проверены все экземпляры заданного звука, и если какой-либо из них воспроизводится, функция вернет true, в противном случае она вернет false. Обратите внимание, что эта функция вернет true, если проверяемый звук был ранее приостановлен с помощью функции audio_pause_sound() функция.
С помощью этой функции можно установить абсолютное значение глобальной громкости всех звуков и музыки. Она основана на линейной шкале от 0 (тишина) до любого значения больше 0, хотя обычно максимальная громкость считается равной 1. Все, что больше 1, можно использовать, но в зависимости от используемого звука и платформы, под которую он компилируется, при воспроизведении звука могут возникнуть искажения или обрывы. Эта функция влияет на относительную громкость всех звуков и музыки, воспроизводимых в игре.