朝は暑い日が多かった最中、ここ数日は気温の低い日も続いている今日この頃、皆様、どうお過ごしでしょうか?
チームタンドリーの北山です。
先日に引き続き下記を用いたマルチプレイの開発の社内研修に参加しています。
- WebGL
- Node.js
- socket.io
本日はF5キーなどを押した時に発生する再読込時にアバターの表示位置を前回の位置と同じ位置に表示する機能の開発に取り組みました。
今回、私は再読込後の画面に表示するアバターには、再読込前の情報を代入する形で同じ位置に表示する方法を考えました。
その為、まずはどのプレイヤーか判断ができるよう、個別に割り振られるIDの情報を引き継がせる事を調査として始めました。
socket.io は再読込、またはブラウザが閉じた時に 'disconnect' というイベントが自動で発生します。
これは接続が切れた段階で、サーバー側のJavaScriptファイルに記載される下記のsocket.ioの接続が終了になるものです。
var io = require('socket.io')(server, options);
io.sockets.on('connection', function(socket) {
~ ここに処理 ~
});
その為、上記の処理内で、仮に下記のようにsocket.ioの仕様のIDの取得を行った場合も、そのIDは破棄されます。
var id = socket.id;
これを再読込時には破棄されるのを防ぐ為、グローバル変数を用いてuserIDを引き継がせる形を考えました。
結果、IDの引継ぎは成功しました。
ただ、別のブラウザを立ち上げた後に他人プレイヤーを追加して操作してみると、同じIDが割り振られている事が分かりました。
これは接続毎に新規のプレイヤーを作成する際に、
- IDも新規に発行を行う処理
- IDを継続する処理
を、if文で上手く分岐できず、両方でグローバル変数で上書きしてしまっているのが原因だと考えています。
現在はこのIDの発行を上手く分岐する方法を模索しています。
上手く分岐できた後は、プレイヤーの情報が入っている連想配列を用いてWebGL側の座標の情報を取得し、再起動時にそのままの位置で表示する形にしていきます。
ここまでご一読いただきまして誠にありがとうございました。
是非、次回もご一読いただけますと幸いです。
何卒、宜しくお願い申し上げます。


コメント
コメントを投稿