Структура для обмена данными между областями

Я только учусь JS и пытаюсь написать простую игру. Поэтому я создал базовую структуру, которая должна выглядеть примерно так (псевдо-код C++):

if (!game.game-stage)
    game.ResetGame(); // initialize game objects
if (player1.score > MAX_SCORE || player2.score > MAX_SCORE)
    game.end-round(); stop(1000);
else
    game.Update();
game.Render();

Затем я пытаюсь написать это в JS:

function main() {
    if (gamest != true) {
        resetgame();
        gamest = true;
    }
    /* UPDATE SECTION */
    if (score1 > 9 || score2 > 9) {
        endround();
        setTimeOut(update, 1000);
    }
    else {
        update();
    }
    /* RENDER SECTION */
    draw();
}

Другие функции в main() теперь имеет доступ к объектам, инициализированным в resetgame() функция. Другая проблема, которая появляется в том, что setTimeOut(update, 1000) не работает, когда я поставил весь объект в глобальную область для тестирования.

resetgame() Процедура выглядит примерно так:

function resetgame() {
    var paddle1 = new GameObject(20, 80, "LEFT");
    [...]

Эта структура имеет какой-то смысл?

1 ответ

Решение

Эта проблема

function main() {
    if (gamest != true) {
        resetgame();
        gamest = true;
    }

resetgame() функция связана внутри if объем. Это приводит к уничтожению объектов, инициализированных внутри этой области, после того, как программа покидает эту область.

Закрытие решение

Чтобы использовать концепцию замыкания, нам нужно:

  • переменная
  • тело логики, с которой связана переменная
  • среда, которая сохраняется во время создания замыкания, это для свободных переменных, которые существуют в теле, которые будут связаны при оценке переменной замыкания.

Так что в этом примере нам понадобится куча свободных объектов внутри function main() тело для сохранения данных, оцененных resetgame(), Одним из вариантов будет передача всех этих объектов с помощью аргументов resetgame() и переписать его, чтобы инициализировать все аргументы для его внутренних объектов.

Простое решение ООП

В игре у нас обычно много объектов, поэтому концепция замыкания становится сложной и занимает много памяти. Лучшим решением будет заключить все основные функции в один объект, чтобы мы могли легко обмениваться данными и передавать объект везде, где нам нужно. Это позволило нам создать простую в управлении структуру, например:

var App = {
    Load: function() {
       this.frame = new Frame();
    },
    // UPDATE
    Update: function() {
       this.frame.updatePosition();
    },
    // RENDER
    Render: function() {
       this.frame.draw();
    }
};

function Main() {
    var app = App;
    app.Load();
    setInterval(MainLoop(app), 1000/60);
}

function MainLoop(app) {
    // main application render
    app.Render();
    // main application update
    app.Update();
}

Кто-то напомнит мне об этом вопросе. Я еще не эксперт JS, но для этого приложения я нахожу свое решение. Я знаю, что это можно решить лучше, но это решение достаточно для маленькой игры, которую я писал. Но если у кого-то получится лучше, я буду рад услышать ваше мнение.

Другие вопросы по тегам