Я работаю над простой веб-игрой, и мне нужно включить сохранение состояния игры, чтобы пользователи могли выбирать, где они остановились после закрытия браузера или обновления страницы.Игра полностью работает в браузере и использует базовый HTML / CSS / Javascript.
В настоящее время я использую локальное хранилище, поскольку оно обеспечивает простое решение проблемы сохранения состояния игры между сеансами:
function saveGame() {
window.localStorage.setItem('gameData', JSON.stringify(game));
}
function loadGame() {
game = JSON.parse(window.localStorage.getItem('gameData'));
}
Однако мое игровое состояние включает в себя массив функций и массив объектов, содержащих функции.Когда я загружаю предыдущее игровое состояние, эти функции и объекты не загружаются должным образом, потому что функции не могут быть преобразованы в JSON (по крайней мере, не так просто. Я попытался toString () для моих функций и eval () их, ихотя они, похоже, правильно хранятся, я не смог их восстановить. В любом случае это похоже на плохое решение).
Есть ли лучший способ сохранить и восстановить состояние игры, включающее функции?Это проблема модели данных?Кроме того, у меня есть случаи, когда HTML изменяется программно.Может ли HTML быть сохранен и затем повторно загружен, так что измененный HTML остается после перезагрузки?
Редактировать: Добавление игрового объекта для справки:
function Game() {
this.player = new Player();
this.triggerFnSet = new Set();
this.tasks = [];
this.activeTask = undefined;
this.resources = { fame: {},
money: {},
beats: { instrument: "laptop",
clicksPer: 30,
xpPer: 5 },
samples: { instrument: "laptop",
resourcesPer: 25,
requiredResource: "beats",
xpPer: 50 },
notes: { instrument: "keyboard",
clicksPer: 50,
xpPer: 5 },
measures: { instrument: "keyboard",
resourcesPer: 25,
requiredResource: "notes",
xpPer: 50 }
};
this.specialResources = { songs: { instruments: ["laptop", "keyboard"],
resourcesPer: 50,
validResources: ["samples", "measures"],
xpPer: 500 }};
this.instruments = { laptop: { level: 1,
currentTempo: "slow",
tempoSpeeds: { slowest: 25,
slow: 15,
fast: 10,
fastest: 5 },
dropActive: false },
keyboard: { currentNote: undefined,
currentSong: undefined }
};
};
Проблемными полями являются задачи иtriggerFnSet, где задача выглядит следующим образом:
function Task(name, tooltip, checkFn, failFn, startFn, tickFn, finishFn, timeToComplete) {
this.name = name;
this.tooltip = tooltip;
this.checkFn = checkFn;
this.failFn = failFn;
this.startFn = startFn;
this.tickFn = tickFn;
this.finishFn = finishFn;
this.timeToComplete = timeToComplete;
}
И triggerFn выглядит так, как показано ниже, и выполняется каждый тик внутри игры и удаляется из списка после возврата true:
function firstBeatTrigger() {
if (game.player.stats.beats.lifetime >= 1) {
document.getElementById('beats').style.display = "block";
appendToOutputContainer("You've created your first beat. A building block to something greater.");
game.triggerFnSet.add(tenthBeatTrigger);
return true;
}
}