サーバーからのレスポンスを受け、表示を更新する
結果表示用のUIを設置する
- Cocos CreatorでMenuSceneを選択する
- PopupPanelを右クリック→Create→2D Objenct→Labelを選択する
-
LoginUserLabelにリネームする - ポップアップの上部に位置を調整する
- インスペクターパネルのstringを空にする
- ヒエラルキーパネルで
LoginUserLabelをコピーする -
LoginStatusLabelにリネームする
LoginUIを書き換える
- importに追記
LoginUI.ts
import { _decorator, Component, EditBox, Label, log, Color } from 'cc'; // LabelとColor追記
- 追加したLabelノードを参照できるようにする
LoginUI.ts
@property(EditBox)
usernameEditBox: EditBox = null;
// 追記 -ここから-
@property(Label)
statusLabel: Label = null;
@property(Label)
loginUserLabel: Label = null;
start() {
// NetworkManagerからの通知を受け取る設定
NetworkManager.instance.node.on('on_login_finished', this.onLoginFinished, this);
}
private onLoginFinished(data: any) {
if (data.success) {
this.statusLabel.string = data.message;
this.statusLabel.color = Color.GREEN;
this.loginUserLabel.string = `ユーザー名: ${data.userData.username}`;
this.usernameEditBox.string = "";
} else {
this.statusLabel.string = "ログイン失敗";
this.statusLabel.color = Color.RED;
}
}
// 追記 -ここまで-
NetworkManagerを書き換える
- 待ち受ける処理を追記
NetworkManager.ts
this.socket = io('http://localhost:3000');
this.socket.on('connect', () => {
log('ID:', this.socket.id);
});
// 追記 -ここから-
this.socket.on('login_response', (data) => {
log('サーバーからの返事:', data);
// LoginUIに結果を伝える(イベント通知)
this.node.emit('on_login_finished', data);
});
// 追記 -ここまで-
game-server/index.jsを書き換える
- ログインしたユーザーの情報をmessageに代入し、レスポンスで返す
index.js
let message = "";
if (!user) {
user = { username: username, level: 1, lastLogin: new Date() };
dbData.users.push(user);
fs.writeFileSync(dbFile, JSON.stringify(dbData, null, 2));
message = "新しいユーザーを作成しました。";
console.log(`新規ユーザー登録: ${username}`);
} else {
message = "既存ユーザーでログインしました";
console.log(`既存ユーザーログイン: ${username}`);
}
socket.emit('login_response', {
success: true,
userData: user,
message: message
});
動作確認をする
- ターミナルでサーバーのプロセスが起動中の場合、
Ctrl + Cで停止させる - サイドプロセスを起動する
node index.js - Cocos CreatorでMenuSceneを立ち上げユーザー情報を送信する
まとめ
これでクライアント⇔サーバー間の通信処理が完成しました。
