Структура для обмена данными между областями
Я только учусь 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, но для этого приложения я нахожу свое решение. Я знаю, что это можно решить лучше, но это решение достаточно для маленькой игры, которую я писал. Но если у кого-то получится лучше, я буду рад услышать ваше мнение.