サーバーにデータを保存する
PacketTypeに定数を追加する
- assets/scriptsのPacketType.tsを修正
PacketType.ts
export enum PacketType { // ... 既存のLOGIN系 ... SAVE_SCORE_REQUEST = 'save_score_request', SAVE_SCORE_RESPONSE = 'save_score_response', } - game-serverのPacketType.jsを修正
PacketType.js
const PacketType = { // ... 既存のLOGIN系 ... SAVE_SCORE_REQUEST: "save_score_request", SAVE_SCORE_RESPONSE: "save_score_response", };
サーバーでスコアを受け取って保存する
game-server/index.js
// ...
socket.on(PacketType.SAVE_SCORE_REQUEST, (data) => {
const { username, score } = data;
const dbData = JSON.parse(fs.readFileSync(dbFile));
let user = dbData.users.find((u) => u.username === username);
if (user.highScore === undefined) user.highScore = 0;
let isUpdated = false;
if (score > user.highScore) {
user.highScore = score;
isUpdated = true;
}
fs.writeFileSync(dbFile, JSON.stringify(dbData, null, 2));
console.log(
`スコア保存: ${username} - 今回:${score} (Best: ${user.highScore})`
);
socket.emit(PacketType.SAVE_SCORE_RESPONSE, {
success: true,
highScore: user.highScore,
});
});
Cocos側に送信メソッドを追加する
NetworkManager.ts
this.socket.on(PacketType.LOGIN_RESPONSE, (data) => {
log('サーバーからの返事:', data);
this.node.emit('on_login_finished', data);
});
// 追記 -ここから-
this.socket.on(PacketType.SAVE_SCORE_RESPONSE, (data) => {
if (data.success) {
log(`サーバーにスコア保存完了!現在のハイスコア: ${data.highScore}`);
}
});
// 追記 -ここまで-
NetworkManager.ts
public sendLoginRequest(username: string) {
if (this.socket) {
this.socket.emit(PacketType.LOGIN_REQUEST, { username: username });
} else {
log("エラー: サーバーと接続できていません");
}
}
// 追記 -ここから-
public saveScore(username: string, score: number) {
this.socket.emit(PacketType.SAVE_SCORE_REQUEST, { username, score });
}
// 追記 -ここまで-
GameManeget.tsを修正する
GameManeget.ts
import { _decorator, Component, Node, Label, director } from 'cc';
const { ccclass, property } = _decorator;
import { NetworkManager } from './NetworkManager'; // 追記
GameManeget.ts
public finishGame() {
// ... 表示処理 ...
// サーバーに送信 (仮にユーザー名を'Player1'としていますが、実際はログイン時の名前を使います)
const netManager = find("NetworkManager").getComponent(NetworkManager);
netManager.saveScore("Player1", this.score);
}
まとめ
これでサーバーにスコアの保存までできるようになりました。
まだログイン中のユーザーをGameSceneで保持していないので、また別の機会で実施します。