前回は、同期処理・非同期処理について説明させて頂きました。
今回は、Flashゲームにおける、時刻演算についてご紹介いたします。
■サーバ時刻とクライアント時刻
今回は、Flashで開発するブラウザゲームを例として、説明させて頂きます。
ブラウザゲームでは、不特定多数のクライアントが、各々のPCからブラウザを利用して、ゲームを楽しみます。
この時、PC毎に設定されている時刻は、微妙に異なりますし、中には、他の人とは全然違う時刻設定をしている人もいるでしょう。
<各PCで自由に設定できるもの>
・時間の設定を自分で変更し、たとえば、1時間早い時刻を設定することが出来ます
・タイムゾーンを、日本以外の国にすることが出来ます
このように、クライアント側のPCがどのような設定になっていても大丈夫なように、時間を扱うようにすることは重要なことです。
今回は、クライアント側の環境に寄らずに、時間を扱う方法について説明します。
■ベースとするのはサーバ時刻
クライアント側のPCの時刻をベースにしてしまうと、環境毎に動きが変わってしまいますので、時間を計算する時には、サーバの時刻をベースにします。
たとえば、ログインの通信を行った際に、サーバの時刻を受け取っておき、変数に保持しておきます。
ただし、サーバの時刻を受け取って保持した後は、再度別の通信を行うといった契機が無い限りは、時刻を更新することが出来ません。
このため、クライアント側のPCの時刻も、扱う必要が出てきます。
自由に変更が効いてしまうデータで計算したのでは、クライアントの環境に依存してしまいますので、クライアント側の時刻については、以下のように扱います。
・プログラムが動き始めてからの、経過時間を取り扱います(getTimer関数を使います)
・プログラムが動き始めてからの経過時間は、「タイムゾーン設定」の影響を受けるため、タイムゾーンによる加算値は、加味しないようにします
上記を加味したうえで、ベースとなる時刻保持のプログラムは、AS3では以下のような作りになります。
//サーバから受信した時刻(文字列)を、Date型に変換したうえで、変数に保持する setupDate(changeStringToDate(server_time)); //サーバから受信した時刻(文字列)を、Date型に変換する public static function changeStringToDate(timestamp:String):Date{ //サーバ時刻をNumber型に変換します var time:Number = Date.parse(timestamp); //Date型に変換します var ret:Date = new Date(); ret.time = time; //日本のタイムゾーン var japan:Number = 9*60*60*1000; //クライアントPCのタイムゾーン分を減算し、代わりに日本のタイムゾーン分を加算します ret.time = time + (new Date()).getTimezoneOffset()*60*1000 + japan; //これがサーバ時刻になります return ret; } public static function setupDate(serverDate:Date):void { //サーバ時刻を保持します loginDate = serverDate; //起動してからの経過時間を保持します loginDateClient = getTimer(); //タイムゾーンの分を加味します loginDateClient += (new Date()).getTimezoneOffset()*60*1000; }
■現在時刻を取得する
ベースとなる時刻を保持した後は、その値を利用して、現在時刻を取得するようにします。
現在時刻を取得したいタイミングで、通常であれば、new Date() を用いることと思いますが、代わりに以下のメソッドを利用します。
サーバの時刻 + 経過時間(タイムゾーンを加味)から、
ログイン時の 経過時間(タイムゾーンを加味)を減算することで、
サーバ時刻をベースにした現在時刻を算出しています。
//クライアントの現在時刻を取得する。 public static function getNowTime():Date{ return new Date(loginDate.valueOf() + getTimer() + (new Date()).getTimezoneOffset()*60*1000 - loginDateClient); }
■まとめ
以上が、クライアント側の環境に寄らずに、時間を扱う方法についてのご紹介でした。
最後までご覧いただき、ありがとうございました。
弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。