0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【18日目】25日間でCocos Creatorでゲームを作る

0
Posted at

サーバーにデータを保存する

PacketTypeに定数を追加する

  1. assets/scriptsのPacketType.tsを修正
    PacketType.ts
    export enum PacketType {
      // ... 既存のLOGIN系 ...
      SAVE_SCORE_REQUEST = 'save_score_request',
      SAVE_SCORE_RESPONSE = 'save_score_response',
    }
    
  2. 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で保持していないので、また別の機会で実施します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?