ここに題名を入れる

2024年6月18日17寺23分に期限が切れます。

トップ ブレボ 製作者 開発記録



< 戻る

セーブスロット管理を備えたローカルRPG統合システム

本作では,Pythonのpygameを用いたRPGシステムをベースに, Go言語+PostgreSQLによるサーバ連携機能を統合しました. ユーザ登録・ログイン,JWTトークンによる認証管理,セーブデータのスロット保存, サーバ経由でのロード・削除までを一貫して行える設計となっています.


🧩 サーバサイド構成

バックエンドにはGoを採用し,REST APIとして以下のエンドポイントを設けています.

認証はJWTによって保護されており,リクエストヘッダのトークンを通じてユーザ識別を行います. これにより,不正なアクセスを防ぎながらもローカル環境から直接通信できる仕組みを実現しました.

func deleteHandler(w http.ResponseWriter, r *http.Request) {
    username := r.Context().Value("username").(string)
    var req struct { Slot int `json:"slot"` }
    json.NewDecoder(r.Body).Decode(&req)
    db.Exec(context.Background(),
        "DELETE FROM saves WHERE user_id=$1 AND slot=$2", userID, req.Slot)
    json.NewEncoder(w).Encode(map[string]string{"status":"deleted"})
}

🎮 クライアント側(pygame)

ゲーム画面はpygameによって構築され,ログイン画面・オプション・セーブ・ロード画面を全て自作UIで構築しています. 特にコンティニュー画面では,7つのスロットに対応し,サーバから取得したセーブデータの日時を datetime.fromisoformat()で整形して一覧表示する仕組みを導入しました.

また,頻繁なサーバ通信を避けるため,スロット情報は最初に一度だけ更新し, ユーザ操作ごとに必要であれば再読み込みを行う仕組みとしています.

ログイン画面

ログイン画面

ロード画面

ロード画面

セーブ画面

セーブ画面

🗃 セーブ・ロードの流れ

本作では,プレイヤーがゲーム進行状況を自由に保存・復元できるよう, JWT認証 × PostgreSQL × Goバックエンドによるセーブシステムを実装しています. ログインしたユーザーごとにデータを安全に管理できる設計となっており, 以下のようなフローで動作します.

🧩 セーブ処理の流れ

① クライアント側(フロントエンド)
プレイヤーがセーブするスロットを押すと,現在のゲーム状態(位置・アイテム・進行状況など)をJSON形式でバックエンドへ送信します. リクエストにはJWTトークンが付与され,サーバ側で本人確認を行います.

② バックエンド(Go)
受信したリクエストからJWTを解析し,認証済みユーザー名を抽出します. 続いてデータベース上で該当ユーザーのuser_idを取得し, 指定スロット(例:1〜3)にセーブデータを登録します. 既存データがある場合は上書きし,保存完了後には確認用レスポンスを返します.

③ データベース(PostgreSQL)
セーブデータは別サーバ(2台目)のPostgreSQLで管理しています. 現状では片方のサーバがダウンするとセーブ機能が利用できなくなるという課題もありますが, usersテーブルとsavesテーブルを分離することで ユーザー情報とセーブデータを安全に紐付けています. また,savesテーブルではuser_idslotを複合キーとして設計し, スロットごとの独立したデータ管理を実現しました.

🔁 ロード・削除の仕組み

ロード(読み込み)
指定したスロットのデータをデータベースから検索し, JSON形式でクライアントに返します. ゲーム側ではそのまま復元可能な構造となっており, シンプルかつ汎用性の高い設計を実現しています.

削除
ユーザーとスロット番号を基にデータベースから対象レコードを削除します. 削除時にもJWT認証を経るため, 他ユーザーのデータを誤って削除することはありません.

セーブフロー図

💡 今後の展望

現在はユーザ登録・認証・スロット管理が完成しており, 次の段階としてセーブデータ削除のUI統合と,アカウント管理機能の強化を予定しています.