• ベストアンサー
※ 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

  • SharedObjectの使い方(長文です)

    制作しているゲームに、セーブ機能を付けようと 下記サイトの、テキストセーブflaや 他のサイトを参考にしましたがうまく作動しません http://mamnag.org/prmx/flash/sharedobject.html 長文で申し訳ないです どなたか分かる方教えてください(_) 環境は、FLASH CS3 アクションスプリクト2.0です ■ゲームのオープニング画面に『スタート』と『ロード』ボタン、 ゲーム内に『セーブ』ボタンを置いて、下記のASを書きました ◆スタートボタン(インスタンス名は、startbtm) on(release){ var so = SharedObject.getLocal("my_data"); if(so){ so.clear(); } nextScene();} //次のシーン(ゲーム内容へ飛ぶ) ◆ロードボタン(インスタンス名は、lordbtm) on(release){ SharedObjLoad(); } ◆セーブボタン(インスタンス名は、savebtm) on(release){ _root.saveData(); } ■フレームアクションスプリクト(1) --------------------------------------------------------- //SharedObjectインスタンスの生成 SO_instance = SharedObject.getLocal("mydata"); //保存用サンプルデータを作成 var arrayData = new Array("aaa","bbb","ccc","ddd","eee"); var stringData= "日本語文字列";//この日本語もUTF8で保存されます。 //データを保存(変数を代入していますが、直接リテラルを入力することも可能です) SO_instance.data.savebtm = arrayData; SO_instance.data.savebtm = stringData; //保存したデータの呼び出し。(出力ウインドウで確認してください) trace("SO_instance.data.savebtm : "+SO_instance.data.savebtm); trace("SO_instance.data.lordbtm : "+SO_instance.data.lordbtm); --------------------------------------------------------- ■フレームアクションスプリクト(2) --------------------------------------------------------- //SharedObjectインスタンスの生成 mySharedObject = SharedObject.getLocal("●●.swf"); //ホストのルートに保存する場合:mySharedObject = SharedObject.getLocal("●●.swf"); //保存したデータの呼び出し _root.lord = mySharedObject.data.lordbtmD; //saveボタンが押されたときにテキストフィールドの変数を保存 function saveData(){ mySharedObject.data.savebtmD = _root.savebtm; } --------------------------------------------------------- サンプルflaに、フレームASが二つあったので そのまま使いましたが、これでいいのでしょうか?? 出力には SO_instance.data.savebtm : 日本語文字列 SO_instance.data.lordbtm : aaa,bbb,ccc,ddd,eee という文字がでました

  • SharedObjectが効かない

    FLASHで、一定時間内にアクセスするとオープニングを飛ばすスクリプ トを書いています。Javascriptのクッキーと同じスクリプトの「SharedObject」を使用しています。 www.hfm-kenchan.com/Lesson/log_qa/D0512073.htm こちらのサイトの解説とサンプルを使用させてもらい、作ってみました が、ページを更新しても1フレーム目からのアニメーションが始まって しまい、スクリプトが効いてません。 現在作っているファイルのアニメーションが25fps、171フレームまであるのが原因だと思いますが。 変数に入っている数字などを変えてみましたが、効きません。 同じサンプルでもレイヤー数がスクリプト用のレイヤーと合わせても3 レイヤー、フレーム数11フレームで作ると効きます。 スクリプトのレイヤーにさらに別のスクリプトを書き加えてやる必要があるのかと思いますが、スクリプト素人である為判りません。 どなたか判る方いらっしゃるでしょうか。お教え下さい。 1フレーム目に入るスクリプトを書いておきます。 span = 15; nowDate = new Date(); nowAC = nowDate.getTime(); cookie = SharedObject.getLocal("accessTime"); if (cookie.data.beforeAC != undefined) { Time = Math.floor((nowAC-cookie.data.beforeAC)/1000); cookie.data.beforeAC = nowAC; if (Time < span) { this.gotoAndStop("menu"); } } else { cookie.data.beforeAC = nowAC; } 使用ソフトはFLASH8、環境はWDXPです。どなたかお助け下さい。

  • SharedObjectのディレクトリ(フォルダ)名について。

    こんにちは、はじめて質問をさせていただきます。 今、FlashのSharedObjectをサンプルで作成しています。 作成自体はうまくいき、サーバーにアップしました。 一つ質問なのですが、SharedObjectが保存されるディレクトリ(フォルダ)の名前はFlashでSharedObjectを作成する際に指定することはできないのでしょうか? 今、私はロリポップサーバーにアップしているので、保存されているフォルダの名前が「sunnyday.jp」という名前になっています。 このフォルダ名を変更する方法が分かる方がいらっしゃいましたら教えてください。お願いいたします。 http://kouchanvv.sunnyday.jp/sharedobject/sharedobject_vercs3.swf サーバーに上げたデータはこれです。 テキストフォームに入力し、SAVEを押すとSharedObject(.sol)が作成されるようになっています。

  • Flash で、サウンドを停止させたいです。

    Flash で、サウンドを停止させたいです。 Flash でアドベンチャーゲームを作っています。 SharedObjectを使って、セーブ&ロード機能をつけました。 (環境) Flash バージョン - Adobe Flash CS4 ActionScript - ActionScript 1.0 & 2.0 画像にあるように、880フレーム目からBGMを再生されるようになっています。 900フレームで停止し、メニュー画面になります。 ここにロードボタンがあり、押すと以前セーブしたフレームにジャンプします。 その際に、880フレーム目に配置したBGMが流れっぱなしになってしまいます。 ボタンを押したと同時に、このBGMを停止するにはどうしたらよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • PSP の セーブデータのことで これって聞いちゃダメ?

    エーと とあるサイトから PSPのセーブデータ をダウンロードして 移そうと思ったのですが そのゲームの データ できる数は3つあるんですけど 1つ空いているので どうすればそこに うつすことができますか? ちなみに セーブデータのファイルに 移そうとすると 上書きしますかと でるので たぶんデータが 消えてしまうと思います ちなみにゲームは  モンスターハンターの2です

  • ワードの印刷でこんなのどうするの?

    ワードの1ファイルに4枚のデーターがあります。ver2000 それどれ、上から順番に1、2、1、2のようにページ番号が付されています。 質問1 後編の1、2、のみを印刷したいのですがページの指定で1-2としてすると4枚が排出されます。 後編の1、2、を印刷するにはどのようにしてすればいいのですか? 質問2 前編の1、2、のページ番号を消すにはどうすればいいのでしょうか? 詳しい方宜しくお願いします。

  • Flashゲームのセーブ機能の作り方

    こんにちは。 今、Flash8を使ってアドベンチャーゲームを作っています。 ゲームの内容が長めなので、ゲーム内の1日ごとにセーブポイントを設けようかと思っているのですが、調べてみてもいまいちよくわからなくて困っています。SharedObjectを使うのはわかったんですが・・・ 1、「セーブする」ボタンで現在のタイムライン位置と、変数とその値を保存する。 2、「続きから」ボタンで保存した変数とその値を呼び出し、前回セーブしたところへジャンプする。 アクションスクリプトに詳しい方ご回答よろしくお願いします。 現在使用してるOSはWindowsXPです。

    • ベストアンサー
    • Flash
  • プレステ等のデータの保存方式

    ゲーム機器のデータの保存方法って、公開されている のでしょうか? 有料なんでしょうか?無料で申告方式なんでしょうか? たとえば、ゲームを作成して、データをセーブします よね?その時開発メーカーは、どうやってセーブする 方式を決めるのでしょうか? 私は、PerlとPHPしか分かりませんが、ファイルの 書き込み方法は統一されてますよね。 ゲーム機器では、その統一された情報はどこから、 入手するのでしょうか? その方法さえ分かれば、自作のDVDでも書き込める物 なんでしょうか?

  • PSPのデータの入れ方について

    PSPをUSBケーブルでPCに繋ぎ、友人から送って貰った セーブデータやPCにバックアップさせておいた自分のセーブデータを PSPファイルの中のセーブデータファイルに移すと【破損データ】 になってしまいます。 ファイルはシステムファイルとSFOファイルの二つです。 このファイル自体は破損してはいないはずなんですが原因わかりますか? ちなみに今現在プレイしてるゲームのセーブデータを一旦PC上に送り またすぐにファイルの中に戻しても【破損データ】となって しまいます。データ転送の方法間違ってるんでしょうか?

  • FLASH(プロジェクタEXE)でのデータ保存

    突然ですが、 FLASHでローカルにデータを保存する良い方法は ありますか? ネットでCGI/ASP/PHPなどを経由(データ送信)したり ブラウザのクッキーを利用する方法は思いつくのですが 今回は、SWFではなくWindowsプロジェクタのEXEの状態で データ保存したいです。 Exchange!?(Extension!?)などを利用しても良いので、 良い方法をご存知の方がいらっしゃれば ご教授お願いいたします。 あと、XMLでメモリ上でノードを追加したり できるようですが、あれって、 *.xmlを更新保存する事ってできるのでしょうか? 重ねて、教えていただけると有難いです。 目的は、自作ゲームのセーブデータを保管するためです。 質問ばかりですが、どなたかお返事をお待ちしております。 よろしくお願いいたします。

    • ベストアンサー
    • Flash