LunoScript — это высокоуровневый, интерпретируемый скриптовый язык, глубоко интегрированный в NewCatroid. Он разработан для предоставления прямого доступа к внутренним компонентам приложения, позволяя создавать сложную логику и кастомизировать поведение, выходя за рамки обычных блоков.
Синтаксис языка основан на Kotlin. Его ключевая особенность — возможность импортировать и напрямую использовать любые Java/Kotlin классы, доступные в classpath проекта.
Этот раздел описывает синтаксис и базовые конструкции самого языка.
Переменные объявляются с помощью ключевого слова var (или val). Типизация динамическая.
var score = 100; // Number (Double)
var gravity = -9.8f; // Float
var playerName = "Alex"; // String
var isActive = true; // Boolean
var data = null; // Null
Основные типы:
Number: Число двойной точности (Double).Float: Число с плавающей точкой. Используйте суффиксfдля литералов:1.0f.String: Строка символов в двойных кавычках.Boolean:trueилиfalse.Null:null, отсутствие значения.List: Упорядоченная коллекция. Литералы:[1, "два", true].Object: Коллекция пар ключ-значение. Литералы:{"name": "Alex", "score": 1000}.NativeObject: Обертка для любого Java/Kotlin объекта, полученного из NewCatroid. Это самый важный тип, с которым вы будете работать.
Для удобной конкатенации строк используйте f-строки, как в Python.
val world = "мир";
val points = 100;
print(f"Привет, {world}! Ваш счет: {points * 2}");
// Вывод: Привет, мир! Ваш счет: 200
- Арифметические:
+,-,*,/,%. - Присваивания:
=,+=,-=,*=,/=,%=. - Сравнения:
==,!=,>,<,>=,<=. - Логические:
&&(И),||(ИЛИ),!(НЕ).
Синтаксис аналогичен Java/Kotlin.
if / else:if (player.health < 25) { print("Низкий уровень здоровья!"); } else { print("Все ок"); }whileцикл:var i = 10; while (i > 0) { i = i - 1; }for...inцикл (для итерации поListилиString):for (item in sprite.scriptList) { print("Найден скрипт!"); }try ... catch ... finallyисключение (для предотвращения вылета ошибок):import com.badlogic.gdx.graphics.Pixmap; try { var pixmap = Pixmap("ababuy"); MakeToast("loaded"); } catch (err) { MakeToast("Failed. line: " + String(err.line) + ", msg: " + String(err.message)); } finally { MakeToast("finished"); }
Объявляйте именованные функции с помощью fun или используйте анонимные (лямбда) функции для передачи в качестве аргументов.
// Обычная функция
fun sayHello(name) {
return f"Привет, {name}!";
}
print(sayHello("Luno"));
// Лямбда-функция
runInUIThread(fun() {
MakeToast("Это сообщение из лямбды!");
});
LunoScript позволяет не только использовать, но и наследовать нативные Java/Kotlin классы. Это почти самая мощная возможность, позволяющая создавать полноценные кастомные блоки прямо из скрипта.
// 1. Импортируем родительский класс
import org.catrobat.catroid.content.bricks.FormulaBrick;
// 2. Наследуемся от него
class MyCustomBrick < FormulaBrick {
// ...
}
Для переопределения методов, которые должны возвращать статичные значения (например, ID ресурсов для UI), используйте блок static. Система автоматически "запечет" эти значения в ваш кастомный класс для максимальной производительности.
static {
// Свойство 'viewResource' будет преобразовано в метод 'getViewResource()'
viewResource = R.layout.brick_set_variable_with_formula;
// 'spinnerId' -> 'getSpinnerId()'
spinnerId = R.id.brick_variable_spinner;
}
Метод init — это конструктор вашего класса. В нем вы можете вызывать методы родительского класса через this. Остальные методы переопределяют поведение.
Этот блок будет работать как обычная его версия, но мы его напишем на LunoScript, и вы сможете поменять что-угодно!
import org.catrobat.catroid.R
import org.catrobat.catroid.content.Sprite
import org.catrobat.catroid.content.bricks.Brick
import org.catrobat.catroid.content.bricks.FormulaBrick
import org.catrobat.catroid.content.actions.ScriptSequenceAction
import org.catrobat.catroid.formulaeditor.Formula
class MyAttachSOBrick < FormulaBrick {
static {
val viewResource = R.layout.brick_gl_attach_so
}
fun init(nameFormula, fileFormula) {
this.addAllowedBrickField(Brick.BrickField.GL_VIEW_NAME, R.id.brick_gl_view_name);
this.addAllowedBrickField(Brick.BrickField.FILE, R.id.brick_gl_so_name);
this.setFormulaWithBrickField(Brick.BrickField.GL_VIEW_NAME, nameFormula);
this.setFormulaWithBrickField(Brick.BrickField.FILE, fileFormula);
}
fun addActionToSequence(sprite, sequence) {
val viewNameFormula = this.getFormulaWithBrickField(Brick.BrickField.GL_VIEW_NAME);
val fileNameFormula = this.getFormulaWithBrickField(Brick.BrickField.FILE);
val factory = sprite.getActionFactory();
val action = factory.createAttachSOAction(sprite, sequence, viewNameFormula, fileNameFormula);
sequence.addAction(action);
}
}
fun NewAttachSOBrick(nameText, fileText) {
val nameFormula = Formula(nameText);
val fileFormula = Formula(fileText);
return MyAttachSOBrick(nameFormula, fileFormula);
}
fun setupMyBrick() {
val myBrick = NewAttachSOBrick("MyGLView", "my_lib.so");
val sprite = GetScope().sprite;
var script = sprite.getScript(0);
script.addBrick(myBrick);
print("Кастомный кирпич создан и готов к работе!");
}
setupMyBrick()
ВАЖНО: После свыполнения у вас в проекте создастся этот блок, ОБЯЗАТЕЛЬНО его удалите перед выходом, иначе проект сломается :/
Забудьте о длинных списках встроенных функций. Современный LunoScript работает через прямой доступ к объектам.
Все начинается с GetScope(). Эта функция — ваша точка входа.
var scope = GetScope();
var sprite = scope.sprite;
var project = scope.project;
LunoScript предоставляет "умный" доступ к нативным объектам:
-
Доступ к свойствам (геттеры без аргументов): Вместо
sprite.getName()илиsprite.getScriptList()вы можете писать как в Kotlin —sprite.nameиsprite.scriptList. LunoScript автоматически вызовет соответствующий геттер.// Правильно и чисто: var spriteName = sprite.name; var looks = sprite.lookList; -
Вызов методов (с аргументами): Если метод требует параметры, вы вызываете его как обычную функцию.
// Получаем первый скрипт объекта var firstScript = sprite.getScript(0); -
Создание объектов: Оператора
newнет. Для создания экземпляра класса просто вызовите его имя как функцию, передав аргументы конструктора.import com.badlogic.gdx.math.Vector2; var position = Vector2(100, 200); // Создает новый объект Vector2
Это самая мощная функция LunoScript. Вы можете импортировать любой класс, доступный в NewCatroid прямиком из Java.
Синтаксис: import полный.путь.к.классу.ClassName;
Пример: Создание и запуск блока "на лету"
// 1. Импортируем класс блока, который хотим создать
import org.catrobat.catroid.content.bricks.ShowToastBlock;
// 2. Получаем текущий спрайт и его основной скрипт
var scope = GetScope();
var sprite = scope.sprite;
// 3. Создаем экземпляр блока. Конструктор ShowToastBlock принимает строку.
var toastBrick = ShowToastBlock("Сообщение создано из кода!");
// 5. Запускаем последовательность действий (для немедленного эффекта)
var sequence = GetSequence(scope);
if (sequence != null) {
toastBrick.addActionToSequence(sprite, sequence);
}
var project = GetScope().project;
// Меняем описание проекта
project.description = "Создано с помощью LunoScript!";
// Добавляем глобальную переменную
var globalVar = UserVariable("xz", "ababuy");
project.addUserVariable(globalVar);
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
// Получаем доступ к файловой системе
var files = Gdx.files;
// Создаем FileHandle для файла во внешней директории
var myFile = files.external("LunoTest/log.txt");
// Записываем в файл
myFile.writeString("Привет из LunoScript!\n", false);
MakeToast("Данные записаны в " + myFile.path);
Любые действия с графикой (GDX) или UI (Android Views) должны выполняться в своих потоках.
runInRenderThread(function): для всего, что связано с рисованием.runInUIThread(function): дляMakeToastи других UI-элементов. (по умолчанию мы запускаемся и так тут)
// НЕПРАВИЛЬНО:
var listener = GetStageListener();
var manager = listener.threeDManager;
manager.createCube("cube");
// вы просто ничего не увидите
// ПРАВИЛЬНО:
runInRenderThread(fun() {
var listener = GetStageListener();
var manager = listener.threeDManager;
manager.createCube("cube");
});
// вы увидите куб на экране, если не добавите свет он будет однотонным
Документировать каждый доступный класс и метод в NewCatroid невозможно.
Ваш главный справочник — это исходный код NewCatroid. посмотреть его можно тут
- Откройте дерево файлов проекта.
- Наиболее интересные для вас пакеты:
org.catrobat.catroid.content— все основные классы (Project,Scene,Sprite,Look,Script).org.catrobat.catroid.content.bricks— все доступные блоки, которые можно создавать. (чтобы узнать имя класса блока - вытащите название блока из code.xml проекта)org.catrobat.catroid.formulaeditor—Formula,UserVariable,UserList.com.badlogic.gdx.*— весь фреймворк GDX (графика, звук, ввод, математика).java.*,kotlin.*— стандартные библиотеки платформ.
Просто найдите нужный класс, посмотрите его публичные методы и конструкторы, и используйте их в своем скрипте.
Старая документация (все функции поддерживаются, но устарели. но прочитать советую)
Примечание: Эти функции оставлены для поддержки старых проектов. В новом коде настоятельно рекомендуется использовать прямой доступ к объектам и их методам, как описано выше.
LunoScript - это легковесный, интерпретируемый скриптовый язык с динамической типизацией, разработанный для встраивания в NewCatroid, написанные на Kotlin или Java. Он позволяет выполнять пользовательский код, управлять объектами приложения и расширять функциональность без перекомпиляции основного кода. Синтаксис LunoScript вдохновлен Kotlin, что делает его интуитивно понятным для Kotlin-разработчиков.
- Динамическая типизация: Типы переменных определяются во время выполнения.
- Kotlin-подобный синтаксис: Привычные конструкции для объявления переменных, условных операторов, циклов и функций.
- Работа с объектами: Поддержка списков, объектов (карт), а также базовых классов и функций, определенных в LunoScript.
- Взаимодействие с Kotlin/Java: Возможность передавать Kotlin/Java объекты в LunoScript (как
NativeObject) и вызывать их методы (через специально определенные нативные функции).
Однострочные комментарии начинаются с //.
// Это однострочный комментарий
var x = 10; // Это тоже комментарий
Переменные объявляются с помощью ключевого слова var. Тип переменной определяется значением, которое ей присваивается.
var message; // Переменная без начального значения (будет `null`)
var count = 10; // count - это Number
var name = "Luno"; // name - это String
var isActive = true; // isActive - это Boolean
count = count + 5;
name = "LunoScript";
LunoScript поддерживает следующие основные типы данных:
Number: Числа (хранятся какDoubleв Kotlin).var pi = 3.14; var integer = 100;String: Строки. Строковые литералы заключаются в двойные кавычки.var greeting = "Hello, World!"; var multiline = "Это\nмногострочная\nстрока.";Boolean: Логические значенияtrueиfalse.var isReady = true; var hasErrors = false;Null: Специальное значениеnull, представляющее отсутствие значения.var data = null;List: Упорядоченные коллекции значений (аналог массивов/списков).var numbers = [1, 2, 3, 4, 5]; var mixedList = [10, "строка", true, null, [100, 200]]; print(numbers[0]); // Выведет: 1 numbers[1] = 20;Object: Коллекции пар "ключ-значение" (аналог карт/словарей). Ключи являются строками. Используются также для представления экземпляров классов.var person = {"name": "Alex", "age": 30, "isDeveloper": true}; print(person.name); // Выведет: Alex print(person["age"]); // Выведет: 30 person.city = "New York"; // Добавление нового поляFunction: Функции, определенные пользователем.Class: Классы, определенные пользователем.NativeObject: Специальный тип для представления "сырых" Kotlin/Java объектов, переданных в LunoScript.NativeCallable: Специальный тип для представления "сырых" Kotlin/Java функций, доступных из LunoScript.
+(сложение, конкатенация строк, конкатенация списков)-(вычитание, унарный минус)*(умножение, повторение строк, повторение списков)/(деление)%(остаток от деления)
var sum = 10 + 5; // 15
var fullName = "Luno" + "Script"; // "LunoScript"
var repeated = "abc" * 3; // "abcabcabc"
var a = [1,2]; var b = [3,4]; var c = a + b; // [1,2,3,4]
var result = (100 - 20) / 2 * 3; // 120
=(присвоить)+=,-=,*=,/=,%=(составное присваивание)
var x = 10;
x += 5; // x теперь 15
==(равно)!=(не равно)>(больше)<(меньше)>=(больше или равно)<=(меньше или равно)
&&(логическое И)||(логическое ИЛИ)!(логическое НЕ)
var age = 25;
var hasLicense = true;
if (age >= 18 && hasLicense) {
print("Можно водить");
}
if (!hasLicense) {
print("Нет прав");
}
var temperature = 25;
if (temperature > 30) {
print("Жарко!");
} else if (temperature > 20) {
print("Тепло.");
} else {
print("Прохладно.");
}
var i = 0;
while (i < 3) {
print("i = " + i);
i = i + 1;
}
Используется для итерации по элементам списка или символам строки.
var fruits = ["яблоко", "банан", "апельсин"];
for (fruit in fruits) {
print(fruit);
}
for (char in "LUNO") {
print("Символ: " + char);
}
Работает аналогично when в Kotlin, но без автоматического "проваливания". break не обязателен для прекращения выполнения case.
var day = "Monday";
switch (day) {
case "Monday":
print("Начало недели");
case "Friday":
print("Почти выходные!");
case "Saturday", "Sunday": // Несколько значений для одного case
print("Выходной!");
default:
print("Будний день.");
}
break;: Прерывает выполнение текущего цикла (while,for) илиswitch.continue;: Переходит к следующей итерации текущего цикла (while,for).
Функции объявляются с помощью ключевого слова fun.
fun greet(name) {
var message = "Привет, " + name + "!";
return message;
}
var myGreeting = greet("Пользователь Luno");
print(myGreeting); // Выведет: Привет, Пользователь Luno!
fun doNothing() {
// Эта функция ничего не возвращает явно (вернет null)
}
print(doNothing()); // Выведет: null
Классы объявляются с помощью ключевого слова class. Конструктор определяется методом init. this используется для доступа к членам экземпляра.
class Point {
fun init(x, y) { // Конструктор
this.x = x;
this.y = y;
print("Точка создана: " + this.x + ", " + this.y);
}
fun move(dx, dy) {
this.x = this.x + dx;
this.y = this.y + dy;
}
fun display() {
return "Point(" + this.x + ", " + this.y + ")";
}
}
var p1 = Point(10, 20); // Создание экземпляра, вызов init
print(p1.display()); // Вызов метода
p1.move(5, -5);
print("p1 после перемещения: " + p1.display());
print("Координата X точки p1: " + p1.x);
p1.color = "red"; // Поля можно добавлять динамически
print("Цвет точки p1: " + p1.color);
- Списки:
myList[index] - Объекты (карты):
myObject.propertyилиmyObject["propertyName"] - Строки:
myString[index](для получения символа)
В большинстве случаев точка с запятой в конце инструкций опциональна. Но рекомендуется ее ставить, дабы избежать недоразумений
LunoScript предоставляет набор встроенных функций для взаимодействия с окружением и выполнения общих задач.
// Формат описания:
// FunctionName(parameter1, parameter2?) -> ReturnType
// Описание функции.
// parameter1: Тип - Описание параметра.
// parameter2 (опционально): Тип - Описание параметра.
// Возвращает: Тип - Описание возвращаемого значения.
-
print(value1, value2, ...)- Выводит одно или несколько значений в лог Android (Log.d с тегом "LunoScript"). Значения разделяются пробелом.
value: Любой тип LunoScript.- Возвращает:
Null.
print("Сообщение", 123, true); -
len(collection)- Возвращает длину строки, количество элементов в списке или количество полей в объекте.
collection:String,ListилиObject.- Возвращает:
Number.
print(len("hello")); // 5 print(len([1, 2, 3])); // 3 print(len({"a":1, "b":2})); // 2 -
typeof(value)- Возвращает строку, представляющую тип значения LunoScript.
value: Любой тип LunoScript.- Возвращает:
String(например, "String", "Number", "List", "Object", "Boolean", "Null", "Function", "Class", "NativeObject", "NativeCallable").
print(typeof(10)); // "Number" print(typeof("abc")); // "String" print(typeof(null)); // "Null" -
String(value)- Преобразует значение в его строковое представление.
value: Любой тип LunoScript.- Возвращает:
String.
var num = 123; var strNum = String(num); // "123" -
Number(value)- Преобразует значение в число.
value:Number,String(пытается распарсить),Boolean(true-> 1,false-> 0),Null(-> 0). Для других типов возвращаетNaN.- Возвращает:
Number.
var numStr = "42.5"; var num = Number(numStr); // 42.5 print(Number(true)); // 1.0 -
Boolean(value)- Преобразует значение в его булево представление (истинность).
value: Любой тип LunoScript.- Возвращает:
Boolean. - Ложными (
false) считаются:null,false, число0, пустая строка"", пустой список[]. Все остальное считается истинным (true).
print(Boolean(0)); // false print(Boolean("hello")); // true print(Boolean([])); // false -
throw(message)- Генерирует ошибку времени выполнения LunoScript с указанным сообщением.
message:String- Сообщение об ошибке.- (Не возвращает значение, прерывает выполнение).
throw("Это кастомная ошибка!");
-
GetAppContext()- Возвращает нативный объект Android
Contextприложения. - Возвращает:
NativeObject(содержащийandroid.content.Context). - Примечание: Этот объект обычно используется как аргумент для других нативных функций, требующих контекст.
- Возвращает нативный объект Android
-
MakeToast(message)- Отображает короткое всплывающее сообщение (Toast) на экране.
message:String- Текст сообщения.- Возвращает:
Null.
MakeToast("Привет из LunoScript!");
-
parseInt(string, radix?)- Преобразует строку в целое число по указанному основанию.
string:String- Строка для парсинга.radix(опционально):Number- Основание системы счисления (от 2 до 36). По умолчанию 10.- Возвращает:
Number(целое число илиNaN, если парсинг не удался).
print(parseInt("101", 2)); // 5.0 (двоичное) print(parseInt("FF", 16)); // 255.0 (шестнадцатеричное) print(parseInt("42")); // 42.0 print(parseInt("hello")); // NaN -
parseFloat(value)- Преобразует значение (обычно строку) в число с плавающей точкой. Пытается имитировать поведение
parseFloatиз JavaScript. value:StringилиNumber. ЕслиNumber, возвращает его же. Другие типы сначала преобразуются в строку.- Возвращает:
Number(число илиNaN).
print(parseFloat("3.14")); // 3.14 print(parseFloat(" -10.5ignored")); // -10.5 print(parseFloat("Infinity")); // Infinity print(parseFloat("text")); // NaN - Преобразует значение (обычно строку) в число с плавающей точкой. Пытается имитировать поведение
-
isNaN(value)- Проверяет, является ли значение
NaN(Not-a-Number). value:Number. Для других типов всегда возвращаетfalse.- Возвращает:
Boolean.
print(isNaN(0/0)); // true print(isNaN(10)); // false print(isNaN("text")); // false (т.к. "text" не Number) - Проверяет, является ли значение
-
isFinite(value)- Проверяет, является ли значение конечным числом (не
Infinity, не-Infinity, неNaN). value:Number. Для других типов всегда возвращаетfalse.- Возвращает:
Boolean.
print(isFinite(100)); // true print(isFinite(1/0)); // false (Infinity) print(isFinite(Number("NaN"))); // false - Проверяет, является ли значение конечным числом (не
-
currentTimeMillis()- Возвращает текущее время в миллисекундах (относительно эпохи Unix).
- Возвращает:
Number.
-
sqrt(number)- Вычисляет квадратный корень числа.
number:Number.- Возвращает:
Number(илиNaNдля отрицательных чисел).
-
abs(number)- Возвращает абсолютное значение (модуль) числа.
number:Number.- Возвращает:
Number.
-
round(number)- Округляет число до ближайшего целого.
number:Number.- Возвращает:
Number.
-
floor(number)- Округляет число вниз до ближайшего целого.
number:Number.- Возвращает:
Number.
-
ceil(number)- Округляет число вверх до ближайшего целого.
number:Number.- Возвращает:
Number.
-
random()- Возвращает случайное число с плавающей точкой в диапазоне от 0.0 (включительно) до 1.0 (исключительно).
- Возвращает:
Number.
-
min(number1, number2, ...)- Возвращает наименьшее из переданных чисел.
numberX:Number. Требуется хотя бы один аргумент.- Возвращает:
Number.
-
max(number1, number2, ...)- Возвращает наибольшее из переданных чисел.
numberX:Number. Требуется хотя бы один аргумент.- Возвращает:
Number.
-
pow(base, exponent)- Возводит число
baseв степеньexponent. base:Number.exponent:Number.- Возвращает:
Number.
- Возводит число
-
Константы:
PI: Число Пи (приблизительно 3.14159).E: Число Эйлера (основание натурального логарифма, приблизительно 2.71828).
-
toUpperCase(string)- Преобразует строку в верхний регистр.
string:String.- Возвращает:
String.
-
toLowerCase(string)- Преобразует строку в нижний регистр.
string:String.- Возвращает:
String.
-
trim(string)- Удаляет пробелы в начале и конце строки.
string:String.- Возвращает:
String.
-
startsWith(string, prefix)- Проверяет, начинается ли строка
stringс подстрокиprefix. string:String.prefix:String.- Возвращает:
Boolean.
- Проверяет, начинается ли строка
-
endsWith(string, suffix)- Проверяет, заканчивается ли строка
stringподстрокойsuffix. string:String.suffix:String.- Возвращает:
Boolean.
- Проверяет, заканчивается ли строка
-
stringContains(string, substring)- Проверяет, содержит ли строка
stringподстрокуsubstring. string:String.substring:String.- Возвращает:
Boolean.
- Проверяет, содержит ли строка
-
replace(string, oldValue, newValue)- Заменяет все вхождения подстроки
oldValueнаnewValueв строкеstring. string:String.oldValue:String.newValue:String.- Возвращает:
String.
- Заменяет все вхождения подстроки
-
split(string, delimiter)- Разбивает строку
stringна список подстрок, используяdelimiterв качестве разделителя. string:String.delimiter:String.- Возвращает:
ListизString.
var parts = split("яблоко,банан,апельсин", ","); // parts будет ["яблоко", "банан", "апельсин"] - Разбивает строку
-
substring(string, startIndex, endIndex?)- Возвращает подстроку из
string, начиная сstartIndex(включительно) доendIndex(исключительно). string:String.startIndex:Number(целое).endIndex(опционально):Number(целое). Если не указан, то до конца строки.- Возвращает:
String.
var text = "Hello Luno"; print(substring(text, 0, 5)); // "Hello" print(substring(text, 6)); // "Luno" - Возвращает подстроку из
-
listPush(list, element1, element2, ...)- Добавляет один или несколько элементов в конец списка
list. Изменяет исходный список. list:List.elementX: Любой тип LunoScript.- Возвращает:
Number(новая длина списка).
- Добавляет один или несколько элементов в конец списка
-
listPop(list)- Удаляет и возвращает последний элемент из списка
list. Изменяет исходный список. list:List.- Возвращает: Удаленный элемент или
Null, если список пуст.
- Удаляет и возвращает последний элемент из списка
-
listShift(list)- Удаляет и возвращает первый элемент из списка
list. Изменяет исходный список. list:List.- Возвращает: Удаленный элемент или
Null, если список пуст.
- Удаляет и возвращает первый элемент из списка
-
listUnshift(list, element1, element2, ...)- Добавляет один или несколько элементов в начало списка
list. Изменяет исходный список. list:List.elementX: Любой тип LunoScript.- Возвращает:
Number(новая длина списка).
- Добавляет один или несколько элементов в начало списка
-
listJoin(list, separator?)- Объединяет все элементы списка
listв одну строку. list:List.separator(опционально):String- Разделитель между элементами. По умолчанию ",".- Возвращает:
String.
var items = ["a", "b", "c"]; print(listJoin(items)); // "a,b,c" print(listJoin(items, "-")); // "a-b-c" - Объединяет все элементы списка
-
listSlice(list, startIndex, endIndex?)- Возвращает неглубокую копию части списка
listотstartIndex(включительно) доendIndex(исключительно). Не изменяет исходный список. list:List.startIndex:Number(целое). Отрицательные значения отсчитываются с конца.endIndex(опционально):Number(целое). Если не указан, то до конца списка. Отрицательные значения отсчитываются с конца.- Возвращает: Новый
List.
var original = [0, 1, 2, 3, 4]; var sliced = listSlice(original, 1, 3); // [1, 2] var slicedToEnd = listSlice(original, 2); // [2, 3, 4] print(original); // [0, 1, 2, 3, 4] (не изменен) - Возвращает неглубокую копию части списка
-
listReverse(list)- Обращает порядок элементов в списке
listна месте (изменяет исходный список). list:List.- Возвращает: Тот же измененный
List.
- Обращает порядок элементов в списке
-
ObjectKeys(object)- Возвращает список строк, представляющих ключи (имена свойств) объекта.
object:Object.- Возвращает:
ListизString.
var user = {"name": "Kate", "age": 28}; var keys = ObjectKeys(user); // ["name", "age"] (порядок может варьироваться) -
ObjectValues(object)- Возвращает список значений свойств объекта.
object:Object.- Возвращает:
List(элементы могут быть разных типов).
var user = {"name": "Kate", "age": 28}; var values = ObjectValues(user); // ["Kate", 28.0] (порядок соответствует ObjectKeys) -
ObjectHasProperty(object, key)- Проверяет, есть ли у объекта
objectсвойство с ключомkey. object:ObjectилиNativeObject(если этоMap).key:String.- Возвращает:
Boolean.
- Проверяет, есть ли у объекта
-
JSON_parse(jsonString)- Преобразует строку
jsonStringв формате JSON в объект или список LunoScript. jsonString:String.- Возвращает:
Object,Listили другой примитивный тип LunoScript (илиNullпри ошибке). - Примечание: Текущая реализация очень базовая и может не поддерживать все возможности JSON. Для сложного JSON рекомендуется обрабатывать его на стороне Kotlin/Java.
- Преобразует строку
-
JSON_stringify(value)- Преобразует значение LunoScript в строку формата JSON.
value: Любой тип LunoScript.- Возвращает:
String. - Примечание: Функции и сложные нативные объекты могут не сериализоваться корректно.
-
Formula(formulaString)- Создает нативный объект "формулы" из строки.
formulaString:String- Строковое представление формулы.- Возвращает:
NativeObject(содержащий объектFormula).
-
RegisterFormula(uniqueName, displayName, defaultParamValues, defaultParamTypes, jsCode)- Регистрирует новую "кастомную формулу" в системе.
uniqueName:String- Уникальное имя для идентификации формулы.displayName:String- Отображаемое имя формулы.defaultParamValues:ListизString- Список строковых значений по умолчанию для параметров. Количество параметров формулы определяется размером этого списка.defaultParamTypes:ListизString- Список строк, представляющих типы параметров (например, "STRING", "NUMBER"). Должен иметь тот же размер, что иdefaultParamValues.jsCode:String- JavaScript код, реализующий логику формулы.- Возвращает:
Null.
RegisterFormula( "myConcat", "My Concatenator", ["prefix_", "_suffix"], // Значения по умолчанию ["STRING", "STRING"], // Типы "return String(p[0]) + 'DATA' + String(p[1]);" );
SetLocalVar(name, value): Устанавливает значение локальной переменной.GetLocalVar(name): Получает значение локальной переменной.DeleteLocalVar(name): Удаляет локальную переменную.DeleteLocalVars(): Удаляет все локальные переменные.GetLocalVarName(index): Получает имя локальной переменной по индексу.GetLocalVarValue(index): Получает значение локальной переменной по индексу.
Функции этой категории возвращают или принимают NativeObject, представляющие соответствующие Kotlin/Java классы из настоящего проекта. Для работы с этими объектами (чтение полей, вызов методов) вам, скорее всего, понадобятся дополнительные нативные функции, специфичные для каждого типа объекта, либо вы будете использовать их как "непрозрачные" указатели для передачи в другие нативные функции.
GetScope()->NativeObject(Scope): Возвращает текущий объект "Scope".GetSprite(scope)->NativeObject(Sprite): Получает спрайт из указанногоscope(тот, в котором запущен блок).GetProject(scope)->NativeObject(Project): Получает проект из указанногоscope(тот, в котором запущен блок).ProjectGetDirectory(project)->String: Получает директорию, в которой расположен проект.ProjectSetDirectory(project, pathString)->Null: Задает директорию проекту.ProjectGetSceneList(project)->ListизNativeObject(Scene): Получает список сцен в проекте.ProjectGetSceneNames(project)->ListизString: Получает список из имен сцен в проекте.ProjectAddScene(project, sceneNativeObject)->Null: Добавляет сцену в проект.ProjectRemoveScene(project, sceneNativeObject)->Null: Удаляет сцену из проекта.ProjectHasScene(project)->Boolean: Проверяет, есть ли сцены в проекте.ProjectGetDefaultScene(project)->NativeObject(Scene): Получает сцену по умолчанию из проекта.ProjectGetUserVariables(project)->ListизNativeObject(UserVariable): Получает переменные проекта (прямая ссылка!).ProjectGetUserVariablesCopy(project)->ListизNativeObject(UserVariable): Получает копию переменных проекта.ProjectGetUserVariable(project, nameString)->NativeObject(UserVariable): Получает переменную из проекта по имени.ProjectAddUserVariable(project, userVariableNativeObject)->Null: Добавляет новую переменную.ProjectRemoveUserVariable(project, nameString)->Null: Удаляет переменную.UserVariable(nameString?, valueString?)->NativeObject(UserVariable): Создает новый объект UserVariable.ProjectGetUserLists(project)->ListизNativeObject(UserList): Получает все списки проекта (прямая ссылка!).ProjectGetUserListsCopy(project)->ListизNativeObject(UserList): Получает все списки проекта.ProjectGetUserList(project, nameString)->NativeObject(UserList): Получает список по имени.ProjectAddUserList(project, userListNativeObject)->Null: Добавляет новый список.ProjectRemoveUserList(project, nameString)->Null: Удаляет список.UserList(nameString?, initialValuesList?)->NativeObject(UserList): Создает новый UserList.initialValuesList- этоListиз LunoScript.ProjectResetUserData(project)->Null: Сбрасывает данные пользователя.ProjectGetSpriteListWithClones(project)->ListизNativeObject(Sprite): Получает список спрайтов (включая клоны).ProjectGetName(project)->String: Получает имя проекта.ProjectSetName(project, nameString)->Null: Задает имя проектаProjectGetDescription(project)->String: Получает описание.ProjectSetDescription(project, descriptionString)->Null: Задает описание.ProjectGetNotesAndCredits(project)->String: ПолучаетNotes and Credits.ProjectSetNotesAndCredits(project, notesString)->Null: ЗадаетNotes and Credits.ProjectGetCatrobatLanguageVersion(project)->String(представление Double): Получает версию языка Catrobat.ProjectSetCatrobatLanguageVersion(project, versionString)->Null: Задает версию языка Catrobat (ожидает строку, конвертируемую в Double).ProjectGetXmlHeader(project)->NativeObject(XmlHeader): Получает XmlHeader проекта.ProjectSetXmlHeader(project, xmlHeaderNativeObject)->NullЗадает XmlHeader проекту.ProjectGetFilesDir(project)->String(путь): Получает путь к директории "Файлов проекта".ProjectGetLibsDir(project)->String(путь): Получает путь к директории "Библиотек" (сейчас они не рабочие).ProjectGetFile(project, fileNameString)->String(путь к файлу): получает файл проекта.ProjectGetLib(project, libNameString)->String(путь к библиотеке): получает библиотеку проекта.ProjectCheckExtension(project, extensionNameString, versionString)->String: проверяет расширение и добавляет его в случае необходимости.ProjectAddFile(project, fileNativeObjectOrPathString)->Null: добавляет файл проекта.ProjectDeleteFile(project, fileOrPathString)->Null: удаляет файл проекта.File(pathString, childPathString?)->NativeObject(java.io.File): Создает объект файла.FilePath(fileNativeObject)->String: Возвращает абсолютный путь файла.Rectangle(xNum, yNum, widthNum, heightNum)->NativeObject(Rectangle): Создает объект Rectangle.ProjectGetScreenRectangle(project)->NativeObject(Rectangle): Получает фигуру экрана.ProjectGetTags(project)->ListизNativeObject(String Tag): получает тэги.ProjectSetTags(project, listOfStringTags)->Null: задает тэги.ProjectGetSceneByName(project, nameString)->NativeObject(Scene): получает сцену по имени.ProjectGetSceneById(project, idString)->NativeObject(Scene) (idString будет преобразован в Int): получает сцену по айдиSpriteGetName(spriteNativeObject)->String: получает имя спрайта.Sprite(nameString)->NativeObject(Sprite): Создает новый Sprite с именем.Sprite(existingSpriteNativeObject, sceneNativeObject)->NativeObject(Sprite): Создает Sprite на основе существующего в сцене.Look(spriteNativeObject)->NativeObject(Look): Создает новый Look для спрайта.SpriteGetLook(spriteNativeObject)->NativeObject(Look): Получает Look спрайта.LookRemove(lookNativeObject)->Null: удаляет образ.LookGetLookData(lookNativeObject)->NativeObject(LookData): получает данные образа.LookGetLookData2(lookNativeObject)->NativeObject(LookData) получает данные хитбокса.LookData(nameString, fileNativeObjectOrPathString)->NativeObject(LookData): Создает LookData.LookDataGetName(lookDataNativeObject)->String: получает имя LookData.LookDataSetName(lookDataNativeObject, nameString)->Null: задает имя LookData.LookDataGetFile(lookDataNativeObject)->NativeObject(File): получает файл образа.LookDataSetFile(lookDataNativeObject, fileNativeObjectOrPathString)->Null: задает файл образа.LookSetLookData(lookNativeObject, lookDataNativeObject)->Null: задает образ.LookSetLookData2(lookNativeObject, lookDataNativeObject)->Null: задает хитбокс.LookGetX(look)/Y/Width/Height/Rotation/Alpha/Brightness/Hue->Number: получает определенные данные обьекта (позиция, ширина / высота, вращение, прозрачность, яркость, цвет).LookGetVisible(look)/LookGetLookVisible(look)->Boolean: показан или спрятан обьект- **
LookSetX(look, value)/Y/Width/Height/Rotation/Alpha/Brightness/Hue/Visible/LookVisible->Null**6 задает определенные данные обьекта (позиция, ширина / высота, вращение, прозрачность, яркость, цвет). SpriteGetScriptList(sprite)->ListизNativeObject(Script): получает список скриптов.SpriteGetLookList(sprite)->ListизNativeObject(Look) получает список образов.SpriteGetSoundList(sprite)->ListизNativeObject(Sound) (Sound еще не добавлен): получает список звуков.SpriteGetUserVariables(sprite)->ListизNativeObject(UserVariable): получает переменные спрайта.SpriteGetUserLists(sprite)->ListизNativeObject(UserList): получает списки спрайта.ActionFactory()->NativeObject(ActionFactory): создает ActionFactory.SpriteGetActionFactory(sprite)->NativeObject(ActionFactory): получает ActionFactory спрайта.SpriteIsClone(sprite)->Boolean: является ли спрайт клоном.SpriteOriginal(sprite)->NativeObject(Sprite) (оригинал, если это клон)SpriteIsGliding(sprite)->Boolean: используется ли блок "скользить" сейчас.SpriteGetAllBricks(sprite)->ListизNativeObject(Brick): получает все блоки.SpriteGetUserVariable(sprite, nameString)->NativeObject(UserVariable): получает переменную спрайта.SpriteAddUserVariable(sprite, userVariableNativeObject)->Null: добавляет переменную спрайта.SpriteAddUserList(sprite, userListNativeObject)->Null: добавляет список спрайта.SpriteGetUserList(sprite, nameString)->NativeObject(UserList): получает список спрайта.SpriteAddScript(sprite, scriptNativeObject, indexNum?)->Null: добавляет скрипт.SpriteGetScript(sprite, indexNumString)->NativeObject(Script): получает скрипт.SpriteRemoveAllScripts(sprite)->Null: удаляет все скрипты.SpriteRemoveScript(sprite, scriptNativeObject)->Null: удаляет скрипт.SpriteIsBackground(sprite)->Boolean: является ли спрайт фоном.ScriptGetBrickList(scriptNativeObject)->ListизNativeObject(Brick): получает блоки скрипта.ScriptRun(script, sprite, sequenceAction)->Null: запускает скрипт (все блоки внутри него).GetSequence(scope)->NativeObject(ScriptSequenceAction): получает текущий SequenceScriptSequenceAction(scriptNativeObject)->NativeObject(ScriptSequenceAction): создает ScriptSequenceActionScriptAddBrick(script, brick, indexNum?)->Null: добавляет блок в скриптScriptRemoveBrick(script, brick)->Null: удаляет блок из скриптаScriptGetBrick(script, indexNumString)->NativeObject(Brick): получает блок из скриптаUserVariableGetValue(userVariable)->String(представление значения): получить значение переменнойUserVariableSetValue(userVariable, valueString)->Null: задать значение переменнойBrick(brickTypeNameString, parametersList)->NativeObject(конкретный Brick): Создает экземпляр блока по его имени и списку параметров LunoScript.RunBrick(brickNativeObject, spriteNativeObject, sequenceActionNativeObject)->Null: Запускает блок (вызываетaddActionToSequence).
КлассФункция
например:
Sprite.getScriptList(sprite) (из Kotlin) в LunoScript будет SpriteGetScriptList(sprite)
Для класса Brick() доступны пока-что не все блоки NewCatroid. поэтому вот список доступных с их параметрами:
ShowToastBlock(messageString): Показывает всплывающее сообщениеAddEditBrick(nameString, valueString): Добавляет текстовое поле в диалогAddItemToUserListBrick(valueString): Добавляет предмет в списокArduinoSendDigitalValueBrick(nameString, valueString): Посылает цифровой сигнал на ArduinoArduinoSendPwmValueBrick(nameString, valueString): Посылает аналоговый сигнал на ArduinoAskBrick(textString, variableUserVariable): Открывает диалог (как блок "Спросить")AskGemini2Brick(promptString, modelString, variableUserVariable): Спрашивает GeminiAskGPTBrick()СЛОМАН!CloneBrick(): Клонирует спрайт
В будущем этот список будет расширяться
Удачи в экспериментах!
Последнее обновление документации: 8.11.2025, версия NewCatroid: 2.1.1b2