Game Maker LanguageGame Maker Language (GML) — інтерпретована мова програмування, розроблений для використання разом з програмою для розробки комп'ютерних ігор: Game Maker . Спочатку підтримка мови була впроваджена в Game Maker Марком Овермарс для доповнення системи кнопкових подій, проте пізніше всі кнопкові події були включені в GML, дозволяючи програмісту уникнути використання кнопкових функцій. GML сильно пов'язаний з середовищем Game Maker. Game Maker організований так, щоб не було необхідності програмування вручну таких речей, як управління подіями, дизайн рівнів і настройка об'єктів. Існує хибна думка, що GML підтримує вставки фрагментів коду на інших мовах, таких як Pascal, Assembler або C ++ . Помилка виникла через часткову схожість синтаксису GML з Pascal і C ++. (Наприклад, оператор «&&» може бути замінений на «and»). БібліотекаВ Game Maker сукупність кнопкових подій утворює бібліотеку. В інтерфейсі програми бібліотеки відображаються як закладки, в яких знаходяться різні іконки подій. Кожне таке подія - це GML- скрипт або функція, яку користувач може використовувати в грі. В поставку Game Maker входять кілька стандартних бібліотек, які містять основні події, які використовуються в більшості ігор. Також існує можливість створювати свої власні бібліотеки, використовуючи Library Maker . У GMS2 вбудований механізм конвертації дій, заданих «кнопками», в код GML і назад, що дозволяє новачкам швидше перейти на GML і покращує розуміння того, як працюють стандартні дії. Синтаксис і семантика GMLGML структурно схожий на мову С своїми блоками коду, викликами функцій, привласненням змінних, синтаксисом операторів і так далі. GML розрізняє оператори і вирази. Наприклад,
не є правильним оператором і викличе помилку. Також, присвоювання змінних - це завжди оператор, і тому не може бути використаний в виразах. Наприклад, наступний рядок завжди генерувала б помилку тому, що вона б обчислювала вкладене вираз як true або false, а потім порівнювала б булевий результат з рядком «Yes» (неправильне порівняння):
Варто пам'ятати, що знак рівності «=» є оператором присвоєння і булевих оператором порівняння в виразах, тоді як в С ++ у виразах пишуть подвійний знак «==». Проте, подвійний знак одно «==» буде правильно інтерпретований в разі використання його в виразах. Використання такого знака в якості оператора присвоєння викличе помилку виконання. GML також підтримує оператори інкремента : g ++; // підтримується як Постфіксний, так і префиксная запис і
те ж саме, що і
Також існують оператори: - =, * =, / =, | =, & = і ^ =. Починаючи з GMS2 введена підтримка тернарного оператора?:. Оператори в GML можуть бути розділені крапкою з комою, однак це не є обов'язковою умовою (хоча і може привести до помилки в деяких специфічних випадках). ФункціїGame Maker містить велику бібліотеку вбудованих функцій для забезпечення основної функціональності. Програміст може створювати свої власні скрипти, які викликаються точно таким же способом, як і функції. Функції малювання в Game Maker використовують Direct3D API . При необхідності Game Maker також дозволяє викликати нативний код платформи за допомогою розширень (DLL на Windows, Java на Android, JS на HTML5 і т. п). ВикористанняЗазвичай, GML не потрібно попередньо оголошувати змінну, як це робиться в деяких інших мовах. Мінлива створюється автоматично, відразу після присвоєння їй жодного значення: foo = "bar"; В Game Maker є багато вбудованих змінних і констант. Кожен екземпляр об'єкта містить багато локальних змінних, наприклад «х» і «у». Також існує кілька вбудованих глобальних змінних, наприклад «score». Ці змінні існують незалежно від примірників об'єктів. Ці змінні не містять префіксу «global.», На відміну від глобальних змінних, зазначених програмістом. Одномірні і двовимірні масиви також підтримуються. Структури данихУ GML є функції для створення і редагування структур даних шести типів: стек, чергу, список, карта (асоціативний масив), пріоритетна чергу і сітка. До сітці, списку і карті також є можливість доступу за допомогою аксессор, що надають синтаксис, подібний масивів:
ТипиУ GML підтримуються наступні типи даних:
Область дії зміннихХоча GML і можна розглядати як об'єктно-орієнтована мова, природа об'єктів і примірників об'єктів в Game Maker створює деякі важливі відмінності в способі розмежування змінних. Існує два типи локальності: локальність в об'єкті і локальність в скрипті (або іншому шматку коду, що міститься в окремому контейнері). Те, що змінна є локальною для екземпляра об'єкта, означає, що змінна прив'язана до конкретного екземпляру об'єкта і ззовні цього примірника може бути використана тільки з приставкою, яка визначає цей екземпляр; то, що змінна є локальною для скрипта, означає, що ця змінна може бути використана тільки в цьому скрипті (і знищується після закінчення скрипта). Далі термін «локальний» означатиме локальність в об'єкті. За замовчуванням, змінна локальна для об'єкта, але не локальна для скрипта, в якому вона використовується. Для того щоб зробити змінну доступною всім екземплярам об'єктів, вона може бути визначена через глобальний простір імен:
Також існує можливість оголошувати глобальні змінні використовуючи ключове слово globalvar:
Але такого способу слід уникати, так як це може легко призвести до складно виявляються помилок, через перетину областей видимості змінних (те ж саме рекомендують і безпосередньо розробники GMS, більше того, можливо, що в майбутньому це ключове слово буде повністю прибрано з мови - в даний момент воно залишено виключно з міркувань забезпечення сумісності). Для того, щоб зробити змінну локальної для скрипта, її потрібно визначати так:
Областю видимості локальної змінної є скрипт, всередині якого вона оголошена. Це має на увазі, що при перемиканні контексту (c використанням with) вона як і раніше буде доступна. наприклад:
Доступ до локальних змінних об'єкта можна отримати, використовуючи ідентифікатор екземпляра об'єкта як приставку
але, тим не менше, таким чином неможливо отримати локальні змінні одного скрипта з іншого, поки вони не передаються як параметри функції. Поточне простір імен об'єкта може бути змінено за допомогою конструкції «with». Наприклад, наступний скрипт, якщо його помістити в подію зіткнення, знищить інший екземпляр об'єкта, залучений в цю подію (зауважимо, що у події зіткнення Game Maker автоматично встановлює змінну other на другий примірник об'єкта, з яким сталося зіткнення):
Розподіл пам'ятіGML автоматично розподіляє пам'ять під змінні на ходу, і використовує динамічні типи, тому присвоювання змінним значення різних типів також можливо. Наприклад, спочатку можна створити целочисленную змінну, а потім змінити її на строкову:
У GML немає спеціального функціоналу, що дозволяє звільняти пам'ять, зайняту під змінну, однак при необхідності можна привласнювати змінної нове значення, меншого розміру. Наприклад, якщо у вас є змінна, в якій зберігається великий текст, то, присвоївши змінної значення порожнього рядка, можна домогтися вивільнення пам'яті. Те ж саме стосується і масивів:
При знищенні об'єкта також знищуються всі змінні, локальні для нього, а будь-які глобальні змінні існують незалежно від них. Тому перевагу потрібно віддавати локальним змінним, а глобальні змінні використовувати тільки в разі реальної необхідності цього. Для зберігання великих обсягів інформації більш ефективно, в Game Maker є підтримка декількох структур даних - таких, як стек, чергу, список, карта, пріоритетна чергу і сітка. Ці структури створюються, модифікуються і знищуються за допомогою вбудованих функцій. Також є функції практично у всіх структурах для сортування даних в них. У деяких випадках більш зручним і ефективнішим буде використання буферів, що дозволяють зберігати довільні дані і є, по суті, просто виділеними шматками пам'яті. Об'єкти і ресурсиВ основі роботи Game Maker з ресурсами лежать унікальні ідентифікатори, які служать для визначення конкретного ресурсу або примірника об'єкта. Ці ідентифікатори можуть бути використані скриптами або функціями для вказівки необхідного ресурсу. Так як створення ресурсів безпосередньо в Game Maker має на увазі вказівку імені, то це ім'я служить константою, що містить ідентифікатор ресурсу. Ідентифікатор конкретного екземпляра зберігається в локальній змінній «id». При динамічному створенні ресурсів, завжди повертається ідентифікатор створеного ресурсу, який може бути використаний в подальшому. Приклади скриптівОсь простий приклад скрипта, який виводить легендарну фразу «Hello, World!»: Ще один приклад, який відображає той же текст, але вже у вікні програми. Зауважте, що за умовчанням Game Maker безперервно перемальовує вікно, тому в звичайному випадку цей код потрібно помістити в подія малювання. Ось фрагмент коду з гри на GML:
Стилі коду можна змішувати. Наприклад, попередній приклад може бути записаний так:
Ось приклад звичайного управління з клавіатури. Функція motion_set приймає два параметри: напрямок (в градусах) і швидкість (пікселів за крок). Виклик цієї функції призведе до зміни вбудованих локальних змінних speed і direction, які використовує Game Maker для переміщення об'єктів (об'єкти також можна зрушувати безпосередньо, використовуючи локальні змінні x і y):
А ось приклад більш складного скрипта для платформної гри. Використовуючи його, гравець може ходити по опуклій поверхні:
КритикаВільний синтаксис GML полегшує створення ігор в певній мірі, але може породити абсолютно нечитабельним код:
Хоча це і не частина мови, ще одним поширеним приводом для критики старих версій Game Maker був сам процес створення EXE-файлів, які складаються з завантажувача і ресурсів GM-файлу. При запуску такої гри, код розбирається на абстрактне синтаксичне дерево (використовувалася інтерпретація коду), що полегшувало декомпіляцію і суттєво збільшувало час завантаження. Однак в більш сучасних версіях (GameMaker: Studio) механізми були змінені, тому немає ніяких проблем ні зі швидкістю запуску, ні з декомпіляцією (декомпілятори для GMS не існує). Література
Див. також
|