フレームワークなので、ゲーム共通機能として以下の機能を実装します。
- ロビーへ入室
サーバとの接続を開始。
Cometの場合は、HttpServletRequest#startAsync()で取得するAsyncContextオブジェクトを、WebSocketの場合は、クライアントからのSessionオブジェクトを保持する。
ロビーに入室している間は、メンバーのロビーへの入退室、ルームの作成削除通知を受け取ることができる。
- ルームへ入室
入室パターンは以下の3種類。
- ルームを作成して入室する
- 指定したルームに入室する
- 入室可能なルームがあれば入室する、なければ作成して入室する
3は、ゲームでよくあるオートマッチング。
どうマッチングするか(メンバーのレベル等)はゲーム次第なので、拡張できるように考慮が必要。
ルームに入室している間は、メンバーのルームへの入退室、メンバーからの通知を受け取ることができる。
- ルームでの操作
ゲーム次第なので、各ゲームで実装。
チャット機能は共通で使えそうなので、フレームワーク側で実装しておく。
発言があったら、ルームの全メンバーに通知する感じ。
- ルームから退室
ルームから退室して、ロビーに戻る。
- ロビーから退室
サーバとの接続を終了。
Cometの場合は、保持していたAsyncContextオブジェクトをcompleteして破棄、WebSocketの場合は、保持していたSessionオブジェクトを破棄する。
そして、このフレームワークをServletまたはServerEndPointから呼び出す。
そんなイメージで進めていきます。