- 締切済み
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 という文字がでました
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1 です。 > 「スタート」をクリックするとゲームの始めから、 > 「ロード」をクリックすると前にセーブした状態から、プレイ出来るというものです そこをどうすれば,そうなるようにさせるのかを考えなければならないでしょう? SharedObject 以前の問題です。 たとえば「あ」というデータを保存したら, どうやって「あ」からプレイさせるのでしょうか? 「あ」の状態なんて私には(musasabi00さんにも)わからないと思います。 「あ」ではなく「2008」でも同じです。 つまり, 「状態をセーブさせる方法」と, 「セーブしたものから状態を復元するしくみ」をまず作らないと, SharedObject に何かをセーブしても何にも動作しないでしょう。 SharedObject 以前にそこを考えて,具体的にどうしたいのかを書かないと誰もわかりません。 SharedObject は,単に「あ」や「2008」などのデータを残すだけのものです。
- BlurFiltan
- ベストアンサー率91% (1611/1754)
何かをしようという熱意は伝わりますが..., > うまく作動しません というのは単なる 『自分自身の思い描いた理想状態とずれている』 という主観です。 『自分自身の思い描いた理想状態』 が私にはわかりませんから,回答のしようがありません。 またサンプルを無茶苦茶に壊しても動くはずはありません。 というわけで, 何をどうすれば良いのかなど回答はできませんが,方向性であれば回答できます。 サンプル(sharedobject.fla)で必要なのは, 「Action」レイヤーの ActionScript と, 「レイヤー 3」レイヤーの 「str」 というインスタンス名のテキストフィールドと, 「レイヤー 3」レイヤーの 「SAVE」 と書かれたインスタンス名なしのボタンのみです。 つまり, 「Sample」レイヤーは単なる説明ですから削除してかまいません(削除した方が良いです)。 結局,1フレーム2レイヤーで,階層構造は次のようになります。 _root(フレーム1 にActionScript) ├ ダイナミックテキスト:インスタンス名「str」 └ ボタン:インスタンス名 なし この状態で「制御」→「ムービープレビュー」し, ダイナミックテキストのテキストフィールドに何か(例えば「あいうえお」)を記入して, 「SAVE」ボタンをクリックします。 いったんプレビューを閉じて, 再度プレビューしてみると,前回記入した文字列(「あいうえお」)が表示されます。 つまり, 文字列がセーブされて残るため,そのデータを次回でも使えるということになります。 上の動作をさせる ActionScript はどうなっているのかというと, 「Action」レイヤー の フレーム1 のスクリプト -------------------------------------------- //SharedObjectインスタンスの生成 mySharedObject = SharedObject.getLocal("sample"); //保存したデータの呼び出し _root.str.text = mySharedObject.data.strD; //saveボタンが押されたときにテキストフィールドの変数を保存 function saveData(){ mySharedObject.data.strD = _root.str.text; } --------------------------------------------- と,「SAVE」と書かれた無名のボタンのスクリプト ------------------- on(release){ _root.saveData(); } ------------------- これだけです。 「Action」レイヤー の フレーム1 のスクリプトにもっと詳しい註釈を入れてみます。 -------------------------------------------- // 「mySharedObject」 というインスタンス名の // SharedObjectクラスの インスタンス を生成すると同時に // ローカルの 「sample.sol」 を呼びだす mySharedObject = SharedObject.getLocal("sample"); // 「mySharedObject」 データ内の変数 「strD」 の値を // _root にある 「str」 というインスタンス名のテキストフィールドに // 表示させる _root.str.text = mySharedObject.data.strD; // 『テキストフィールドに記入された文字列を // SharedObjectに保存する』 という動作をする // ユーザ定義関数 「saveData」 を定義 // (このユーザ定義関数は後にボタンから実行される) function saveData(){ // 「mySharedObject」 データ内の変数 「strD」 に // テキストフィールド 「str」 の文字列を代入 mySharedObject.data.strD = _root.str.text; } --------------------------------------------- 「SAVE」と書かれた無名のボタンのスクリプトにも註釈を入れてみます。 ------------------- // このボタンをクリックしたとき on(release){ // _root に定義したユーザ定義関数 「saveData」を実行 _root.saveData(); } ------------------- これを理解して,どう動くのかをちゃんとイメージ的にとらえて, 作成したいものに使用して行けば良いのです。 以上が方向性です。 ===補足================= この回答の冒頭に, > またサンプルを無茶苦茶に壊しても動くはずはありません。 と書いた点について補足します。 > (◆スタートボタン(インスタンス名は、startbtm)) > (◆ロードボタン(インスタンス名は、lordbtm)) > ◆セーブボタン(インスタンス名は、savebtm) ボタンのインスタンス名と変数名を同じにしてはいけません。 もしうまく動作しても偶然です。 またボタンのインスタンス名と変数名を同じにしたら, PCが迷うどころか人間が迷ってさっぱりわけがわからなくなります。 > ◆スタートボタン(インスタンス名は、startbtm) > on(release){ > var so = SharedObject.getLocal("my_data"); > if(so){ if文の存在理由がわかりません。 var so = SharedObject.getLocal("my_data"); これで so は存在するわけですから, どんな状況であっても if(so){ } の { }内は実行されます。 分岐する意味がありません。 > ◆ロードボタン(インスタンス名は、lordbtm) > on(release){ > SharedObjLoad(); > } SharedObjLoad(); とはいったい何でしょうか。 意味的には, 『ユーザ定義関数 「SharedObjLoad」 を実行』 のような意味にはなりますが, 「SharedObjLoad」 という関数はどこにも定義されていないように見えるので, 何なのかわかりません。 > //SharedObjectインスタンスの生成 > mySharedObject = SharedObject.getLocal("●●.swf"); > > //ホストのルートに保存する場合:mySharedObject = SharedObject.getLocal("●●.swf"); どこにもそんな変なことは書いていないでしょう。 サンプルには, > //ホストのルートに保存する場合:mySharedObject = SharedObject.getLocal("sample","/"); と書いてあります。 これは, .sol ファイルを, ルート(ドメインの直下)にあるように保存して, 複数の SWF から .sol ファイルを共有する場合は, getLocal("sample","/"); のように, getLocal() メソッドの第2引数に ルートを示す "/" を入れてください。 ということを意味しています。 getLocal("●●.swf"); では, 第2引数もない上,なぜか SWF ファイル名を指定しています。 .sol ファイルについてやその他詳細は, ご質問で書いていらっしゃるURLのページに書かれています。 > 出力には > SO_instance.data.savebtm : 日本語文字列 > SO_instance.data.lordbtm : aaa,bbb,ccc,ddd,eee > という文字がでました ご質問で書いていらっしゃるスクリプトではでませんよ。 > //データを保存(変数を代入していますが、直接リテラルを入力することも可能です) > SO_instance.data.savebtm = arrayData; > SO_instance.data.savebtm = stringData; ↓変更↓ > //データを保存(変数を代入していますが、直接リテラルを入力することも可能です) > SO_instance.data.lordbtm = arrayData; //←★変更 > SO_instance.data.savebtm = stringData; 少なくともこうしないと書かれていらっしゃるような出力結果にはなりません。 とにかく, 全体的に無茶苦茶すぎますから, とりあえずは,この回答の ===補足=== 以下の件は置いておいた方が良いでしょう。 何かをしようとされている熱意だけは十分は伝わりますから書きにくいことですが, つまり, 書き替えたり,付け加えて作成したりした部分は,全削除のようにすっかり忘れ去った方が良いです。 そして ===補足=== より上のことを理解して それを礎にどうすれば良いのかを考えて応用していくのが良いと思います。 理解なしで応用はできませんよ。 ===さらに補足(どうでも良いこと)============= SharedObject を ActionScript2.0 以下で使う場合, 文法が尋常ではありません。 普通に考えると(他のActionScript2.0 や 1.0 と同様の形式にすると), -------------------------------------------- //SharedObjectインスタンスの生成 mySharedObject = SharedObject.getLocal("sample"); //保存したデータの呼び出し _root.str.text = mySharedObject.data.strD; -------------------------------------------- この部分は, 次のようになるはずです。 -------------------------------------------- // SharedObjectインスタンス mySharedObject の生成 var mySharedObject:SharedObject = new SharedObject(); // mySharedObject に sample を取得 mySharedObject.getLocal("sample"); //保存したデータの呼び出し _root.str.text = mySharedObject.data.strD; -------------------------------------------- ところがこれではダメなのです。 こういう矛盾を含むスクリプトだからわかりにくいのかもしれません。 ActionScript2.0は (1.0も),けっこう歪(イビツ)です。 この件に限らず 多くの人は ActionScript2.0 以下の歪さをわかっているのですが, 「まぁそれはそれ」というところで多めに見ているのが現状です(現状でした)。
補足
お世話になります 伝いない文章にお付き合いいただけて 本当に感謝いたします。。! 基本的な事が分からないままいじってましたが 仕組みが少しずつ。。理解できてきました 制作したいのは、プレイする人が、ゲームの途中で「セーブ」ボタンを押すと 次にゲーム表示した時に、オープニング画面で 「スタート」ボタンと「ロード」ボタンを選べるようになっていて、 「スタート」をクリックするとゲームの始めから、 「ロード」をクリックすると前にセーブした状態から、プレイ出来るというものです ダイナミックテキストを保存するのではなく、 『ゲームをどこまでプレイしたか』を保存させたい場合、 フレームASは下記の _root.str.textではなく、どう書けばいいのでしょうか? 手探り状態のままですが。。。ASを変更してみました ◆フレームアクションスプリクト ---------------------------------------------------------- //SharedObjectインスタンスの生成 mySharedObject = SharedObject.getLocal("sample"); //ホストのルートに保存する場合:mySharedObject = SharedObject.getLocal("sample"); //保存したデータの呼び出し _root.str = mySharedObject.data.strD; //セーブボタンが押されたときにテキストフィールドの変数を保存 function saveData(){ mySharedObject.data.strD = _root.str; } //SharedObjLoadインスタンスの生成 function SharedObjLoad() { // 共有オブジェクトを作成 _root.so = SharedObject.getLocal("sample"); ---------------------------------------------------------- ◆スタート(インスタンス名なし) -------------------------------------- on(release){ //次のシーン(ゲーム内容)へ飛ぶ nextScene(); } -------------------------------------- ◆セーブ(インスタンス名なし) -------------------------------------- // このボタンをクリックしたとき on(release){ // _root に定義したユーザ定義関数 「saveData」を実行 _root.saveData(); } -------------------------------------- ◆ロード(インスタンス名なし) -------------------------------------- on(release){ SharedObjLoad(); } -------------------------------------- フレームアクションスプリクトの 『「SharedObjLoad」の関数を定義』は ↓のサイト、『save_00_fla06_as1.fla』というファイルを参考にしました http://hakuhin.hp.infoseek.co.jp/main/as/save.html SharedObjectインスタンスの生成と同じ、 "sample"という言葉を使ってもいいのでしょうか。。 あと、関係があるか分かりませんが、 ・ゲームのオープニングは、シーン1 ・ゲーム内容は、シーン2 に分けています どうぞよろしくお願いいたします(_)
お礼
回答ありがとうございます セーブ保存して、ロードする仕組みはまた違うのですね 他のゲームサイトさんが セーブ機能をつけていらっしゃるので どうしてもわからない場合は 直接教えて頂くのも手かな。。?と思います 基本をしっかり勉強して、もう少し調べてみます 度々お付き合い頂き、ありがとうございました><