| name | fxgl-save-load |
| description | Implement save and load functionality in FXGL — use SaveLoadService to persist and restore game state, write/read DataFile via writeSaveState and readSaveState hooks, manage named save slots, implement auto-save on checkpoints, integrate save/load into the game menu, and handle save file existence checks. Use this skill when adding a save system, implementing slot-based saves, restoring game progress between sessions, or handling checkpoint saves.
|
| triggers | ["save game","load game","SaveLoadService","DataFile","writeSaveState","readSaveState","save slot","checkpoint","persist","game progress"] |
| compatibility | Java 17+, FXGL 21.x. Save files stored in user home ~/.fxgl/{AppTitle}/saves/.
|
| category | fxgl/persistence |
| tags | ["fxgl","java","javafx","persistence","save","load"] |
| metadata | {"author":"fxgl-skills","version":"1.0","fxgl-version":"21.1"} |
| allowed-tools | ["Read","Write","Edit","Bash"] |
FXGL Save & Load System
Setup
settings.addEngineService(SaveLoadService.class);
settings.setMainMenuEnabled(true);
settings.setGameMenuEnabled(true);
settings.setEnabledMenuItems(EnumSet.of(MenuItem.NEW_GAME, MenuItem.SAVE, MenuItem.LOAD));
writeSaveState & readSaveState (core hooks)
Override these two methods in your GameApplication to control what gets persisted:
@Override
public void writeSaveState(DataFile data) {
var bundle = data.getBundle("player");
bundle.put("score", geti("score"));
bundle.put("lives", geti("lives"));
bundle.put("currentLevel", geti("currentLevel"));
bundle.put("playerX", getPlayerEntity().getX());
bundle.put("playerY", getPlayerEntity().getY());
bundle.put("inventory", getInventoryItems());
}
@Override
public void readSaveState(DataFile data) {
var bundle = data.getBundle("player");
set("score", bundle.get("score"));
set("lives", bundle.get("lives"));
set(, bundle.get());
geti();
setLevelFromMap( + level + );
spawn(, bundle.get(), bundle.get());
restoreInventory(bundle.get());
}