-最終更新日 2000/11/6-

自作Shockwaveゲームにハイスコアランキングを搭載したい!
せっかくブラウザで遊べるゲームを作ったのだから、どうせなら見ず知らずのプレイヤー同士スコアで競ってもらいたいというのは、ゲーム制作者としては当然の欲求でしょう。 本来このような場合は、ハイスコア登録用のCGIを用意し、ShocwaveからこのCGIを呼び出すという方式が一般的でした。 ただこの一般的な方式を利用するにはスコア登録のCGIが必要であり、かつCGIの使えるプロバイダ契約が必要と、若干敷居が高いことも否めません。
 このような場合に、力強い味方となってくれるのが「NewGameWeb」です。この「NewGameWeb」に登録すると、登録したゲーム用の送信モジュールが発行されますので、そのモジュール読み込み用スクリプトを埋め込んだHTMLページにShockwaveを張り付けてやり(むしろ、Shockwave張り付けページにそのモジュール読み込み用スクリプトを追記するという方が近いでしょうが)、後はスコア登録のさいにモジュールに指示を出すだけでインターネットハイスコアランキングが可能になります。
 こう書くと、非常にややこしいようにも思えますが、実際には至って簡単です。それでは実際の作業をLingoスクリプトを交えてご紹介いたしましょう。


Director(Shockwave)によるスコア登録
1) まず、ShockwaveゲームをNewGameWebに登録します。
 実際にエントリーされるのは、全て準備が完了してからですので、取りあえず仮登録で構いません。
2) 登録した際に発行された「送信モジュール」のスクリプトをShockwaveを表示するHTMLにペーストします。
 送信モジュールのコメントに詳しく書かれていますが、この作業は単純にコピー&ペーストで完了いたします。
3)Shockwaveより、スコア登録したいタイミングで以下のJavaScriptを実行します。
  • GRS_score = score; //得点(integer)
  • GRS_sendScore(); //スコア送信する

  注)実際にLingoでJavaScriptを呼び出す方法は次項参照のこと

LingoからJavaScriptを呼び出す方法
基本理念
ハイスコアを登録するには、JavaScript側の変数「GRS_score」にスコアを代入し、JavaScript側のメソッド「GRS_SendScore()」 を呼び出せば名前入力、E-MAIL入力、コメント入力などのフォームは自動で表示されます。言い換えれば、CGIなどを利用してハイスコア登録するときには 必要不可欠であった名前入力画面などをShockwave側に用意する必要はないということになります。極端な話、現存のShockwaveゲームに このハイスコアランキング機能を付加する場合、最低限「GRS_score」設定と「GRS_sendScore()」呼び出し機能を追加してやればそれで事足ります。 実際のLingoコードに直してみれば、僅か1〜2行の追加でハイスコアランキングが実装出来てしまうのです。
1) JavaScript側に関数を用意する。
 この方法は、JavaScript側に'GRS_score'設定と'GRS_sendScore()'呼び出しの関数を用意してやり、  Lingoからはその関数を呼び出すだけで済ます方法です。追加必要なLingoコードはまさに1行です。まず、Shockwaveを  表示するHTMLに以下の記述を追加して下さい。

  <script language = "JavaScript">
   <!--
    function setScore(val){
     GRS_score=val;
     GRS_sendScore();
    }
   //-->
  </script>

これでHTML側にJavaScriptの関数を用意出来ました。あとは、Shockwave内部でスコア登録したいタイミングで(登録ボタンを押したり、ゲーム終了時など) スコアを引数にしてこの関数呼び出せばOKです。そこでLingo辞書を見てみると、外部ブラウザ関数呼び出しの命令に'ExternalEvent'というのが ありますので、それを利用してみましょう。実際のLingoコードは以下の様になります。

-- 'gScore'がスコアを格納した変数です。
externalEvent("setScore("& gScore & ")")

もしボタンを押してこのスクリプトを呼び出す場合は

global gScore -- スコア保持しているグローバル変数

on mouseUp me
 externalEvent("setScore("& gScore & ")")
end

