Основи мови програмування (Language Basics)
Зміст
Перш ніж ми зможемо описати мову програмування на движку Ren'Py, спочатку ми повинні розповісти про структуру скрипту візуальної новели, створеної на цьому движку. Структура скрипта включає інформацію про те, як файли розбиваються на блоки, що складаються з рядків, і як ці рядки поділяються на елементи, які утворюють оператори.
Файли (Files) [ред.]
Скрипт гри на Ren'Py складається зі всіх файлів, знайдених у папці гри, з розширенням.rpy. Ren'Py розгляне кожен із цих файлів (у порядку Юнікоду) і використовує вміст файлів як скрипт.
Як правило, немає різниці між скриптом, розбитим на кілька файлів, та скриптом, що складається з одного великого файлу. Керування між файлами може передаватися через стрибки (оператор jump) або виклик мітки в іншому файлі. Це робить поділ скрипта на файли справою смаку, оскільки деякі розробники ігор воліють маленькі файли (наприклад, по файлу на подію чи день), тоді як інші воліють один великий скрипт.
Щоб прискорити час завантаження, Ren'Py компілює файли.rpyу.rpycпід час запуску. При зміні файлу.rpyфайл.rpycбуде оновлюватися при запуску Ren'Py. Однак, якщо файл.rpycіснує без відповідного файлу .rpy, він буде використовуватися. Якщо файл.rpyбуде видалено без видалення файлу.rpyc, це може призвести до проблем,
Базовий каталог (Base Directory) [ред.]
Базовий каталог – каталог, що містить усі файли, що розповсюджуються разом з грою (може також містити деякі файли, що не розповсюджуються разом з грою). Такі файли, як README, повинні бути поміщені до базового каталогу, звідки вони будуть поширені.
Базовий каталог створюється усерединідиректорії Ren'Py і називається ім'ям вашої гри. Наприклад, якщо папка з Ren'Py називається "renpy-6.11.2", а ваша гра - "HelloWorld", то базовий каталог цієї гри буде "renpy-6.11.2/HelloWorld".
Директорія гри (Game Directory) [ред.]
Директорія гри майже завжди є папкою під назвою «game» всередині базового каталогу. Наприклад, якщо базовий каталог - "renpy-6.11.2/HelloWorld", то директорія гри буде "renpy-6.11.2/HelloWorld/game".
Однак слід враховувати, щоRen'Py виконує пошук директорій у такому порядку:
- Ім'я файлу, що виконується, без розширення. Наприклад, якщо файл, що виконується, називається moonlight.exe, Ren'Py буде шукати папку з назвою moonlight в базовому каталозі.
- Ім'я виконуваного файлу без розширення та з віддаленим префіксом, що закінчується на _. Наприклад, якщо файл, що виконується, називається moonlight_en.exe, Ren'Py буде шукати папку з назвою en.
- Папки "game", "data" та "launcher", саме в такому порядку.
Проте Ren'Py Launcher коректно розпізнаватиме папки «game» і «data».
Директорія гри містить усі файли, що використовуються у грі. Вона, включаючи всі підкаталоги, сканується Ren'Py на наявність файлів.rpyта.rpyc, і вони об'єднуються для створення скрипту гри. Директорія гри сканується на наявність архівних файлів.rpaі вони використовуються автоматично грою. Нарешті, коли гра вказує шлях до файлу завантаження, він завантажується щодо директорії гри (але врахуйте, щоconfig.searchpathможе змінити це).
Коментарі (Comments) [ред.
Логічні рядки (Logical Lines) [ред.
Файл сценарію розбивається на логічні рядки. У файлі логічний рядок завжди починається з початку рядка.Логічний рядок закінчується в кінці рядка, крім тих випадків, коли:
- Останній символ у рядку – зворотна коса риса.
- Рядок містить дужку, що відкривається ( '(' , '' , або ']' ).
- Кінець рядка виникає під час послідовності символів.
Після того, як логічний рядок закінчується, наступний логічний рядок починається з початку наступного рядка.
Більшість операторів мовою Ren'Py складаються з одного логічного рядка, тоді як деякі оператори складаються з кількох рядків.
Порожні логічні рядки ігноруються Ren'Py.
Відступи та блоки (Indentation and Blocks) [ред.]
Відступи – ім'я, яке ми даємо простору на початку кожного логічного рядка, що використовується для вирівнювання операторів Ren'Py. У Ren'Py відступи повинні складатися лише з прогалин.
Відступи використовуються для групування операторів у блоки. Блок є групою рядків і часто групою операторів.
Правила для поділу файлу на блоки:
- Блок відкривається на початку файлу.
- Новий блок запускається щоразу, коли логічний рядок відступає від попереднього логічного рядка.
- Усі логічні рядки всередині блоку повинні мати однаковий відступ.
- Блок закінчується, коли виявляється логічний рядок з меншим відступом, ніж рядки у блоці.
Відступ дуже важливий для Ren'Py і є причиною синтаксичних або логічних помилок, коли розташований неправильно. У той самий час використання відступів передачі структури блоку дає можливість вказувати цю структуру, не перевантажуючи текст скрипта.
Ініціалізація (Init) [ред.]
Оператор init використовується для виконання блоків операторівRen'Py до того, як скрипт буде запущено. Блоки ініціалізації використовуються для визначення зображень та персонажів, налаштування структури постійних даних гри та персоналізації Ren'Py. Внутрішній код блоків ініціалізації не повинен взаємодіяти з користувачем або змінювати будь-які шари, як і містити оператори say, menu, scene, show та hide, а також викликати будь-яку функцію, яка може виконати вищезазначене.
Оператор init починається з ключового словаinit, за яким слідує необов'язковий покажчик пріоритету та обов'язкова двокрапка. Якщо черговість не задана, вона за замовчуванням вказується як 0. Вказівники пріоритету повинні розташовуватися в діапазоні від -999 до 999. Номери за межами цього діапазону зарезервовані кодом Ren'Py.
Покажчик пріоритету використовується визначення порядку виконання коду в блоці ініціалізації. Блоки ініціалізації виконуються у пріоритетному порядку зростання номерів. У межах файлу скрипта блоки ініціалізації з однаковим пріоритетом виконуються в порядку від верхньої частини файлу вниз. Порядок оцінки послідовності виконання пріоритетних блоків з однаковим пріоритетом між файлами скрипту не визначено.
Блоки ініціалізації виконуються лише один раз, під час спеціальної фази ініціалізації. Коли контроль досягає кінця такого блоку під час нормального виконання коду скрипта, його виконання закінчується. Якщо оператор init з'являється під час нормального виконання файлу скрипта, такий блок ініціалізації не виконується. Натомість управління передається наступному оператору.
Елементи операторів Ren'Py (Elements of Statements) [ред.]
Оператори Ren'Py складаються з кількох основних частин:
Загальний синтаксис для оператора (Common Statement Syntax) [редагувати ]
Більшість операторів Ren'Py мають загальний синтаксис. За винятком оператора say, оператори починаються з ключового слова, яке вводить оператор код. За ключовим словом слідує параметр, якщо оператор його приймає.
Після параметра слідує одна або кілька властивостей. Властивості можуть бути задані в будь-якому порядку, за умови, що кожна властивість задається лише один раз. Властивість починається із ключового слова. Для більшості властивостей за іменем властивості слідує один із наведених вище елементів синтаксису.
Якщо оператор включає блок, рядок закінчується двокрапкою . Інакше рядок просто закінчується.
Синтаксис вираження мови Python (Python Expression Syntax) [ред.]
Багато елементів Ren'Py приймають вирази мови Python. Наприклад, визначення нового персонажа пов'язані з викликом функції Character. Хоча вирази Python дуже ефектні, тільки частина можливостей необхідна для написання базової гри на движку Ren'Py.
Ось короткий огляд виразів Python:
Ціле число Ціле число є числом без десяткової точки.3та42- цілі числа. Речове (дійсне) число Речове число (скорочення від числа з плаваючою точкою) – число з десятковою точкою..5,7.,9.0- це все числа з плаваючою точкою. Рядок (Послідовність символів) Рядки в Python починаються з подвійних (") або одинарних (') лапок і закінчуються тим же символом лапки, з якого почалися. Зворотний сліш використовується, щоб уникнути символу закінчення рядка і для впровадження спеціальних символів, таких як символ розриву Рядок На відміну від рядків у Ren'Py, рядки в Python не можуть бути змінені Істина, Брехня, Відсутність значення Існує три спеціальні значення.True- справжнє значення,False- помилкове значення, аNoneозначає відсутність значення. Кортеж Кортежі використовуються для представлення контейнерів, де кількість елементів має важливе значення. Наприклад, можна було б використовувати двоелементний кортеж (ще називають пара) для позначення ширини та висоти або чотириелементний кортеж (х, у, ширина, висота) для подання прямокутника. Кортежі починаються з круглої дужки, що відкриває (лівої), складаються з нуля або більше виразів мови Python, розділених один від одного комами, і закінчуються правою (закриває) круглою дужкою. Як виняток, одноелементний кортеж повинен мати кому, що йде за елементом. Наприклад:
Під час читання цієї документації, ви можете помітити сигнатуру функції як:
Sample (name, delay, position=(0, 0), **properties) Приклад функції, яка фактично не існує в Ren'Py, але використовується тільки в документації.
- Називається "Sample".
- Має два позиційні параметри: name та delay. У реальній функції типи цих параметрів будуть чітко викладені у документації.
- Має один іменований аргумент, position, який має значення за замовчуванням (0,0).
Оскільки функція закінчується на **properties, це означає, що вона може приймати властивості стилю як додаткові іменовані аргументи. Іншими спеціальними значеннями є *args (означає, що функція приймає довільне число позиційних параметрів) і kwargs (означає, що іменовані аргументи описані в документації).
Джерело [ред.]
Стаття "Language Basics" англійською мовою.