# Cloudsaves voor PlayDrop-games

Sla voortgang op en laad die met sdk.me.appData en sdk.me.updateAppData, voor gasten en ingelogde spelers, met regels voor opslaan, voorbeelden en offline.

Source: https://www.playdrop.ai/nl/create/learn/cloud-saves

Cloudsaves bewaren de voortgang van elke speler in je game op PlayDrop, zodat die meegaat van de website naar de apps. Per speler en game wordt één JSON-object opgeslagen; je hebt geen server of multiplayerkamer nodig.

## Lezen en schrijven

Na `init()` is `sdk.me.appData` de opgeslagen momentopname: `{ data, seq, ts_event, ts_arrival }`, of `null` vóór de eerste save. Lees je object uit `data`. Schrijf het hele object met `updateAppData`; dat retourneert de opgeslagen momentopname en werkt `sdk.me.appData` bij.

```js
const sdk = await playdrop.init();
let progress = { level: 1, coins: 0, ...(sdk.me.appData?.data ?? {}) };
let queue = Promise.resolve();

// Resolves with the saved snapshot; rejects when the save failed.
function save(changes) {
  progress = { ...progress, ...changes };
  const snapshot = { ...progress };
  const attempt = queue.then(() => sdk.me.updateAppData(snapshot));
  queue = attempt.catch(() => {}); // a failed save must not block the next one
  return attempt;
}

try {
  await save({ level: 2 });
  showSaved();
} catch (error) {
  showSaveError(); // progress stays in memory; the next save sends it again
}
```

- Elke schrijfactie vervangt het volledige opgeslagen object: behoud elk veld dat je nog nodig hebt.
- Voer schrijfacties na elkaar uit, zoals hierboven, zodat een oudere save nooit na een nieuwere aankomt, en houd de wachtrij draaiende na een fout.
- Toon ‘Opgeslagen’ pas nadat de promise is geslaagd. `appData.data` in het geheugen wijzigen slaat niets op.
- `appData` heeft geen methoden `get`, `set` of `save`.

## Wanneer opslaan

Sla op bij checkpoints, aan het einde van levels en bij aankopen, niet elk frame. Sla nooit op tijdens voorbeelden of opnames: schrijf alleen als `sdk.host.phase` gelijk is aan `play`. Houd een save klein en geef hem een versie met een eigen veld, zoals `saveVersion: 2`, zodat een latere versie van de game hem kan omzetten.

## Gasten en ingelogde spelers

Je hoeft `sdk.me.isLoggedIn` niet te controleren voordat je opslaat: PlayDrop-gasten behouden hun saves ook. Een speler zonder enige sessie houdt de save tijdens dat bezoek in het geheugen, dus een geslaagde schrijfactie bewijst niet dat de save de cloud heeft bereikt. Gebruik `isLoggedIn` alleen voor functies die een echt account nodig hebben, zoals aankopen en gehoste multiplayer.

## Offline

In een browser hebben saves een verbinding nodig en is er geen offlinewachtrij: speel door bij een fout en probeer het opnieuw bij het volgende checkpoint. Hosts die ondersteuning voor apparaatgegevens aangeven, zoals PlayDrop-apps die offline werken, bewaren saves op het apparaat en synchroniseren ze zodra er verbinding is.

## Wat saves niet zijn

Saves zijn privé voor één speler en één game. Ze staan los van [ranglijsten](https://www.playdrop.ai/nl/create/learn/leaderboards) en [prestaties](https://www.playdrop.ai/nl/create/learn/achievements), die hun eigen API's hebben en op PlayDrop verschijnen. Gedeelde gegevens tussen spelers, zoals een wedstrijd of een wereld, horen op een [gameserver](https://www.playdrop.ai/nl/create/learn/game-servers) in de MongoDB-collecties van je game.

## Testen

Saves horen bij een geüploade game. Upload minstens één keer een privéversie en test daarna via de `url` uit het uploadbewijs of via het lokale Dev-frame dat wordt beschreven in [publiceren vanuit je AI-app](https://www.playdrop.ai/nl/create/learn/mcp-publishing).

## Gerelateerde gidsen

- [Ranglijsten](https://www.playdrop.ai/nl/create/learn/leaderboards): Declareer ranglijsten in catalogue.json, verstuur scores met sdk.leaderboards en toon de top en de buren van de speler. Scoretypen, limieten en updateregels.
- [Prestaties](https://www.playdrop.ai/nl/create/learn/achievements): Declareer standaard- en incrementele prestaties met iconen in catalogue.json, ontgrendel ze en meld voortgang met sdk.achievements.
- [Realtime gameservers](https://www.playdrop.ai/nl/create/learn/game-servers): Draai een gehoste Colyseus 0.17-server met een MongoDB-database voor je game, verbind vanuit de browser met de SDK, test met twee spelers en ken de limieten.