のようになります。ただしここで注意が必要なのは'externalEvent'という命令はブラウザのLiveConnectを利用しているため、 MacintoshのIEでは動作いたしませんし、 WinのIEでは'VBScript'をバイパスしてJavaScriptに通さないといけません。 また、Javaがアクティブになっていないといけないため、実のところ環境を選びます。なので僕自身は裏技的になってしまうのですが、 'goToNetPage'を使用しています。

'goToNetPage'は説明するまでもなくURLを指定して移動するための命令です。なのにどうしてJavaScriptの関数呼び出しが可能かというと、 HTMLで言うところの'<a href="javascript:setScore(1000)">'というJavaScript関数呼び出しの方式で記述してやるからなのです。この方式で 上記スクリプトを記述しなおすと

-- 'gScore'がスコアを格納した変数です。
goToNetPage "javascript:setScore("& gScore & ")"

のようになります。この書式だと、OS/ブラウザ関係なく動作するので実のところブラウザスクリプト呼び出し専用命令である 'externalEvent'よりも動作が確実だったりします。これは様々な場面で使えるので、覚えておくと良いでしょう。

長くなりましたが、この「JavaScript側に関数を用意する」方式には若干の問題があります。というのは、JavaScript側の関数が 見えているため、実際のゲームをプレイしなくても'setScore(100000000)'などのようにインチキハイスコア登録なども可能になってしまっているのです。 これを回避するには、つぎの方式が良いでしょう。

2) Director内で全て完結させる。
こちらの方法の方がインチキを防ぐという意味では優れています。また、JavaScriptに不馴れな方などには、こちらの方が慣れたLingoで全ての制御が可能に なってくるのでお勧めです。

上記「1)JavaScript側に関数を用意する」に書きましたが、'goToNetPage "javascript:〜〜〜"'という記述でjavascriptを呼び出すことが 可能です。なので単純に'GRS_score'設定と、'GRS_sendScore()'呼び出しをこの記述で書いてやるのです。

-- 'gScore'がスコアを格納した変数です。
goToNetPage "javascript:GRS_score=" &gScore
goToNetPage "javascript:GRS_sendScore()"

理屈としてはこの記述であっているのですが、しかしこの記述のままですと最初の'goToNetPage'が呼び出されたときに ページ移動動作が発生してしまいます('goToNetPage'の仕様上当然のような気もしますが)。これを防ぐために、全ての記述をJavaScript仕様に してやりましょう。御存じの方もおられるとは思いますが、JavaScriptでの改行は';'で表します。Lingoと違い、実際に改行していなくても";"で繋げて やることでプログラム的には立派に改行されている状態なのです。これを利用してやり、上記二行の命令を

-- 'gScore'がスコアを格納した変数です。
goToNetPage "javascript:GRS_score=" &gScore & ";GRS_sendScore()"

に直してやると、スコアの設定と登録関数呼び出しを行いつつ、ページ移動動作も発生しません。

ただ、こちらの場合で注意することは、ネットワークの不調などで送信モジュールが読み込めなかった場合、javaScriptのエラーではなく、 Lingoのエラーが発生してしまうため、そこでゲームが終了してしまう可能性があるということです。これを防ぐために、HTMLに以下の記述を追加して下さい。 ダミーのJavaScriptで、モジュールがちゃんと読み込まれた場合は上書きされてしまいますが、読み込めない場合にアラートを出します。しかしLingoの エラーではないため、ゲームはそのまま続行可能です。

  <script language = "JavaScript">
   <!--
    var GRS_score;
    function GRS_sendScore(){
     alert("送信モジュールが上手く読み込めなかった様子です。");
    }
   //-->
  </script>

最後に
 長くなりましたが、上で説明した方法は「NewGameWeb」の用意してくれている機能の、一番基本的な「スコア登録」部分だけを実現するのに最低限必要な部分です。実際には、ユーザーの名前などを'setPref'/'getPref'で保持し、デフォルトでその名前が入っているとか、E-MAILの記述は不用にさせるとか、いろいろと高機能なことも実現可能です。ただ、それらを実現するには全て上で説明した方法の応用で可能ですので、頑張って自分なりの方法を見つけて下さい。