main.js 2,7 КБ
Newer Older
Nikitos's avatar
Nikitos включено в состав коммита
1
2
3
4
5
6
7
// ===========================================================================
// Демо-проект Russiano2D.
//
// Точка входа: подключает модули демо и открывает меню-лаунчер. Каждый модуль
// демо экспортирует install($) и регистрирует свою сцену; всё остальное (мир,
// камера, звук, сохранения, отладка) уже есть в $.
//
Nikitos's avatar
ф    
Nikitos включено в состав коммита
8
9
10
11
// Демо три, и каждое показывает свой слой движка: платформер — Box2D и анимацию,
// «Ведьма» — свет, частицы и волны врагов, новелла — $.timeline и RmlUi.
// У каждого в папке лежит README: что внутри и как собрать такое же.
//
Nikitos's avatar
Nikitos включено в состав коммита
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Запуск:
//   ./build/russiano2d --game demos
//   ./build/russiano2d --game demos --scene shooter25d
//
// Добавить своё демо: положить demos/имя/index.js с экспортом install($)
// и дописать строку в MODULES — кнопка в меню появится сама.
//
// Импорт динамический и через try: одно сломанное демо не должно лишать
// пользователя остальных — в меню просто не появится его кнопка, а причина
// уйдёт в журнал.
// ===========================================================================

const MODULES = [
    './launcher.js',
    './platformer/index.js',
Nikitos's avatar
Nikitos включено в состав коммита
27
    './shooter_witch/index.js',
Nikitos's avatar
ф    
Nikitos включено в состав коммита
28
    './russi_vn/index.js',
Nikitos's avatar
Nikitos включено в состав коммита
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
];

$.ready(async ($) => {
    // Общие настройки демо-проекта.
    $.gfx.color('#0e1420');
    $.sound.volume(0.8);
    $.scene.transition('fade', 250);

    for (const path of MODULES) {
        try {
            const module = await import(path);
            if (typeof module.default !== 'function') {
                $.log(`демо ${path}: нет экспорта install($) — пропускаю`);
                continue;
            }
            module.default($);
        } catch (e) {
            $.log(`демо ${path} не загрузилось: ${e}`);
        }
    }

    // --scene <имя> открывает демо сразу, минуя меню (нужно тестам и агенту).
    const start = engine.startScene || 'launcher';
    if (!$.scene.has(start)) {
        $.log(`сцена "${start}" не зарегистрирована — открываю меню`);
        $.scene.load('launcher', { transition: 'none' });
        return;
    }
    $.scene.load(start, { transition: 'none' });
});