JSON
PlaydateにおけるJSON(JavaScript Object Notation)は、ゲームデータのセーブ、設定ファイルの保存、あるいはレベルデータの管理などにおいて、最も標準的かつ軽量なデータ形式として利用されています。
Playdate SDKのコア言語であるLuaには標準でJSONライブラリが含まれていませんが、
Playdate SDKが非常に強力で高速な
playdate.datastore (
データストア) を提供しているため、開発者はこれを利用するのが一般的です。
概要
1. PlaydateにおけるJSONの基本
Playdateでは、Luaのテーブル(Table)とJSONファイルを相互に変換して処理します。
- Lua Table
- ゲーム内で扱うデータ構造(配列や連想配列)。
- JSON
- ファイルとして保存・読み込みするためのテキスト形式。
| カテゴリ |
関数 |
説明 |
| データストア |
playdate.datastore.write(table, [filename]) |
テーブルをJSONとしてデータフォルダに保存 |
| playdate.datastore.read([filename]) |
JSONファイルを読み込み、Luaテーブルに変換 |
| JSONのパース |
json.encode(table) |
テーブルをJSON文字列に変換(ファイル書き出しはしない) |
| json.decode(string) |
JSON文字列をテーブルに変換 |
2. データの保存と読み込み(実践)
Playdateでのセーブデータ管理の典型的な流れは以下の通りです。
- データの保存(Write)
- playdate.datastore.write() を使うと、自動的に .json 拡張子が補完され、デバイス内のゲーム専用データ領域に保存されます。
local gameData = {
playerName = "Hero",
level = 5,
highScore = 1200,
items = {"Sword", "Shield", "Potion"}
}
-- "saveData.json" という名前で保存
playdate.datastore.write(gameData, "saveData")
- データの読み込み(Read)
- 保存されたデータがない場合は nil を返すため、初期値の設定(デフォルト値)を考慮するのがコツです。
local loadedData = playdate.datastore.read("saveData")
if loadedData then
print(loadedData.playerName) -- "Hero"
else
-- ファイルが存在しない場合の初期処理
print("No save data found.")
end
3. Playdate特有の注意点
- ファイルの保存場所
- セキュリティと管理の都合上、読み書きできる場所は限定されています。
- シミュレータ: Documents/PlaydateSDK/Disk/Data/<BundleID>/
- 実機: 各ゲーム専用のサンドボックス内
- 型の変換(Lua ↔ JSON)
- LuaとJSONではデータ構造に少し差異があるため、変換時に注意が必要です。
- 空のテーブル: Luaの {} は、JSONでは [] (配列) になるか {} (オブジェクト) になるか文脈に依存します
- インデックス: Luaは 1 から始まりますが、JSON(および他言語)は 0 から始まるのが一般的です。SDKが適切にラップしてくれますが、外部ツールで作成したJSONを読み込む際は構造を確認してください
- 高速なエンコード/デコード
- playdate.datastore はC言語レベルで最適化されているため、純粋なLuaスクリプトでJSONをパースするよりも遥かに高速です。
- 大きなレベルデータ(マップタイルなど)を扱う場合も、極力SDK標準の関数を使うことが推奨されます。
4. 外部JSONファイルの利用
外部ツール(Tiled Map Editorなど)から書き出したJSONを読み込みたい場合は、 playdate.datastore.read() ではなく、プロジェクト内にリソースとして含めた上で読み込みます。
- Tips
- 読み取り専用のリソースとしてJSONを扱う場合は、 playdate.file.open() でファイルを開き、 json.decode() に渡す処理が必要になる場合があります。
関連ページ
最終更新:2026年04月30日 07:54