Написання програм на mJS (JavaScript)

Keira має вбудовану віртуальну машину mJS — легковісний рушій JavaScript, розроблений для мікроконтролерів. Це дозволяє писати та виконувати програми на JavaScript прямо з SD-картки, без необхідності компіляції чи перепрошивання Лілки.

Попередження

mJS підтримує підмножину ECMAScript (ES6). Деякі можливості повноцінного JavaScript (наприклад, class, async/await, import) не підтримуються. Детальніше: https://github.com/cesanta/mjs

Приклад програми

Модулі завантажуються автоматично — не потрібно писати жодних require(...) чи import. Ось приклад простої програми на mJS:

 1// Заповнюємо екран чорним кольором
 2display.fill_screen(display.color565(0, 0, 0));
 3
 4// Виводимо текст "Hello, world!" на екран
 5display.set_cursor(0, 32);
 6display.print("Hello, world!");
 7display.queue_draw();
 8
 9// Чекаємо та завершуємо
10util.sleep(3);

Ви можете зберегти цей код у файл з розширенням .js на SD-картці, а потім виконати його, обравши його в браузері SD-картки.

Повний перелік доступних модулів та їх функцій можна знайти в розділі mJS API.

Відмінності від Lua API

Модулі mJS мають такий самий набір функцій та назви, як і Lua API, з деякими відмінностями:

  • Синтаксис: JavaScript замість Lua (let замість local, // замість --, фігурні дужки замість end тощо).

  • Масиви: Починаються з індексу 0 (а не з 1, як у Lua).

  • Немає автоматичних колбеків: На відміну від Lua, де існують lilka.init(), lilka.update() та lilka.draw(), у mJS скрипт виконується послідовно від початку до кінця. Для ігрового циклу використовуйте while або for з ручними викликами display.queue_draw() та controller.get_state().

  • Модуль console: Замість print() використовуйте console.print().

Приклад ігрового циклу

 1let running = true;
 2
 3while (running) {
 4    // Зчитуємо стан кнопок
 5    let state = controller.get_state();
 6    if (state.a.just_pressed) {
 7        running = false;
 8    }
 9
10    // Малюємо
11    display.fill_screen(colors.black);
12    display.set_cursor(0, 32);
13    display.print("Press A to exit");
14    display.queue_draw();
15
16    // Невелика затримка
17    util.sleep(0.016);
18}