アプリ版:「スタンプのみでお礼する」機能のリリースについて

私は、Flashをでゲームをつくり、WEBブラウザに埋め込んでInternet Explorerで公開したいのですが、
このとき重複起動を禁止したいと考えています。
どうすればいいのでしょうか?
一番いいのはVBSかJavaScriptを使用することなのですが、
VBやVBアプリなどは、具体例が結構あるのですが、VBSに関しては見つけることができませんでした。
誰かよろしくお願いします。

A 回答 (1件)

かなり,


一般的なサイト(いわゆるWebの常識)と方向性がずれているご質問だと思いますよ。

本当に 「ブラウザの重複起動の禁止」 をするのでしたら,
それは ウィルス や クラッカー のすることです。
質問者さまが,ウィルス作成者やクラッカーだとは思っていませんが,
実際に書いていることを実現すればそういうことになります。

また
「ブラウザの重複起動の禁止」 を本当にするとして,
すでにブラウザが複数起動状態であって,
そのうち1つが,Flashゲーム のページを表示した場合はどうするのでしょうか?
Flashゲーム のページを表示中のブラウザのみ残して,
あとは強制終了させるのですか?
そんなことして下手をしたら損害賠償問題になる可能性もありますよ。
大切なデータを作成中に,
たまたま Flashゲーム のページを開いてしまったばかりに,
入力中の長大なデータが消える可能性もあります。


「ブラウザの重複起動の禁止」 ではなくて,
Flashゲーム の
「ページの重複閲覧禁止」 ならまだわかります。
以下は,
その 「ページの重複閲覧禁止」 としての回答です。


> 一番いいのはVBSかJavaScriptを使用すること
    … 略 …
>VBSに関しては見つけることができませんでした。

それは,当たり前のような話ですよ。
そもそも質問者さまが書かれている VBS というのは,
Windows サーバで動く ASP に使用する VBS のことではなくて,
クライアントサイドで実行される,ブラウザ用の VBS のことでしょう?

ASP の VBS なら意味がわかりますが,
ブラウザのクライアントサイド言語における VBS や,
WSH における VBS なんてものは,
普通は Web 上で使う物ではありません。

そういう VBS は,
Windows + IE でしか使えませんし,
Windows + IE でも危険すぎてほとんどの場合ブラウザがシャットアウトします。
Webで配布される,何某かの DL ソフトあれば使うことあると思いますが。


一般的には,
ASP や CGI や PHP など,
サーバー上 で動くプログラムで,重複アクセスを禁止する方法を使うでしょう。
または,
クライアントサイド のプログラムであれば,
JavaScript の Cookie を使って何か動作させるでしょう。

しかし,
せっかく Flash という,JavaScript より汎用性の高い物をお使いなのですから,
他言語ではなく,最初から ActionScript で解決すれば良いのではないでしょうか?
以下は,
勝手に Adobe Flash MX 以上 でFlashゲームを作成した場合として回答します。

Flash を見ている人の全てが JavaScript を有効にしているわけではありません。
したがって,
JavaScript の Cookie を使っても,それを素通りしてしまうユーザーが多数出るでしょう。
(VBSなどは当然論外です。)

最初に,
「一般的なサイトと方向性がずれていると思います」
と書いたのはそういうことです。
「ブラウザの重複起動の禁止」 は当然ずれ過ぎていますが,
「ページの重複閲覧禁止」 であっても,なぜそこに VBS が登場するのでしょうか。
変な方向を見ないで,まず足下の ActionScript を見直せば良いのでしょう。

「SharedObject.getLocal」
http://www.fumiononaka.com/TechNotes/Flash/FN020 …

「SharedObject.flush」
http://www.fumiononaka.com/TechNotes/Flash/FN020 …

この辺りの,SharedObject を使えばできます。



極々簡単なサンプル例を示します。
上にも書きましたが,
勝手に Adobe Flash MX 以上 でFlashゲームを作成された場合の回答です。

まず,
2レイヤー で 20フレーム の 新規ドキュメント を作成し,
任意の名前で任意の場所に保存します。

下のレイヤーの フレーム2 ~ フレーム20 で何かを(○でも)動かします。

このままパブリッシュすると,
勝手にループ再生するアニメーションができてしまうだけなので,
上のフレームの フレーム20 (最終フレーム)を 空白キーフレーム にします。

             1             20
 □ レイヤー 筆・・|○            []|○
 □ レイヤー 筆・・|○|●>---------->[]|●|
               ↑何かをトゥイーンさせる

この,
上フレームの空白キーフレームにスクリプトを書いて行きます。

まず,フレーム1 のスクリプト(コピペ可)
----------------------------
// 右クリックメニューの非表示
Stage.showMenu = false;
// とりあえず ストップ
this.stop();
//
// SharedObjectの読込み
sObj = SharedObject.getLocal("myData");
//
// SharedObject の 変数 flag が無いか,0 の時のみ
if (sObj.data.flag == undefined || sObj.data.flag == 0) {
// SharedObject の 変数 flag を 1 に
sObj.data.flag = 1;
// 即 SharedObject の更新保存
sObj.flush();
// SharedObject の 変数 flag を 0 に
sObj.data.flag = 0;
// そして 再生開始
this.play();
}
---------------------------


