電子書籍の厳選無料作品が豊富!

いつもお世話になっております。
早速質問させていただきます(><;

いまFlashでアドベンチャーゲームを作って居りまして、その内容がとても長くなってしまい、
シンボル数やフレーム数がとんでもないことになってしまいました。
MacromediaさんのHPの方でも「あまりに長すぎるswfファイルは誤作動を起こしかねない」と云うようなことが書かれており、少し怖くなったので、ゲームのswfファイルを[前編・後編]2つに分けました。
そこで質問なのですが、例えば前編のswfファイルでセーブデータ(プレイヤーに入力させた数値など)をSharedObjectで保存し、そのデータを後編のswfファイルで読み込むこと、というのは可能なのでしょうか?

解りにくい質問文で恐縮ですが、何卒ご教授お願いします;;;

A 回答 (2件)

#1です。


書かれているそれだけを見るならスクリプトは合っています。
そんなに深く考えるものでもなく,
1つのムービークリップから _root に変数を置く感覚で良いのですよ。
chara に何か値が入った後に
_root.player_name = chara;
で _root の player_name に変数を送っていればうまく行きます。


~うまく行く例~

a.swf に chara という変数名の テキスト入力のテキストフィールドを用意しておいて,
そのテキストフィールドに例えば abcd と"Flashの作成段階"で書いておきます。

その a.swf を読み込む方には
loadMC というインスタンス名のムービークリップと
player_name という変数名のテキストフィールドを用意しておいて,
フレームに

_root.loadMC.loadMovie("a.swf");

と書いて, a.swf を loadMC に読み込むと,
abcd という値が player_name という変数名のテキストフィールドにちゃんと入ります。
読み込むSWFを a.swf より大きくしておいて 角の方に player_name という変数名のテキストフィールドを置くか,
loadMC というインスタンス名のムービークリップより上のレイヤーに
player_name という変数名のテキストフィールドを置くと,
そのテキストフィールドが見えますよね。


~うまく行かない例~

上記うまく行く例の a.swf にある テキストフィールド chara の内容を
abcd から efgh に書きかえると当然,
_root の player_name という変数名のテキストフィールドは変更されず,
abcd のままです。

当たり前ですよね。
_root.player_name = chara;
は a.swf を読み込んだときにしか実行されませんから。

その場合, a.swf に

on (release) {
_root.player_name = chara;
}

と書いたボタンを用意しておいて,
abcd から efgh に書きかえたあとにこのボタンをクリックすれば,
_root の player_name も変更されます。

または,
読み込むSWF側に

on (release) {
player_name = _root.loadMC.chara;
}

と書いたボタンを用意しておいて,
abcd から efgh に書きかえたあとにこのボタンをクリックすれば,
_root の player_name も変更されます。

単にそれだけのことですよ。

=============================================

ただ,今まで作られていたゲームのSWFに _root というパスが使われていた場合,
そのゲームをちがうSWFに読み込むと,
そのゲームに書いてある _root は読み込むSWFの _root になってしまうので,その辺の変更の方が大変かもしれません。
もし大変であれば,

_lockroot=true;

を使って,
_root をロックする方法も考えられます。
「Macromedia Flash Player 7 リリースノート」
http://www.macromedia.com/support/documentation/ …
「ファイルの読み込みについて」(loadMobie全般に関しても参考になるかも)
http://hakuhin.hp.infoseek.co.jp/main/as/import. …

具体的には,読み込むムービーのフレームに

_root.loadMC._lockroot=true;
_root.loadMC.loadMovie("a.swf");

と書くと言うことです。
これで,a.swf (ゲームの前編) に _root が使われていたとしても,
その _root は a.swf の _root を指したままになるので, _root が変わることはありません。

しかし!
これを使った場合,
_root.player_name = chara;
も効かなくなるので,ここを
_parent.player_name = chara;
などという相対パスを使って変数を送ることになります。


ごちゃごちゃいらないことを書きましたが,
結局,ロードされるものはロードされるものとして最初から考えて作らないと,結構ややこしいことになるということです。
    • good
    • 0
この回答へのお礼

sassakunさんが記述して下さったスクリプトをコピペしながら、何とか私の考えていた通りにできました(*^∀^*)
_rootの直しがちょこっと大変でしたが(笑)

長文での丁寧なご説明、本当にありがとうございます!!

お礼日時:2005/10/16 16:22

場合が多すぎるのでうまく説明できないのですが…


もし,ゲーム a.swf , b.swf のアドレスが,

http://○○/Share/a.swf
http://○○/Share/b.swf

であった場合,a.swf のボタンに

on (release) {
point_set = SharedObject.getLocal("mySol","/Share");
point_set.data.point_a = 5;
}

と書いて,そのボタンをクリックすれば,
ローカルの 「Share」 フォルダに,「mySol.sol」 というSOLファイルができ,
その中の point_a という変数に 5 という値が入ります。

b.swf のボタンに

on (release) {
point_get = SharedObject.getLocal("mySol","/Share");
if (point_get.data.point_a != undefind) {
point_a = point_get.data.point_a;
//もしsolファイルにphoto_countがなければ
} else {
point_a = 0;
}
}

と書いて,そのボタンをクリックすれば,
a.swf と同じ,ローカルの 「Share」 フォルダの,「mySol.sol」 というSOLファイルを参照し,
もしそこの変数 point_a に何か値が入っていれば, b.swf の point_a にはその保存された値が入り,
もし point_a に何も値が入っていなけば, b.swf の point_a には 0 という値が入ります。
UPしたものは trace(); では実験できませんし,ローカルでも実験しにくいので,
_root に point_a という変数名のテキストフィールドを用意しておくとわかりやすいです。

SharedObject.getLocal("mySol","/Share");

の部分がポイントです。
a.swf に

SharedObject.getLocal("mySol");

と書いただけでは,
ローカルの 「Share」 フォルダの中に,「 a.swf 」 というフォルダができ,
その中に「mySol.sol」というSOLファイルができるので共有できません。
"/Share" など,パスを付け加えることによって初めて共有できます。

パスが "/" のときは,サーバの直下に 「mySol.sol」 ができます。
これを参照しても良いです。
"/Share" などは,勝手に決められるわけではなく,実際に a.swf が 「Share」というフォルダ内にあれば,そこにsolを作成できます。

以上のことは,loadMovie でしても同じです。
ロードする側のムービーはどうでも良くて,結局ロードされた a.swf などのアドレスによって,solファイルができます。

参考になるHPが少ないですね。
概念的なことしか書いていないサイトが多いです。
ややこしいようですが,スクリプトは大したことありませんし,高度な数学を使うようなものでもないです。
まずは,動くサンプルを作られて,色々実験してみれば,すぐに使えるようにはなると思います。


ちょっと,気になったのですが。

>> ゲームのswfファイルを[前編・後編]2つに分けました。

と書かれていますが,大きなファイルになってくると,実際にはそのようにファイルを分けます。
でも,普通は,SharedObject は使いませんよ。

まず,ロードするSWFを作って,そこに loadMovie で「前編.swf」をロードし,ゲーム結果などの変数を _root にすべて上げておきます。
次に同じSWFに「後編.swf」をロードし, _root から変数を受け取ってその変数によって動作させます。
loadMovie だと,画面の切り替えもスムーズに行きますし,同じMCなどに loadMovie させるといちいち unload させる必要もありません。

getURL で「前編.swf」から「後編.swf」に移る場合は,他の物を経由する必要が出てきます。
その場合,JavaScript経由などで変数を渡すよりは
SharedObject を経由した方が簡単で確かなので SharedObject の使用も考えられます。

でも getURL だとページ全体が入れ替わるのでギクシャクしますよ。
loadMovie で _root に変数を上げる方が良いと思いますよ。
    • good
    • 0
この回答へのお礼

長文での丁寧な説明、ありがとうございます!(><。

>> でも,普通は,SharedObject は使いませんよ。
まず,ロードするSWFを作って,そこに loadMovie で「前編.swf」をロードし,
ゲーム結果などの変数を _root にすべて~~(中略)~~loadMovie させると
いちいち unload させる必要もありません。

この方法に目からウロコが落ちるかの如く納得させられました(笑)確かにこの方がスムーズですよね(^^;

さっそく試させて頂きましたところ、、、新たな問題がΣ(◎△◎;)!!!

_root⇔前編.swfの変数の受け渡し方法が解らないのです;;;
_rootの「player_name」という変数の中身を前編.swfの「chara」という変数に入れたいと思い、前編.swfに

_root.player_name = chara;

と書いてcharaを表示させてみたところ「undefined」になってしまいました;;;;;

もしやとても初歩的なことを訊いているのかもしれませんが、_root⇔前編.swfでの変数の受け渡し方法を教えて頂けませんでしょうか(>△<;
本当に申し訳ないのですが、お願い致します!!;;;

お礼日時:2005/10/09 02:37

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