• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:*SharedObjectで保存したデータは…*)

SharedObjectで保存したデータは…

このQ&Aのポイント
  • Flashのアドベンチャーゲーム作成中に問題が発生しました
  • MacromediaのHPでは長すぎるswfファイルに注意が必要と書かれています
  • swfファイルの分割とSharedObjectを使ったデータの保存・読み込みの可能性について

質問者が選んだベストアンサー

  • ベストアンサー
noname#35109
noname#35109
回答No.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/jp/flashplayer/7/releasenotes.html 「ファイルの読み込みについて」(loadMobie全般に関しても参考になるかも) http://hakuhin.hp.infoseek.co.jp/main/as/import.html 具体的には,読み込むムービーのフレームに _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; などという相対パスを使って変数を送ることになります。 ごちゃごちゃいらないことを書きましたが, 結局,ロードされるものはロードされるものとして最初から考えて作らないと,結構ややこしいことになるということです。

milk385
質問者

お礼

sassakunさんが記述して下さったスクリプトをコピペしながら、何とか私の考えていた通りにできました(*^∀^*) _rootの直しがちょこっと大変でしたが(笑) 長文での丁寧なご説明、本当にありがとうございます!!

その他の回答 (1)

noname#35109
noname#35109
回答No.1

場合が多すぎるのでうまく説明できないのですが… もし,ゲーム 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 に変数を上げる方が良いと思いますよ。

milk385
質問者

お礼

長文での丁寧な説明、ありがとうございます!(><。 >> でも,普通は,SharedObject は使いませんよ。 まず,ロードするSWFを作って,そこに loadMovie で「前編.swf」をロードし, ゲーム結果などの変数を _root にすべて~~(中略)~~loadMovie させると いちいち unload させる必要もありません。 この方法に目からウロコが落ちるかの如く納得させられました(笑)確かにこの方がスムーズですよね(^^; さっそく試させて頂きましたところ、、、新たな問題がΣ(◎△◎;)!!! _root⇔前編.swfの変数の受け渡し方法が解らないのです;;; _rootの「player_name」という変数の中身を前編.swfの「chara」という変数に入れたいと思い、前編.swfに _root.player_name = chara; と書いてcharaを表示させてみたところ「undefined」になってしまいました;;;;; もしやとても初歩的なことを訊いているのかもしれませんが、_root⇔前編.swfでの変数の受け渡し方法を教えて頂けませんでしょうか(>△<; 本当に申し訳ないのですが、お願い致します!!;;;

関連するQ&A