[ActionScript3]Flashゲームにおける、時刻演算について

前回は、同期処理・非同期処理について説明させて頂きました。
今回は、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);
}

■まとめ
以上が、クライアント側の環境に寄らずに、時間を扱う方法についてのご紹介でした。
最後までご覧いただき、ありがとうございました。


弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*