# Zapisy w chmurze w grach PlayDrop

Zapisuj i wczytuj postępy graczy przez sdk.me.appData i sdk.me.updateAppData, dla gości i zalogowanych, z zasadami zapisu, podglądów i gry offline.

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

Zapisy w chmurze przechowują postępy każdego gracza w twojej grze w PlayDrop, więc idą za nim ze strony internetowej do aplikacji. Przechowywany jest jeden obiekt JSON na gracza i grę; nie jest potrzebny żaden serwer ani pokój wieloosobowy.

## Odczyt i zapis

Po `init()` `sdk.me.appData` to zapisana migawka: `{ data, seq, ts_event, ts_arrival }` albo `null` przed pierwszym zapisem. Odczytaj swój obiekt z `data`. Zapisuj cały obiekt przez `updateAppData`, które zwraca zapisaną migawkę i aktualizuje `sdk.me.appData`.

```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
}
```

- Każdy zapis zastępuje cały zapisany obiekt: zachowaj każde pole, którego nadal potrzebujesz.
- Wykonuj zapisy kolejno, jak powyżej, aby starszy zapis nigdy nie dotarł po nowszym, i nie zatrzymuj kolejki po błędzie.
- Pokazuj „Zapisano” dopiero wtedy, gdy obietnica się spełni. Zmiana `appData.data` w pamięci niczego nie zapisuje.
- `appData` nie ma metod `get`, `set` ani `save`.

## Kiedy zapisywać

Zapisuj w punktach kontrolnych, na końcu poziomów i przy zakupach, a nie w każdej klatce. Nigdy nie zapisuj podczas podglądów ani przechwytywania: zapisuj tylko wtedy, gdy `sdk.host.phase` ma wartość `play`. Utrzymuj zapis mały i wersjonowany własnym polem, takim jak `saveVersion: 2`, aby późniejsza wersja gry mogła go zmigrować.

## Goście i zalogowani gracze

Nie musisz sprawdzać `sdk.me.isLoggedIn` przed zapisem: goście PlayDrop też zachowują swoje zapisy. Gracz bez żadnej sesji przechowuje zapis w pamięci tylko na czas tej wizyty, więc pomyślny zapis nie dowodzi, że dotarł on do chmury. Używaj `isLoggedIn` tylko w funkcjach wymagających prawdziwego konta, takich jak zakupy i hostowany tryb wieloosobowy.

## Offline

W przeglądarce zapisy wymagają połączenia i nie ma kolejki offline: przy błędzie pozwól grać dalej i ponów zapis w następnym punkcie kontrolnym. Hosty obsługujące dane na urządzeniu, takie jak aplikacje PlayDrop działające offline, przechowują zapisy na urządzeniu i synchronizują je po połączeniu z siecią.

## Czym zapisy nie są

Zapisy są prywatne dla jednego gracza i jednej gry. Są oddzielne od [rankingów](https://www.playdrop.ai/pl/create/learn/leaderboards) i [osiągnięć](https://www.playdrop.ai/pl/create/learn/achievements), które mają własne API i pojawiają się w PlayDrop. Stan wspólny dla wielu graczy, taki jak mecz czy świat, należy do [serwera gry](https://www.playdrop.ai/pl/create/learn/game-servers), w kolekcjach MongoDB twojej gry.

## Testuj

Zapisy należą do przesłanej gry. Prześlij wersję prywatną co najmniej raz, a potem testuj z `url` z potwierdzenia przesłania albo z lokalnej ramki Dev opisanej w [publikowaniu z aplikacji AI](https://www.playdrop.ai/pl/create/learn/mcp-publishing).

## Powiązane poradniki

- [Rankingi](https://www.playdrop.ai/pl/create/learn/leaderboards): Zadeklaruj rankingi w catalogue.json, wysyłaj wyniki przez sdk.leaderboards i pokazuj czołówkę oraz sąsiadów gracza. Typy wyników, limity i zasady zmian.
- [Osiągnięcia](https://www.playdrop.ai/pl/create/learn/achievements): Zadeklaruj osiągnięcia standardowe i przyrostowe z ikonami w catalogue.json, odblokowuj je i zgłaszaj postęp przez sdk.achievements.
- [Serwery czasu rzeczywistego](https://www.playdrop.ai/pl/create/learn/game-servers): Uruchom hostowany serwer Colyseus 0.17 z bazą MongoDB dla swojej gry, łącz się z przeglądarki przez SDK, testuj z dwoma graczami i poznaj limity.