そして フレーム20 のスクリプト(コピペ可)
---------------------------
// フレーム2 に戻って再生
this.gotoAndPlay(2);
---------------------------


そして SWF と HTML をパブリッシュ。


パブリッシュされた HTML をブラウザ(IE)で開くと,
普通にアニメーションがループ再生すると思いますが,
その HTML を重複して見ようと 2つIE で開いても,
2つ目以降,再生は開始しません。

※OS の仕様などにより,
ローカルにある同じ HTML を重複して開けない場合は,
まず1回目に,作成した HTML をダブルクリックで開いて,
2回目以降は「e」アイコンなどで普通に IE を起動させて,
1回目に開いた HTML の URL 欄を
2回目以降に起動した IE のURL欄にコピペすれば,
二重にも三重にも同じ HTML を見ることができます。


~ ~ ~上記スクリプトの簡単な解説~~ ~

フレーム1 のスクリプト冒頭に,
 Stage.showMenu = false;
と書いていますが,これを書いておかないと,
Flash の右クリックで 「再生」 をされる可能性があります。
そのために書いています。
「メニューを非表示にする(FlashMX) 」
http://hakuhin.hp.infoseek.co.jp/main/as/menu.ht …

フレーム1 の if文 の中には,
  // SharedObject の 変数 flag を 1 に
  sObj.data.flag = 1;
  // 即 SharedObject の更新保存
  sObj.flush();
がありますが,
この flush(); を書いておくと,
すぐにローカルの solファイル(上の場合「myData.sol」) が書き替わるので,
2回目,3回目と重複で開いた場合は,
solファイル 内の flag は 1 になり,stop したままになります。

次に
  // SharedObject の 変数 flag を 0 に
  sObj.data.flag = 0;
がありますが,
こちらには flush(); を付けていません。
付けない場合が普通のデフォルト状態です。
この付けないデフォルトの場合は,
その SWF が終了するとき(ブラウザを閉じるまたは他のページに行く瞬間)に,
solファイルを更新保存します。
したがって,1つ目に起動した SWF を閉じない限り,
flag は 0 にはならず,flag は 1 のままなので,
重複して再生させようとしても2つ目以降は再生されません。

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~


エンドユーザー(ゲームをする人)が見れば
重複アクセスできないことは不思議で,すごいことにように思うかもしれませんが,
中身は大したことはありません。
1つのどうでも良い変数 flag を用意して,その値を 0 か 1 に切り換えて
ifの 条件分岐をしているだけのことです。

Adobe Flash をお使いで,ゲームを作成するような場合は,
これくらいのしくみは自分で考えられるようにしてください。
SharedObject を知らなければ,当然考えることはできませんけどね。
しかし,SharedObject を知った以上,
これは手に入れた重要な価値のあるアイテムになるものだとわかると思います。
これを機に色々実践してみると良いと思います。



もちろん,
上に書いたことは簡単な例に過ぎません。
フレーム1 も何も置かないのではなくて,
2フレームあるムービークリップ を置いて,
その 2フレームあるムービークリップ の フレーム2 に,
 this.stop();
というスクリプトと,
 「多重アクセスでは動作しません!」
などという表示を書いておいても良いですね。
また,this.stop(); を書くのではなく,
 getURL("他のページ");
で他のページにハネても良いです。
その辺は自由です。


とにかく,
SWF の フレーム1 は犠牲にして SharedObject 関連のスクリプトを書いておき,
フレーム2 以降に Flashゲーム の本編を置いて置けば良いのではないでしょうかという例です。

その他,
SharedObject や ローカルに保存されるファイルについて調べたい場合は,
次のように検索して,研究してみてください。
http://www.google.com/search?hl=ja&q=SharedObjec …

SharedObject は,特にゲーム作りの基礎となり得ます。
普通は上で書いたような変なことにはあまり使いません(使っても良いですが)。
普通は,CGI などを使わない場合の
「ゲームの得点の保存」 や「次のSWFへの得点データの受け渡し」などなど…,
そういう方面で色々応用が利くものとして使います。



もし,
Adobe(Macromedia) Flash や ParaFla! などのように,
ActionScript が使えるソフトではなく,
その他のあまり ActionScript が使えないソフトをお使いでしたら,
SharedObject は使えません。
JavaScript の Cookie を研究してみるか,
JavaScriptカテゴリで, Cookieの保存のタイミングなどを質問されると,
ひょっとしたら良い回答が得られるかもしれません。
ページ閲覧開始と同時に Cookie の参照&保存ができて,
ページ閲覧終了と同時,もしくはゲーム終了と同時に Cookie の保存ができれば,
同じようなことができるはずです。

私は JavaScript が専門ではないので,この辺で…。
    • good
    • 1
この回答へのお礼

回答ありがとうございました。
私の質問はかなり、おかしいものなのですね。
やはり、サイトとかにないのもそのせいなのですね~。

それでも、回答して貰った上に、SharedObject の簡易例も
教えていただき、本当にありがとうございました。
SharedObjectについてもっと勉強したいと思います!

お礼日時:2006/11/29 09:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!