先日、メタボールを用いたシューティングゲームのブログパーツを作成しました。下記のゲームです。

その際、シューティングメタボールブログパーツの説明ページが重くなる現象が発生しました。ヘッダーFlashのメタボールと、ゲーム上のメタボールが同時に存在した際、非常に処理が重くなってしまうというものです。そこでLocalConnectionを用いて、ゲームのスタートボタンが押されたら、ヘッダー上のメタボールが消えるように設定しました。

しかし想定外にウィンドウを複数開かれると、LocalConnectionの変数名がダブってしまってまともに動かなくなりました。例えば、2つ目以降のウィンドウでは、スタートを押してもヘッダー上のメタボールが消えなくなってしまいました。

これを防いだ方法を今回ご紹介します。まず、ブラウザ上で、1970年からの総ミリ秒数を取得します。

JSの場合

var mSecond = new Date().getTime();

PHPの場合

$mSecond = time();

次に、取得されたミリ秒数を、両方のswfのFlashVarsに設定してやります。

<param name="FlashVars" value="mSecond=<?php echo $mSecond; ?>" />

最後に、ヘッダーとゲームのFlash内ASに、FlashVarsから取得された共通の変数を設定します。

//送信側(今回はゲーム側) myLocalConnection = new LocalConnection(); function setLogoVisible(isVisible){ myLocalConnection.send(String(_root.mSecond),"unVisible",{isVisible:isVisible}); }

//受信側(今回はヘッダー側) myLocalConnection = new LocalConnection(); myLocalConnection.connect(String(_root.mSecond)); myLocalConnection.unVisible = function(isVisible){ //(略) };

以上により、LocalConnectionの複数ウィンドウ対策ができました。

HTML5飯